Skip to content

Commit 0c11fed

Browse files
authored
Restore lost lto opts for amdgpu (llvm#1696)
2 parents b2f9794 + ae298d8 commit 0c11fed

File tree

6 files changed

+37
-5
lines changed

6 files changed

+37
-5
lines changed

clang/lib/Driver/ToolChains/Clang.cpp

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9464,6 +9464,28 @@ void LinkerWrapper::ConstructJob(Compilation &C, const JobAction &JA,
94649464
A->render(Args, LinkerArgs);
94659465
}
94669466

9467+
if (isAMDGPU && !C.getDriver().IsFlangMode()) {
9468+
StringRef OOpt;
9469+
if (const Arg *A = Args.getLastArg(options::OPT_O_Group)) {
9470+
if (A->getOption().matches(options::OPT_O4) ||
9471+
A->getOption().matches(options::OPT_Ofast))
9472+
OOpt = "3";
9473+
else if (A->getOption().matches(options::OPT_O)) {
9474+
OOpt = A->getValue();
9475+
if (OOpt == "g")
9476+
OOpt = "1";
9477+
else if (OOpt == "s" || OOpt == "z")
9478+
OOpt = "2";
9479+
} else if (A->getOption().matches(options::OPT_O0))
9480+
OOpt = "0";
9481+
}
9482+
9483+
if (!OOpt.empty() && OOpt != "0") {
9484+
LinkerArgs.push_back(Args.MakeArgString(
9485+
"--lto-newpm-passes=default-post-link<O" + OOpt + ">"));
9486+
}
9487+
}
9488+
94679489
// Forward all of these to the appropriate toolchain.
94689490
for (StringRef Arg : CompilerArgs)
94699491
CmdArgs.push_back(Args.MakeArgString(

llvm/include/llvm/Pass.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,9 @@ enum class ThinOrFullLTOPhase {
8383
/// Full LTO prelink phase.
8484
FullLTOPreLink,
8585
/// Full LTO postlink (backend compile) phase.
86-
FullLTOPostLink
86+
FullLTOPostLink,
87+
/// Custom LTO postlink (e.g. --lto-newpm-passes=...)
88+
CustomLTOPostLink
8789
};
8890

8991
//===----------------------------------------------------------------------===//

llvm/lib/Analysis/InlineAdvisor.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -562,6 +562,7 @@ static inline const char *getLTOPhase(ThinOrFullLTOPhase LTOPhase) {
562562
return "prelink";
563563
case (ThinOrFullLTOPhase::ThinLTOPostLink):
564564
case (ThinOrFullLTOPhase::FullLTOPostLink):
565+
case (ThinOrFullLTOPhase::CustomLTOPostLink):
565566
return "postlink";
566567
}
567568
llvm_unreachable("unreachable");

llvm/lib/Passes/PassBuilder.cpp

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -488,7 +488,8 @@ static cl::opt<bool> DoFunctionSpecialize("function-specialize",
488488
// AOCC end
489489

490490
static const Regex DefaultAliasRegex(
491-
"^(default|thinlto-pre-link|thinlto|lto-pre-link|lto)<(O[0123sz])>$");
491+
"^(default|default-post-link|thinlto-pre-link|thinlto|lto-pre-link|lto)"
492+
"<(O[0123sz])>$");
492493

493494
namespace llvm {
494495
cl::opt<bool> PrintPipelinePasses(
@@ -1920,6 +1921,9 @@ Error PassBuilder::parseModulePass(ModulePassManager &MPM,
19201921

19211922
if (Matches[1] == "default") {
19221923
MPM.addPass(buildPerModuleDefaultPipeline(L));
1924+
} else if (Matches[1] == "default-post-link") {
1925+
MPM.addPass(buildPerModuleDefaultPipeline(
1926+
L, ThinOrFullLTOPhase::CustomLTOPostLink));
19231927
} else if (Matches[1] == "thinlto-pre-link") {
19241928
MPM.addPass(buildThinLTOPreLinkDefaultPipeline(L));
19251929
} else if (Matches[1] == "thinlto") {

llvm/lib/Passes/PassBuilderPipelines.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -414,7 +414,8 @@ static bool isLTOPreLink(ThinOrFullLTOPhase Phase) {
414414
// Helper to check if the current compilation phase is LTO backend
415415
static bool isLTOPostLink(ThinOrFullLTOPhase Phase) {
416416
return Phase == ThinOrFullLTOPhase::ThinLTOPostLink ||
417-
Phase == ThinOrFullLTOPhase::FullLTOPostLink;
417+
Phase == ThinOrFullLTOPhase::FullLTOPostLink ||
418+
Phase == ThinOrFullLTOPhase::CustomLTOPostLink;
418419
}
419420

420421
// Helper to wrap conditionally Coro passes.

llvm/lib/Transforms/IPO/OpenMPOpt.cpp

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5822,7 +5822,8 @@ PreservedAnalyses OpenMPOptPass::run(Module &M, ModuleAnalysisManager &AM) {
58225822

58235823
bool PostLink = LTOPhase == ThinOrFullLTOPhase::FullLTOPostLink ||
58245824
LTOPhase == ThinOrFullLTOPhase::ThinLTOPostLink ||
5825-
LTOPhase == ThinOrFullLTOPhase::ThinLTOPreLink;
5825+
LTOPhase == ThinOrFullLTOPhase::ThinLTOPreLink ||
5826+
LTOPhase == ThinOrFullLTOPhase::CustomLTOPostLink;
58265827
OMPInformationCache InfoCache(M, AG, Allocator, /*CGSCC*/ nullptr, PostLink);
58275828

58285829
unsigned MaxFixpointIterations =
@@ -5900,7 +5901,8 @@ PreservedAnalyses OpenMPOptCGSCCPass::run(LazyCallGraph::SCC &C,
59005901

59015902
bool PostLink = LTOPhase == ThinOrFullLTOPhase::FullLTOPostLink ||
59025903
LTOPhase == ThinOrFullLTOPhase::ThinLTOPostLink ||
5903-
LTOPhase == ThinOrFullLTOPhase::ThinLTOPreLink;
5904+
LTOPhase == ThinOrFullLTOPhase::ThinLTOPreLink ||
5905+
LTOPhase == ThinOrFullLTOPhase::CustomLTOPostLink;
59045906
SetVector<Function *> Functions(llvm::from_range, SCC);
59055907
OMPInformationCache InfoCache(*(Functions.back()->getParent()), AG, Allocator,
59065908
/*CGSCC*/ &Functions, PostLink);

0 commit comments

Comments
 (0)