Skip to content

Commit 56ab85b

Browse files
committed
[PassBuilder] Add LTOPreLink to early simplication EP call backs
The early simplication pipeline is used in non-LTO and (Thin/Full)LTO pre-link stage. There are some passes that we want them in non-LTO mode, but not at LTO pre-link stage. The control is missing currently. This PR adds the support. To demonstrate the use, we only enable the internalization pass in non-LTO mode for AMDGPU because having it run in pre-link stage causes some issues.
1 parent e577f14 commit 56ab85b

File tree

7 files changed

+36
-14
lines changed

7 files changed

+36
-14
lines changed

clang/lib/CodeGen/BackendUtil.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -993,7 +993,7 @@ void EmitAssemblyHelper::RunOptimizationPipeline(
993993
createModuleToFunctionPassAdaptor(ObjCARCExpandPass()));
994994
});
995995
PB.registerPipelineEarlySimplificationEPCallback(
996-
[](ModulePassManager &MPM, OptimizationLevel Level) {
996+
[](ModulePassManager &MPM, OptimizationLevel Level, bool) {
997997
if (Level != OptimizationLevel::O0)
998998
MPM.addPass(ObjCARCAPElimPass());
999999
});

llvm/include/llvm/Passes/PassBuilder.h

+6-3
Original file line numberDiff line numberDiff line change
@@ -478,7 +478,8 @@ class PassBuilder {
478478
/// This extension point allows adding optimization right after passes that do
479479
/// basic simplification of the input IR.
480480
void registerPipelineEarlySimplificationEPCallback(
481-
const std::function<void(ModulePassManager &, OptimizationLevel)> &C) {
481+
const std::function<void(ModulePassManager &, OptimizationLevel, bool)>
482+
&C) {
482483
PipelineEarlySimplificationEPCallbacks.push_back(C);
483484
}
484485

@@ -637,7 +638,8 @@ class PassBuilder {
637638
void invokePipelineStartEPCallbacks(ModulePassManager &MPM,
638639
OptimizationLevel Level);
639640
void invokePipelineEarlySimplificationEPCallbacks(ModulePassManager &MPM,
640-
OptimizationLevel Level);
641+
OptimizationLevel Level,
642+
bool LTOPreLink = false);
641643

642644
static bool checkParametrizedPassName(StringRef Name, StringRef PassName) {
643645
if (!Name.consume_front(PassName))
@@ -762,7 +764,8 @@ class PassBuilder {
762764
FullLinkTimeOptimizationLastEPCallbacks;
763765
SmallVector<std::function<void(ModulePassManager &, OptimizationLevel)>, 2>
764766
PipelineStartEPCallbacks;
765-
SmallVector<std::function<void(ModulePassManager &, OptimizationLevel)>, 2>
767+
SmallVector<std::function<void(ModulePassManager &, OptimizationLevel, bool)>,
768+
2>
766769
PipelineEarlySimplificationEPCallbacks;
767770

768771
SmallVector<std::function<void(ModuleAnalysisManager &)>, 2>

llvm/lib/Passes/PassBuilderPipelines.cpp

+7-4
Original file line numberDiff line numberDiff line change
@@ -384,9 +384,9 @@ void PassBuilder::invokePipelineStartEPCallbacks(ModulePassManager &MPM,
384384
C(MPM, Level);
385385
}
386386
void PassBuilder::invokePipelineEarlySimplificationEPCallbacks(
387-
ModulePassManager &MPM, OptimizationLevel Level) {
387+
ModulePassManager &MPM, OptimizationLevel Level, bool LTOPreLink) {
388388
for (auto &C : PipelineEarlySimplificationEPCallbacks)
389-
C(MPM, Level);
389+
C(MPM, Level, LTOPreLink);
390390
}
391391

392392
// Helper to add AnnotationRemarksPass.
@@ -1140,7 +1140,10 @@ PassBuilder::buildModuleSimplificationPipeline(OptimizationLevel Level,
11401140
MPM.addPass(LowerTypeTestsPass(nullptr, nullptr,
11411141
lowertypetests::DropTestKind::Assume));
11421142

1143-
invokePipelineEarlySimplificationEPCallbacks(MPM, Level);
1143+
bool LTOPreLink = (Phase == ThinOrFullLTOPhase::FullLTOPreLink) ||
1144+
(Phase == ThinOrFullLTOPhase::ThinLTOPreLink);
1145+
1146+
invokePipelineEarlySimplificationEPCallbacks(MPM, Level, LTOPreLink);
11441147

11451148
// Interprocedural constant propagation now that basic cleanup has occurred
11461149
// and prior to optimizing globals.
@@ -2155,7 +2158,7 @@ ModulePassManager PassBuilder::buildO0DefaultPipeline(OptimizationLevel Level,
21552158
if (PGOOpt && PGOOpt->DebugInfoForProfiling)
21562159
MPM.addPass(createModuleToFunctionPassAdaptor(AddDiscriminatorsPass()));
21572160

2158-
invokePipelineEarlySimplificationEPCallbacks(MPM, Level);
2161+
invokePipelineEarlySimplificationEPCallbacks(MPM, Level, LTOPreLink);
21592162

21602163
// Build a minimal pipeline based on the semantics required by LLVM,
21612164
// which is just that always inlining occurs. Further, disable generating

llvm/lib/Target/AMDGPU/AMDGPUTargetMachine.cpp

+12-4
Original file line numberDiff line numberDiff line change
@@ -747,15 +747,16 @@ void AMDGPUTargetMachine::registerPassBuilderCallbacks(PassBuilder &PB) {
747747
});
748748

749749
PB.registerPipelineEarlySimplificationEPCallback(
750-
[](ModulePassManager &PM, OptimizationLevel Level) {
750+
[](ModulePassManager &PM, OptimizationLevel Level, bool LTOPreLink) {
751751
PM.addPass(AMDGPUPrintfRuntimeBindingPass());
752752

753753
if (Level == OptimizationLevel::O0)
754754
return;
755755

756756
PM.addPass(AMDGPUUnifyMetadataPass());
757757

758-
if (InternalizeSymbols) {
758+
// We don't want to run internalization at per-module stage.
759+
if (InternalizeSymbols && !LTOPreLink) {
759760
PM.addPass(InternalizePass(mustPreserveGV));
760761
PM.addPass(GlobalDCEPass());
761762
}
@@ -823,8 +824,15 @@ void AMDGPUTargetMachine::registerPassBuilderCallbacks(PassBuilder &PB) {
823824
PM.addPass(AMDGPUSwLowerLDSPass(*this));
824825
if (EnableLowerModuleLDS)
825826
PM.addPass(AMDGPULowerModuleLDSPass(*this));
826-
if (EnableAMDGPUAttributor && Level != OptimizationLevel::O0)
827-
PM.addPass(AMDGPUAttributorPass(*this));
827+
if (Level != OptimizationLevel::O0) {
828+
if (EnableAMDGPUAttributor)
829+
PM.addPass(AMDGPUAttributorPass(*this));
830+
// Do we really need internalization in LTO?
831+
if (InternalizeSymbols) {
832+
PM.addPass(InternalizePass(mustPreserveGV));
833+
PM.addPass(GlobalDCEPass());
834+
}
835+
}
828836
});
829837

830838
PB.registerRegClassFilterParsingCallback(

llvm/lib/Target/BPF/BPFTargetMachine.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -138,7 +138,7 @@ void BPFTargetMachine::registerPassBuilderCallbacks(PassBuilder &PB) {
138138
FPM.addPass(BPFPreserveStaticOffsetPass(false));
139139
});
140140
PB.registerPipelineEarlySimplificationEPCallback(
141-
[=](ModulePassManager &MPM, OptimizationLevel) {
141+
[=](ModulePassManager &MPM, OptimizationLevel, bool) {
142142
MPM.addPass(BPFAdjustOptPass());
143143
});
144144
}

llvm/test/CodeGen/AMDGPU/print-pipeline-passes.ll

+8
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,17 @@
33
; RUN: opt -mtriple=amdgcn--amdhsa -S -passes="lto<O2>" -print-pipeline-passes %s -o - | FileCheck %s
44
; RUN: opt -mtriple=amdgcn--amdhsa -S -passes="lto<O3>" -print-pipeline-passes %s -o - | FileCheck %s
55

6+
; RUN: opt -mtriple=amdgcn--amdhsa -S -passes="lto-pre-link<O0>" -print-pipeline-passes %s -o - | FileCheck --check-prefix=PRE %s
7+
; RUN: opt -mtriple=amdgcn--amdhsa -S -passes="lto-pre-link<O1>" -print-pipeline-passes %s -o - | FileCheck --check-prefix=PRE %s
8+
; RUN: opt -mtriple=amdgcn--amdhsa -S -passes="lto-pre-link<O2>" -print-pipeline-passes %s -o - | FileCheck --check-prefix=PRE %s
9+
; RUN: opt -mtriple=amdgcn--amdhsa -S -passes="lto-pre-link<O3>" -print-pipeline-passes %s -o - | FileCheck --check-prefix=PRE %s
10+
11+
612
; CHECK: amdgpu-attributor
713
; O0-NOT: amdgpu-attributor
814

15+
; PRE-NOT: internalize
16+
917
define amdgpu_kernel void @kernel() {
1018
entry:
1119
ret void

llvm/tools/opt/NewPMDriver.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -294,7 +294,7 @@ static void registerEPCallbacks(PassBuilder &PB) {
294294
if (tryParsePipelineText<ModulePassManager>(
295295
PB, PipelineEarlySimplificationEPPipeline))
296296
PB.registerPipelineEarlySimplificationEPCallback(
297-
[&PB](ModulePassManager &PM, OptimizationLevel) {
297+
[&PB](ModulePassManager &PM, OptimizationLevel, bool) {
298298
ExitOnError Err("Unable to parse EarlySimplification pipeline: ");
299299
Err(PB.parsePassPipeline(PM, PipelineEarlySimplificationEPPipeline));
300300
});

0 commit comments

Comments
 (0)