Index: include/llvm/Passes/PassBuilder.h =================================================================== --- include/llvm/Passes/PassBuilder.h +++ include/llvm/Passes/PassBuilder.h @@ -30,13 +30,16 @@ /// A struct capturing PGO tunables. struct PGOOptions { PGOOptions(std::string ProfileGenFile = "", std::string ProfileUseFile = "", - std::string SampleProfileFile = "", bool RunProfileGen = false) + std::string SampleProfileFile = "", bool RunProfileGen = false, + bool SamplePGOSupport = false) : ProfileGenFile(ProfileGenFile), ProfileUseFile(ProfileUseFile), - SampleProfileFile(SampleProfileFile), RunProfileGen(RunProfileGen) {} + SampleProfileFile(SampleProfileFile), RunProfileGen(RunProfileGen), + SamplePGOSupport(SamplePGOSupport || !SampleProfileFile.empty()) {} std::string ProfileGenFile; std::string ProfileUseFile; std::string SampleProfileFile; bool RunProfileGen; + bool SamplePGOSupport; }; /// \brief This class provides access to building LLVM's passes. Index: lib/Passes/PassBuilder.cpp =================================================================== --- lib/Passes/PassBuilder.cpp +++ lib/Passes/PassBuilder.cpp @@ -535,6 +535,8 @@ // Create an early function pass manager to cleanup the output of the // frontend. FunctionPassManager EarlyFPM(DebugLogging); + if (PGOOpt && PGOOpt->SamplePGOSupport) + EarlyFPM.addPass(AddDiscriminatorsPass()); EarlyFPM.addPass(SimplifyCFGPass()); EarlyFPM.addPass(SROA()); EarlyFPM.addPass(EarlyCSEPass()); Index: test/Other/new-pm-pgo.ll =================================================================== --- test/Other/new-pm-pgo.ll +++ test/Other/new-pm-pgo.ll @@ -2,10 +2,13 @@ ; RUN: llvm-profdata merge %S/Inputs/new-pm-pgo.proftext -o %t.profdata ; RUN: opt -debug-pass-manager -passes='default' -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' -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' -new-pm-debug-info-for-profiling %s 2>&1 |FileCheck %s --check-prefixes=SAMPLE_GEN ; ; GEN: Running pass: PGOInstrumentationGen ; USE: Running pass: PGOInstrumentationUse +; SAMPLE_USE: Running pass: AddDiscriminators ; SAMPLE_USE: Running pass: SampleProfileLoaderPass +; SAMPLE_GEN: Running pass: AddDiscriminators define void @foo() { ret void Index: tools/opt/NewPMDriver.cpp =================================================================== --- tools/opt/NewPMDriver.cpp +++ tools/opt/NewPMDriver.cpp @@ -94,6 +94,9 @@ "Use sampled profile to guide PGO."))); static cl::opt ProfileFile( "profile-file", cl::desc("Path to the profile."), cl::Hidden); +static cl::opt DebugInfoForProfiling( + "new-pm-debug-info-for-profiling", cl::init(false), cl::Hidden, + cl::desc("Emit special debug info to enable PGO profile generation.")); /// @}} template @@ -179,7 +182,10 @@ P = PGOOptions("", "", ProfileFile, false); break; case NoPGO: - P = None; + if (DebugInfoForProfiling) + P = PGOOptions("", "", "", false, true); + else + P = None; } PassBuilder PB(TM, P); registerEPCallbacks(PB, VerifyEachPass, DebugPM);