Index: llvm/include/llvm/IR/PassManager.h =================================================================== --- llvm/include/llvm/IR/PassManager.h +++ llvm/include/llvm/IR/PassManager.h @@ -381,6 +381,22 @@ Name = Name.drop_front(strlen("llvm::")); return Name; } + + void buildPassesStr(PassInstrumentationCallbacks &PIC, + std::string &PassesStr) { + auto PassName = PIC.getPassNameForClassName(name()); + if (!PassName.empty()) { + if (!PassesStr.empty() && PassesStr.back() != '(') + PassesStr += ","; + PassesStr += PassName; + std::string Params; + static_cast(this)->printParams(Params); + if (!Params.empty()) + PassesStr += Params; + } + } + + void printParams(std::string &ParamsStr) {} }; /// A CRTP mix-in that provides informational APIs needed for analysis passes. @@ -480,6 +496,14 @@ return *this; } + void buildPassesStr(PassInstrumentationCallbacks &PIC, + std::string &PassesStr) { + for (unsigned Idx = 0, Size = Passes.size(); Idx != Size; ++Idx) { + auto *P = Passes[Idx].get(); + P->buildPassesStr(PIC, PassesStr); + } + } + /// Run all of the passes in this manager over the given unit of IR. /// ExtraArgs are passed to each pass. PreservedAnalyses run(IRUnitT &IR, AnalysisManagerT &AM, @@ -1195,6 +1219,8 @@ /// Runs the function pass across every function in the module. PreservedAnalyses run(Module &M, ModuleAnalysisManager &AM); + void buildPassesStr(PassInstrumentationCallbacks &PIC, + std::string &PassesStr); static bool isRequired() { return true; } Index: llvm/include/llvm/IR/PassManagerInternal.h =================================================================== --- llvm/include/llvm/IR/PassManagerInternal.h +++ llvm/include/llvm/IR/PassManagerInternal.h @@ -46,6 +46,9 @@ virtual PreservedAnalyses run(IRUnitT &IR, AnalysisManagerT &AM, ExtraArgTs... ExtraArgs) = 0; + virtual void buildPassesStr(PassInstrumentationCallbacks &PIC, + std::string &PassesStr) = 0; + virtual void printParams(std::string &ParamsStr) = 0; /// Polymorphic method to access the name of a pass. virtual StringRef name() const = 0; @@ -85,6 +88,14 @@ return Pass.run(IR, AM, ExtraArgs...); } + void buildPassesStr(PassInstrumentationCallbacks &PIC, + std::string &PassesStr) override { + Pass.buildPassesStr(PIC, PassesStr); + } + void printParams(std::string &ParamsStr) override { + Pass.printParams(ParamsStr); + } + StringRef name() const override { return PassT::name(); } template Index: llvm/include/llvm/Transforms/Scalar/LoopPassManager.h =================================================================== --- llvm/include/llvm/Transforms/Scalar/LoopPassManager.h +++ llvm/include/llvm/Transforms/Scalar/LoopPassManager.h @@ -424,6 +424,8 @@ /// Runs the loop passes across every loop in the function. PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM); + void buildPassesStr(PassInstrumentationCallbacks &PIC, + std::string &PassesStr); static bool isRequired() { return true; } Index: llvm/include/llvm/Transforms/Scalar/SimplifyCFG.h =================================================================== --- llvm/include/llvm/Transforms/Scalar/SimplifyCFG.h +++ llvm/include/llvm/Transforms/Scalar/SimplifyCFG.h @@ -39,6 +39,7 @@ /// Construct a pass with optional optimizations. SimplifyCFGPass(const SimplifyCFGOptions &PassOptions); + void printParams(std::string &ParamsStr); /// Run the pass over the function. PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM); }; Index: llvm/lib/IR/PassManager.cpp =================================================================== --- llvm/lib/IR/PassManager.cpp +++ llvm/lib/IR/PassManager.cpp @@ -91,6 +91,15 @@ } } // namespace llvm +void ModuleToFunctionPassAdaptor::buildPassesStr( + PassInstrumentationCallbacks &PIC, std::string &PassesStr) { + if (!PassesStr.empty() && PassesStr.back() != '(') + PassesStr += ","; + PassesStr += "function("; + Pass->buildPassesStr(PIC, PassesStr); + PassesStr += ")"; +} + PreservedAnalyses ModuleToFunctionPassAdaptor::run(Module &M, ModuleAnalysisManager &AM) { FunctionAnalysisManager &FAM = Index: llvm/lib/Passes/PassBuilder.cpp =================================================================== --- llvm/lib/Passes/PassBuilder.cpp +++ llvm/lib/Passes/PassBuilder.cpp @@ -439,7 +439,7 @@ /// it. This should be updated if new pass instrumentation wants to use the map. /// We currently only use this for --print-before/after. bool shouldPopulateClassToPassNames() { - return !printBeforePasses().empty() || !printAfterPasses().empty(); + return true || !printBeforePasses().empty() || !printAfterPasses().empty(); } } // namespace Index: llvm/lib/Transforms/Scalar/LoopPassManager.cpp =================================================================== --- llvm/lib/Transforms/Scalar/LoopPassManager.cpp +++ llvm/lib/Transforms/Scalar/LoopPassManager.cpp @@ -172,6 +172,14 @@ } } // namespace llvm +void FunctionToLoopPassAdaptor::buildPassesStr( + PassInstrumentationCallbacks &PIC, std::string &PassesStr) { + if (!PassesStr.empty() && PassesStr.back() != '(') + PassesStr += ","; + PassesStr += UseMemorySSA ? "loop-mssa(" : "loop("; + Pass->buildPassesStr(PIC, PassesStr); + PassesStr += ")"; +} PreservedAnalyses FunctionToLoopPassAdaptor::run(Function &F, FunctionAnalysisManager &AM) { // Before we even compute any loop analyses, first run a miniature function Index: llvm/lib/Transforms/Scalar/SimplifyCFGPass.cpp =================================================================== --- llvm/lib/Transforms/Scalar/SimplifyCFGPass.cpp +++ llvm/lib/Transforms/Scalar/SimplifyCFGPass.cpp @@ -319,6 +319,25 @@ applyCommandLineOverridesToOptions(Options); } +void SimplifyCFGPass::printParams(std::string &ParamsStr) { + auto BoolHelper = [&ParamsStr](bool B, const char *S) { + if (!B) + ParamsStr += "no-"; + ParamsStr += S; + ParamsStr += ";"; + }; + ParamsStr += "<"; + ParamsStr += + "bonus-inst-threshold=" + std::to_string(Options.BonusInstThreshold) + + ";"; + BoolHelper(Options.ForwardSwitchCondToPhi, "forward-switch-cond"); + BoolHelper(Options.ConvertSwitchToLookupTable, "switch-to-lookup"); + BoolHelper(Options.NeedCanonicalLoop, "keep-loops"); + BoolHelper(Options.HoistCommonInsts, "hoist-common-insts"); + BoolHelper(Options.SinkCommonInsts, "sink-common-insts"); + ParamsStr += ">"; +} + PreservedAnalyses SimplifyCFGPass::run(Function &F, FunctionAnalysisManager &AM) { auto &TTI = AM.getResult(F); Index: llvm/tools/opt/NewPMDriver.cpp =================================================================== --- llvm/tools/opt/NewPMDriver.cpp +++ llvm/tools/opt/NewPMDriver.cpp @@ -452,6 +452,10 @@ // Before executing passes, print the final values of the LLVM options. cl::PrintOptionValues(); + std::string PassesStr; + MPM.buildPassesStr(PIC, PassesStr); + errs() << "-passes='" << PassesStr << "'\n"; + // Now that we have all of the passes ready, run them. MPM.run(M, MAM);