Skip to content

Commit dc45ff1

Browse files
authored
[PassBuilder] Add ThinOrFullLTOPhase to early simplication EP call backs (#114547)
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 798c5fb commit dc45ff1

File tree

7 files changed

+38
-14
lines changed

7 files changed

+38
-14
lines changed

Diff for: clang/lib/CodeGen/BackendUtil.cpp

+2-1
Original file line numberDiff line numberDiff line change
@@ -993,7 +993,8 @@ void EmitAssemblyHelper::RunOptimizationPipeline(
993993
createModuleToFunctionPassAdaptor(ObjCARCExpandPass()));
994994
});
995995
PB.registerPipelineEarlySimplificationEPCallback(
996-
[](ModulePassManager &MPM, OptimizationLevel Level) {
996+
[](ModulePassManager &MPM, OptimizationLevel Level,
997+
ThinOrFullLTOPhase) {
997998
if (Level != OptimizationLevel::O0)
998999
MPM.addPass(ObjCARCAPElimPass());
9991000
});

Diff for: llvm/include/llvm/Passes/PassBuilder.h

+7-3
Original file line numberDiff line numberDiff line change
@@ -480,7 +480,8 @@ class PassBuilder {
480480
/// This extension point allows adding optimization right after passes that do
481481
/// basic simplification of the input IR.
482482
void registerPipelineEarlySimplificationEPCallback(
483-
const std::function<void(ModulePassManager &, OptimizationLevel)> &C) {
483+
const std::function<void(ModulePassManager &, OptimizationLevel,
484+
ThinOrFullLTOPhase)> &C) {
484485
PipelineEarlySimplificationEPCallbacks.push_back(C);
485486
}
486487

@@ -639,7 +640,8 @@ class PassBuilder {
639640
void invokePipelineStartEPCallbacks(ModulePassManager &MPM,
640641
OptimizationLevel Level);
641642
void invokePipelineEarlySimplificationEPCallbacks(ModulePassManager &MPM,
642-
OptimizationLevel Level);
643+
OptimizationLevel Level,
644+
ThinOrFullLTOPhase Phase);
643645

644646
static bool checkParametrizedPassName(StringRef Name, StringRef PassName) {
645647
if (!Name.consume_front(PassName))
@@ -764,7 +766,9 @@ class PassBuilder {
764766
FullLinkTimeOptimizationLastEPCallbacks;
765767
SmallVector<std::function<void(ModulePassManager &, OptimizationLevel)>, 2>
766768
PipelineStartEPCallbacks;
767-
SmallVector<std::function<void(ModulePassManager &, OptimizationLevel)>, 2>
769+
SmallVector<std::function<void(ModulePassManager &, OptimizationLevel,
770+
ThinOrFullLTOPhase)>,
771+
2>
768772
PipelineEarlySimplificationEPCallbacks;
769773

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

Diff for: llvm/lib/Passes/PassBuilderPipelines.cpp

+4-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, ThinOrFullLTOPhase Phase) {
388388
for (auto &C : PipelineEarlySimplificationEPCallbacks)
389-
C(MPM, Level);
389+
C(MPM, Level, Phase);
390390
}
391391

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

1143-
invokePipelineEarlySimplificationEPCallbacks(MPM, Level);
1143+
invokePipelineEarlySimplificationEPCallbacks(MPM, Level, Phase);
11441144

11451145
// Interprocedural constant propagation now that basic cleanup has occurred
11461146
// and prior to optimizing globals.
@@ -2153,7 +2153,7 @@ PassBuilder::buildO0DefaultPipeline(OptimizationLevel Level,
21532153
if (PGOOpt && PGOOpt->DebugInfoForProfiling)
21542154
MPM.addPass(createModuleToFunctionPassAdaptor(AddDiscriminatorsPass()));
21552155

2156-
invokePipelineEarlySimplificationEPCallbacks(MPM, Level);
2156+
invokePipelineEarlySimplificationEPCallbacks(MPM, Level, Phase);
21572157

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

Diff for: llvm/lib/Target/AMDGPU/AMDGPUTargetMachine.cpp

+15-4
Original file line numberDiff line numberDiff line change
@@ -745,15 +745,19 @@ void AMDGPUTargetMachine::registerPassBuilderCallbacks(PassBuilder &PB) {
745745
});
746746

747747
PB.registerPipelineEarlySimplificationEPCallback(
748-
[](ModulePassManager &PM, OptimizationLevel Level) {
748+
[](ModulePassManager &PM, OptimizationLevel Level,
749+
ThinOrFullLTOPhase Phase) {
749750
PM.addPass(AMDGPUPrintfRuntimeBindingPass());
750751

751752
if (Level == OptimizationLevel::O0)
752753
return;
753754

754755
PM.addPass(AMDGPUUnifyMetadataPass());
755756

756-
if (InternalizeSymbols) {
757+
// We don't want to run internalization at per-module stage.
758+
bool LTOPreLink = Phase == ThinOrFullLTOPhase::FullLTOPreLink ||
759+
Phase == ThinOrFullLTOPhase::ThinLTOPreLink;
760+
if (InternalizeSymbols && !LTOPreLink) {
757761
PM.addPass(InternalizePass(mustPreserveGV));
758762
PM.addPass(GlobalDCEPass());
759763
}
@@ -821,8 +825,15 @@ void AMDGPUTargetMachine::registerPassBuilderCallbacks(PassBuilder &PB) {
821825
PM.addPass(AMDGPUSwLowerLDSPass(*this));
822826
if (EnableLowerModuleLDS)
823827
PM.addPass(AMDGPULowerModuleLDSPass(*this));
824-
if (EnableAMDGPUAttributor && Level != OptimizationLevel::O0)
825-
PM.addPass(AMDGPUAttributorPass(*this));
828+
if (Level != OptimizationLevel::O0) {
829+
// Do we really need internalization in LTO?
830+
if (InternalizeSymbols) {
831+
PM.addPass(InternalizePass(mustPreserveGV));
832+
PM.addPass(GlobalDCEPass());
833+
}
834+
if (EnableAMDGPUAttributor)
835+
PM.addPass(AMDGPUAttributorPass(*this));
836+
}
826837
});
827838

828839
PB.registerRegClassFilterParsingCallback(

Diff for: 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, ThinOrFullLTOPhase) {
142142
MPM.addPass(BPFAdjustOptPass());
143143
});
144144
}

Diff for: 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 -amdgpu-internalize-symbols %s -o - | FileCheck --check-prefix=PRE %s
7+
; RUN: opt -mtriple=amdgcn--amdhsa -S -passes="lto-pre-link<O1>" -print-pipeline-passes -amdgpu-internalize-symbols %s -o - | FileCheck --check-prefix=PRE %s
8+
; RUN: opt -mtriple=amdgcn--amdhsa -S -passes="lto-pre-link<O2>" -print-pipeline-passes -amdgpu-internalize-symbols %s -o - | FileCheck --check-prefix=PRE %s
9+
; RUN: opt -mtriple=amdgcn--amdhsa -S -passes="lto-pre-link<O3>" -print-pipeline-passes -amdgpu-internalize-symbols %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

Diff for: 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, ThinOrFullLTOPhase) {
298298
ExitOnError Err("Unable to parse EarlySimplification pipeline: ");
299299
Err(PB.parsePassPipeline(PM, PipelineEarlySimplificationEPPipeline));
300300
});

0 commit comments

Comments
 (0)