mirror of
https://github.com/RPCS3/llvm.git
synced 2024-11-28 14:10:55 +00:00
Move the SampleProfileLoader right after EarlyFPM.
Summary: SampleProfileLoader pass do need to happen after some early cleanup passes so that inlining can happen correctly inside the SampleProfileLoader pass. Reviewers: chandlerc, davidxl, tejohnson Reviewed By: chandlerc, tejohnson Subscribers: sanjoy, mehdi_amini, eraman, llvm-commits Differential Revision: https://reviews.llvm.org/D36333 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@310296 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
b6ff06ef35
commit
6858db5aed
@ -540,8 +540,32 @@ PassBuilder::buildModuleSimplificationPipeline(OptimizationLevel Level,
|
|||||||
EarlyFPM.addPass(SROA());
|
EarlyFPM.addPass(SROA());
|
||||||
EarlyFPM.addPass(EarlyCSEPass());
|
EarlyFPM.addPass(EarlyCSEPass());
|
||||||
EarlyFPM.addPass(LowerExpectIntrinsicPass());
|
EarlyFPM.addPass(LowerExpectIntrinsicPass());
|
||||||
|
// In SamplePGO ThinLTO backend, we need instcombine before profile annotation
|
||||||
|
// to convert bitcast to direct calls so that they can be inlined during the
|
||||||
|
// profile annotation prepration step.
|
||||||
|
// More details about SamplePGO design can be found in:
|
||||||
|
// https://research.google.com/pubs/pub45290.html
|
||||||
|
// FIXME: revisit how SampleProfileLoad/Inliner/ICP is structured.
|
||||||
|
if (PGOOpt && !PGOOpt->SampleProfileFile.empty() &&
|
||||||
|
Phase == ThinLTOPhase::PostLink)
|
||||||
|
EarlyFPM.addPass(InstCombinePass());
|
||||||
MPM.addPass(createModuleToFunctionPassAdaptor(std::move(EarlyFPM)));
|
MPM.addPass(createModuleToFunctionPassAdaptor(std::move(EarlyFPM)));
|
||||||
|
|
||||||
|
if (PGOOpt && !PGOOpt->SampleProfileFile.empty()) {
|
||||||
|
// Annotate sample profile right after early FPM to ensure freshness of
|
||||||
|
// the debug info.
|
||||||
|
MPM.addPass(SampleProfileLoaderPass(PGOOpt->SampleProfileFile));
|
||||||
|
// Do not invoke ICP in the ThinLTOPrelink phase as it makes it hard
|
||||||
|
// for the profile annotation to be accurate in the ThinLTO backend.
|
||||||
|
if (Phase != ThinLTOPhase::PreLink)
|
||||||
|
// We perform early indirect call promotion here, before globalopt.
|
||||||
|
// This is important for the ThinLTO backend phase because otherwise
|
||||||
|
// imported available_externally functions look unreferenced and are
|
||||||
|
// removed.
|
||||||
|
MPM.addPass(PGOIndirectCallPromotion(Phase == ThinLTOPhase::PostLink,
|
||||||
|
true));
|
||||||
|
}
|
||||||
|
|
||||||
// Interprocedural constant propagation now that basic cleanup has occured
|
// Interprocedural constant propagation now that basic cleanup has occured
|
||||||
// and prior to optimizing globals.
|
// and prior to optimizing globals.
|
||||||
// FIXME: This position in the pipeline hasn't been carefully considered in
|
// FIXME: This position in the pipeline hasn't been carefully considered in
|
||||||
@ -768,13 +792,8 @@ PassBuilder::buildPerModuleDefaultPipeline(OptimizationLevel Level,
|
|||||||
// Force any function attributes we want the rest of the pipeline to observe.
|
// Force any function attributes we want the rest of the pipeline to observe.
|
||||||
MPM.addPass(ForceFunctionAttrsPass());
|
MPM.addPass(ForceFunctionAttrsPass());
|
||||||
|
|
||||||
if (PGOOpt && PGOOpt->SamplePGOSupport) {
|
if (PGOOpt && PGOOpt->SamplePGOSupport)
|
||||||
MPM.addPass(createModuleToFunctionPassAdaptor(AddDiscriminatorsPass()));
|
MPM.addPass(createModuleToFunctionPassAdaptor(AddDiscriminatorsPass()));
|
||||||
if (!PGOOpt->SampleProfileFile.empty()) {
|
|
||||||
MPM.addPass(SampleProfileLoaderPass(PGOOpt->SampleProfileFile));
|
|
||||||
MPM.addPass(PGOIndirectCallPromotion(false, true));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Add the core simplification pipeline.
|
// Add the core simplification pipeline.
|
||||||
MPM.addPass(buildModuleSimplificationPipeline(Level, ThinLTOPhase::None,
|
MPM.addPass(buildModuleSimplificationPipeline(Level, ThinLTOPhase::None,
|
||||||
@ -796,14 +815,8 @@ PassBuilder::buildThinLTOPreLinkDefaultPipeline(OptimizationLevel Level,
|
|||||||
// Force any function attributes we want the rest of the pipeline to observe.
|
// Force any function attributes we want the rest of the pipeline to observe.
|
||||||
MPM.addPass(ForceFunctionAttrsPass());
|
MPM.addPass(ForceFunctionAttrsPass());
|
||||||
|
|
||||||
// Invoke the SamplePGO annotation pass for the first time to annotate
|
if (PGOOpt && PGOOpt->SamplePGOSupport)
|
||||||
// profile for functions in the current module to give ThinLink info
|
|
||||||
// about module grouping.
|
|
||||||
if (PGOOpt && PGOOpt->SamplePGOSupport) {
|
|
||||||
MPM.addPass(createModuleToFunctionPassAdaptor(AddDiscriminatorsPass()));
|
MPM.addPass(createModuleToFunctionPassAdaptor(AddDiscriminatorsPass()));
|
||||||
if (!PGOOpt->SampleProfileFile.empty())
|
|
||||||
MPM.addPass(SampleProfileLoaderPass(PGOOpt->SampleProfileFile));
|
|
||||||
}
|
|
||||||
|
|
||||||
// If we are planning to perform ThinLTO later, we don't bloat the code with
|
// If we are planning to perform ThinLTO later, we don't bloat the code with
|
||||||
// unrolling/vectorization/... now. Just simplify the module as much as we
|
// unrolling/vectorization/... now. Just simplify the module as much as we
|
||||||
@ -839,16 +852,14 @@ PassBuilder::buildThinLTODefaultPipeline(OptimizationLevel Level,
|
|||||||
// Force any function attributes we want the rest of the pipeline to observe.
|
// Force any function attributes we want the rest of the pipeline to observe.
|
||||||
MPM.addPass(ForceFunctionAttrsPass());
|
MPM.addPass(ForceFunctionAttrsPass());
|
||||||
|
|
||||||
// Invoke the SamplePGO annotation pass for the second time to annotate on
|
|
||||||
// functions imported from other modules.
|
|
||||||
if (PGOOpt && !PGOOpt->SampleProfileFile.empty())
|
|
||||||
MPM.addPass(SampleProfileLoaderPass(PGOOpt->SampleProfileFile));
|
|
||||||
|
|
||||||
// During the ThinLTO backend phase we perform early indirect call promotion
|
// During the ThinLTO backend phase we perform early indirect call promotion
|
||||||
// here, before globalopt. Otherwise imported available_externally functions
|
// here, before globalopt. Otherwise imported available_externally functions
|
||||||
// look unreferenced and are removed.
|
// look unreferenced and are removed.
|
||||||
MPM.addPass(PGOIndirectCallPromotion(
|
// FIXME: move this into buildModuleSimplificationPipeline to merge the logic
|
||||||
true /* InLTO */, PGOOpt && !PGOOpt->SampleProfileFile.empty()));
|
// with SamplePGO.
|
||||||
|
if (PGOOpt && !PGOOpt->ProfileUseFile.empty())
|
||||||
|
MPM.addPass(PGOIndirectCallPromotion(true /* InLTO */,
|
||||||
|
false /* SamplePGO */));
|
||||||
|
|
||||||
// Add the core simplification pipeline.
|
// Add the core simplification pipeline.
|
||||||
MPM.addPass(buildModuleSimplificationPipeline(Level, ThinLTOPhase::PostLink,
|
MPM.addPass(buildModuleSimplificationPipeline(Level, ThinLTOPhase::PostLink,
|
||||||
|
@ -1,13 +1,27 @@
|
|||||||
; RUN: opt -debug-pass-manager -passes='default<O2>' -pgo-kind=new-pm-pgo-instr-gen-pipeline -profile-file='temp' %s 2>&1 |FileCheck %s --check-prefixes=GEN
|
; RUN: opt -debug-pass-manager -passes='default<O2>' -pgo-kind=new-pm-pgo-instr-gen-pipeline -profile-file='temp' %s 2>&1 |FileCheck %s --check-prefixes=GEN
|
||||||
; RUN: llvm-profdata merge %S/Inputs/new-pm-pgo.proftext -o %t.profdata
|
; RUN: llvm-profdata merge %S/Inputs/new-pm-pgo.proftext -o %t.profdata
|
||||||
; RUN: opt -debug-pass-manager -passes='default<O2>' -pgo-kind=new-pm-pgo-instr-use-pipeline -profile-file='%t.profdata' %s 2>&1 |FileCheck %s --check-prefixes=USE
|
; RUN: opt -debug-pass-manager -passes='default<O2>' -pgo-kind=new-pm-pgo-instr-use-pipeline -profile-file='%t.profdata' %s 2>&1 |FileCheck %s --check-prefixes=USE
|
||||||
; RUN: opt -debug-pass-manager -passes='default<O2>' -pgo-kind=new-pm-pgo-sample-use-pipeline -profile-file='%S/Inputs/new-pm-pgo.prof' %s 2>&1 |FileCheck %s --check-prefixes=SAMPLE_USE
|
; RUN: opt -debug-pass-manager -passes='default<O2>' -pgo-kind=new-pm-pgo-sample-use-pipeline -profile-file='%S/Inputs/new-pm-pgo.prof' %s 2>&1 \
|
||||||
|
; RUN: |FileCheck %s --check-prefixes=SAMPLE_USE,SAMPLE_USE_O
|
||||||
|
; RUN: opt -debug-pass-manager -passes='thinlto-pre-link<O2>' -pgo-kind=new-pm-pgo-sample-use-pipeline -profile-file='%S/Inputs/new-pm-pgo.prof' %s 2>&1 \
|
||||||
|
; RUN: |FileCheck %s --check-prefixes=SAMPLE_USE,SAMPLE_USE_PRE_LINK
|
||||||
|
; RUN: opt -debug-pass-manager -passes='thinlto<O2>' -pgo-kind=new-pm-pgo-sample-use-pipeline -profile-file='%S/Inputs/new-pm-pgo.prof' %s 2>&1 \
|
||||||
|
; RUN: |FileCheck %s --check-prefixes=SAMPLE_USE,SAMPLE_USE_POST_LINK
|
||||||
; RUN: opt -debug-pass-manager -passes='default<O2>' -new-pm-debug-info-for-profiling %s 2>&1 |FileCheck %s --check-prefixes=SAMPLE_GEN
|
; RUN: opt -debug-pass-manager -passes='default<O2>' -new-pm-debug-info-for-profiling %s 2>&1 |FileCheck %s --check-prefixes=SAMPLE_GEN
|
||||||
;
|
;
|
||||||
; GEN: Running pass: PGOInstrumentationGen
|
; GEN: Running pass: PGOInstrumentationGen
|
||||||
; USE: Running pass: PGOInstrumentationUse
|
; USE: Running pass: PGOInstrumentationUse
|
||||||
; SAMPLE_USE: Running pass: ModuleToFunctionPassAdaptor<{{.*}}AddDiscriminatorsPass{{.*}}>
|
; SAMPLE_USE_O: Running pass: ModuleToFunctionPassAdaptor<{{.*}}AddDiscriminatorsPass{{.*}}>
|
||||||
|
; SAMPLE_USE_PRE_LINK: Running pass: ModuleToFunctionPassAdaptor<{{.*}}AddDiscriminatorsPass{{.*}}>
|
||||||
|
; SAMPLE_USE: Running pass: SimplifyCFGPass
|
||||||
|
; SAMPLE_USE: Running pass: SROA
|
||||||
|
; SAMPLE_USE: Running pass: EarlyCSEPass
|
||||||
|
; SAMPLE_USE: Running pass: LowerExpectIntrinsicPass
|
||||||
|
; SAMPLE_USE_POST_LINK: Running pass: InstCombinePass
|
||||||
; SAMPLE_USE: Running pass: SampleProfileLoaderPass
|
; SAMPLE_USE: Running pass: SampleProfileLoaderPass
|
||||||
|
; SAMPLE_USE_O: Running pass: PGOIndirectCallPromotion
|
||||||
|
; SAMPLE_USE_POST_LINK-NOT: Running pass: GlobalOptPass
|
||||||
|
; SAMPLE_USE_POST_LINK: Running pass: PGOIndirectCallPromotion
|
||||||
; SAMPLE_GEN: Running pass: ModuleToFunctionPassAdaptor<{{.*}}AddDiscriminatorsPass{{.*}}>
|
; SAMPLE_GEN: Running pass: ModuleToFunctionPassAdaptor<{{.*}}AddDiscriminatorsPass{{.*}}>
|
||||||
|
|
||||||
define void @foo() {
|
define void @foo() {
|
||||||
|
@ -53,15 +53,13 @@
|
|||||||
; CHECK-O-NEXT: Running pass: ForceFunctionAttrsPass
|
; CHECK-O-NEXT: Running pass: ForceFunctionAttrsPass
|
||||||
; CHECK-DIS-NEXT: Running pass: ModuleToFunctionPassAdaptor<{{.*}}AddDiscriminatorsPass{{.*}}>
|
; CHECK-DIS-NEXT: Running pass: ModuleToFunctionPassAdaptor<{{.*}}AddDiscriminatorsPass{{.*}}>
|
||||||
; CHECK-DIS-NEXT: Running analysis: InnerAnalysisManagerProxy
|
; CHECK-DIS-NEXT: Running analysis: InnerAnalysisManagerProxy
|
||||||
; CHECK-POSTLINK-O-NEXT: Running pass: PGOIndirectCallPromotion
|
|
||||||
; CHECK-POSTLINK-O-NEXT: Running analysis: InnerAnalysisManagerProxy<{{.*}}Function
|
|
||||||
; CHECK-POSTLINK-O-NEXT: Running analysis: OptimizationRemarkEmitterAnalysis
|
|
||||||
; CHECK-O-NEXT: Running pass: PassManager<{{.*}}Module{{.*}}>
|
; CHECK-O-NEXT: Running pass: PassManager<{{.*}}Module{{.*}}>
|
||||||
; CHECK-O-NEXT: Starting llvm::Module pass manager run.
|
; CHECK-O-NEXT: Starting llvm::Module pass manager run.
|
||||||
; CHECK-O-NEXT: Running pass: InferFunctionAttrsPass
|
; CHECK-O-NEXT: Running pass: InferFunctionAttrsPass
|
||||||
; CHECK-O-NEXT: Running analysis: TargetLibraryAnalysis
|
; CHECK-O-NEXT: Running analysis: TargetLibraryAnalysis
|
||||||
; CHECK-O-NEXT: Running pass: ModuleToFunctionPassAdaptor<{{.*}}PassManager{{.*}}>
|
; CHECK-O-NEXT: Running pass: ModuleToFunctionPassAdaptor<{{.*}}PassManager{{.*}}>
|
||||||
; CHECK-PRELINK-O-NODIS-NEXT: Running analysis: InnerAnalysisManagerProxy
|
; CHECK-PRELINK-O-NODIS-NEXT: Running analysis: InnerAnalysisManagerProxy
|
||||||
|
; CHECK-POSTLINK-O-NEXT: Running analysis: InnerAnalysisManagerProxy
|
||||||
; CHECK-O-NEXT: Starting llvm::Function pass manager run.
|
; CHECK-O-NEXT: Starting llvm::Function pass manager run.
|
||||||
; CHECK-O-NEXT: Running pass: SimplifyCFGPass
|
; CHECK-O-NEXT: Running pass: SimplifyCFGPass
|
||||||
; CHECK-O-NEXT: Running analysis: TargetIRAnalysis
|
; CHECK-O-NEXT: Running analysis: TargetIRAnalysis
|
||||||
@ -80,6 +78,7 @@
|
|||||||
; CHECK-O-NEXT: Starting llvm::Function pass manager run.
|
; CHECK-O-NEXT: Starting llvm::Function pass manager run.
|
||||||
; CHECK-O-NEXT: Running pass: InstCombinePass
|
; CHECK-O-NEXT: Running pass: InstCombinePass
|
||||||
; CHECK-PRELINK-O-NEXT: Running analysis: OptimizationRemarkEmitterAnalysis
|
; CHECK-PRELINK-O-NEXT: Running analysis: OptimizationRemarkEmitterAnalysis
|
||||||
|
; CHECK-POSTLINK-O-NEXT: Running analysis: OptimizationRemarkEmitterAnalysis
|
||||||
; CHECK-O-NEXT: Running pass: SimplifyCFGPass
|
; CHECK-O-NEXT: Running pass: SimplifyCFGPass
|
||||||
; CHECK-O-NEXT: Finished llvm::Function pass manager run.
|
; CHECK-O-NEXT: Finished llvm::Function pass manager run.
|
||||||
; CHECK-O-NEXT: Running pass: RequireAnalysisPass<{{.*}}GlobalsAA
|
; CHECK-O-NEXT: Running pass: RequireAnalysisPass<{{.*}}GlobalsAA
|
||||||
|
Loading…
Reference in New Issue
Block a user