Index: include/llvm/Passes/PassBuilder.h =================================================================== --- include/llvm/Passes/PassBuilder.h +++ include/llvm/Passes/PassBuilder.h @@ -29,10 +29,14 @@ /// A struct capturing PGO tunables. struct PGOOptions { - std::string ProfileGenFile = ""; - std::string ProfileUseFile = ""; - std::string SampleProfileFile = ""; - bool RunProfileGen = false; + PGOOptions(std::string ProfileGenFile = "", std::string ProfileUseFile = "", + std::string SampleProfileFile = "", bool RunProfileGen = false) + : ProfileGenFile(ProfileGenFile), ProfileUseFile(ProfileUseFile), + SampleProfileFile(SampleProfileFile), RunProfileGen(RunProfileGen) {} + std::string ProfileGenFile; + std::string ProfileUseFile; + std::string SampleProfileFile; + bool RunProfileGen; }; /// \brief This class provides access to building LLVM's passes. Index: test/Other/Inputs/new-pm-pgo.prof =================================================================== --- /dev/null +++ test/Other/Inputs/new-pm-pgo.prof @@ -0,0 +1 @@ +foo:0:0 Index: test/Other/Inputs/new-pm-pgo.proftext =================================================================== --- /dev/null +++ test/Other/Inputs/new-pm-pgo.proftext @@ -0,0 +1 @@ +:ir Index: test/Other/new-pm-pgo.ll =================================================================== --- /dev/null +++ test/Other/new-pm-pgo.ll @@ -0,0 +1,12 @@ +; RUN: opt -debug-pass-manager -passes='default' -pgo-gen='temp' %s 2>&1 |FileCheck %s --check-prefixes=GEN +; RUN: llvm-profdata merge %S/Inputs/new-pm-pgo.proftext -o %t.profdata +; RUN: opt -debug-pass-manager -passes='default' -pgo-use='%t.profdata' %s 2>&1 |FileCheck %s --check-prefixes=USE +; RUN: opt -debug-pass-manager -passes='default' -pgo-sample-use='%S/Inputs/new-pm-pgo.prof' %s 2>&1 |FileCheck %s --check-prefixes=SAMPLE_USE +; +; GEN: Running pass: PGOInstrumentationGen +; USE: Running pass: PGOInstrumentationUse +; SAMPLE_USE: Running pass: SampleProfileLoaderPass + +define void @foo() { + ret void +} Index: tools/opt/NewPMDriver.cpp =================================================================== --- tools/opt/NewPMDriver.cpp +++ tools/opt/NewPMDriver.cpp @@ -81,6 +81,18 @@ cl::desc("A textual description of the function pass pipeline inserted at " "the VectorizerStart extension point into default pipelines"), cl::Hidden); +static cl::opt PGOInstrGen( + "pgo-gen", cl::desc("Path to the instrumented profile. If set, " + "enable PGO instrumentation."), + cl::Hidden); +static cl::opt PGOInstrUse( + "pgo-use", cl::desc("Path to the instrumented profile. If set, " + "enable PGO optimization."), + cl::Hidden); +static cl::opt PGOSampleUse( + "pgo-sample-use", cl::desc("Path to the sample profile. If set, enable " + "SamplePGO optimization."), + cl::Hidden); /// @}} template @@ -153,7 +165,17 @@ bool ShouldPreserveBitcodeUseListOrder, bool EmitSummaryIndex, bool EmitModuleHash) { bool VerifyEachPass = VK == VK_VerifyEachPass; - PassBuilder PB(TM); + int NumPGOOptions = (PGOInstrGen.empty() ? 0 : 1) + + (PGOInstrUse.empty() ? 0 : 1) + + (PGOSampleUse.empty() ? 0 : 1); + assert(NumPGOOptions <2 && + "Only one of -pgo-gen,-pgo-use,-pgo-sample-use can be " + "specified"); + Optional P; + if (NumPGOOptions) + P = PGOOptions(PGOInstrGen, PGOInstrUse, PGOSampleUse, + !PGOInstrGen.empty()); + PassBuilder PB(TM, P); registerEPCallbacks(PB, VerifyEachPass, DebugPM); // Specially handle the alias analysis manager so that we can register