diff options
| author | Akshat Oke <Akshat.Oke@amd.com> | 2025-07-09 14:52:58 +0530 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-07-09 14:52:58 +0530 |
| commit | edaf656d5e17799208118069e8b64ee286621f2c (patch) | |
| tree | 1e4f261eb79dc79fb568623eea71a2a621a7e558 | |
| parent | 7ea371443b83f20edadb538c4b6ea19ee4de1094 (diff) | |
| download | llvm-edaf656d5e17799208118069e8b64ee286621f2c.zip llvm-edaf656d5e17799208118069e8b64ee286621f2c.tar.gz llvm-edaf656d5e17799208118069e8b64ee286621f2c.tar.bz2 | |
[CodeGen][NPM] Differentiate pipeline-required and opt-required passes (#135752)
"Required" passes relate to actually running the pass on the IR,
regardless of whether they are in the pipeline.
CGPassBuilder was mistakenly still adding them to the pipeline.
The test `llc -stop-after=greedy -enable-new-pm` would still add
`greedy` to the pipeline otherwise.
| -rw-r--r-- | llvm/include/llvm/Passes/CodeGenPassBuilder.h | 24 | ||||
| -rw-r--r-- | llvm/lib/Target/AMDGPU/AMDGPUTargetMachine.cpp | 3 | ||||
| -rw-r--r-- | llvm/test/tools/llc/new-pm/pipeline.mir | 2 | ||||
| -rw-r--r-- | llvm/test/tools/llc/new-pm/start-stop.ll | 4 |
4 files changed, 17 insertions, 16 deletions
diff --git a/llvm/include/llvm/Passes/CodeGenPassBuilder.h b/llvm/include/llvm/Passes/CodeGenPassBuilder.h index 29bc432..0a9e612 100644 --- a/llvm/include/llvm/Passes/CodeGenPassBuilder.h +++ b/llvm/include/llvm/Passes/CodeGenPassBuilder.h @@ -189,9 +189,6 @@ public: protected: template <typename PassT> - using has_required_t = decltype(std::declval<PassT &>().isRequired()); - - template <typename PassT> using is_module_pass_t = decltype(std::declval<PassT &>().run( std::declval<Module &>(), std::declval<ModuleAnalysisManager &>())); @@ -214,14 +211,12 @@ protected: ~AddIRPass() { flushFPMToMPM(); } template <typename PassT> - void operator()(PassT &&Pass, StringRef Name = PassT::name()) { + void operator()(PassT &&Pass, bool Force = false, + StringRef Name = PassT::name()) { static_assert((is_detected<is_function_pass_t, PassT>::value || is_detected<is_module_pass_t, PassT>::value) && "Only module pass and function pass are supported."); - bool Required = false; - if constexpr (is_detected<has_required_t, PassT>::value) - Required = PassT::isRequired(); - if (!PB.runBeforeAdding(Name) && !Required) + if (!Force && !PB.runBeforeAdding(Name)) return; // Add Function Pass @@ -625,9 +620,12 @@ Error CodeGenPassBuilder<Derived, TargetMachineT>::buildPipeline( { AddIRPass addIRPass(MPM, derived()); - addIRPass(RequireAnalysisPass<MachineModuleAnalysis, Module>()); - addIRPass(RequireAnalysisPass<ProfileSummaryAnalysis, Module>()); - addIRPass(RequireAnalysisPass<CollectorMetadataAnalysis, Module>()); + addIRPass(RequireAnalysisPass<MachineModuleAnalysis, Module>(), + /*Force=*/true); + addIRPass(RequireAnalysisPass<ProfileSummaryAnalysis, Module>(), + /*Force=*/true); + addIRPass(RequireAnalysisPass<CollectorMetadataAnalysis, Module>(), + /*Force=*/true); addISelPasses(addIRPass); } @@ -743,7 +741,7 @@ void CodeGenPassBuilder<Derived, TargetMachineT>::addIRPasses( // Before running any passes, run the verifier to determine if the input // coming from the front-end and/or optimizer is valid. if (!Opt.DisableVerify) - addPass(VerifierPass()); + addPass(VerifierPass(), /*Force=*/true); // Run loop strength reduction before anything else. if (getOptLevel() != CodeGenOptLevel::None && !Opt.DisableLSR) { @@ -883,7 +881,7 @@ void CodeGenPassBuilder<Derived, TargetMachineT>::addISelPrepare( // All passes which modify the LLVM IR are now complete; run the verifier // to ensure that the IR is valid. if (!Opt.DisableVerify) - addPass(VerifierPass()); + addPass(VerifierPass(), /*Force=*/true); } template <typename Derived, typename TargetMachineT> diff --git a/llvm/lib/Target/AMDGPU/AMDGPUTargetMachine.cpp b/llvm/lib/Target/AMDGPU/AMDGPUTargetMachine.cpp index 64c4e5d..92d378e 100644 --- a/llvm/lib/Target/AMDGPU/AMDGPUTargetMachine.cpp +++ b/llvm/lib/Target/AMDGPU/AMDGPUTargetMachine.cpp @@ -2147,7 +2147,8 @@ void AMDGPUCodeGenPassBuilder::addPreISel(AddIRPass &addPass) const { // FIXME: Why isn't this queried as required from AMDGPUISelDAGToDAG, and why // isn't this in addInstSelector? - addPass(RequireAnalysisPass<UniformityInfoAnalysis, Function>()); + addPass(RequireAnalysisPass<UniformityInfoAnalysis, Function>(), + /*Force=*/true); } void AMDGPUCodeGenPassBuilder::addILPOpts(AddMachinePass &addPass) const { diff --git a/llvm/test/tools/llc/new-pm/pipeline.mir b/llvm/test/tools/llc/new-pm/pipeline.mir index 1113f2a..74ba51a 100644 --- a/llvm/test/tools/llc/new-pm/pipeline.mir +++ b/llvm/test/tools/llc/new-pm/pipeline.mir @@ -1,5 +1,6 @@ # RUN: llc -mtriple=x86_64-pc-linux-gnu -x mir -passes=no-op-machine-function --print-pipeline-passes -filetype=null < %s | FileCheck %s --match-full-lines # RUN: llc -mtriple=x86_64-pc-linux-gnu -x mir -passes='require<machine-dom-tree>,print<machine-dom-tree>' -print-pipeline-passes < %s | FileCheck --check-prefix=ANALYSIS %s +# RUN: llc -mtriple=x86_64-pc-linux-gnu -x mir -enable-new-pm -stop-before=greedy -O3 -filetype=null --print-pipeline-passes < %s | FileCheck %s --check-prefix=CHECK-REQ # Check same nested pass managers # RUN: llc -mtriple=x86_64-pc-linux-gnu -x mir \ @@ -10,6 +11,7 @@ # CHECK: function(machine-function(no-op-machine-function)),PrintMIRPreparePass,function(machine-function(verify,print)) +# CHECK-REQ-NOT: greedy # ANALYSIS: require<machine-dom-tree>,print<machine-dom-tree> # NESTED: function(machine-function(machine-cp)) diff --git a/llvm/test/tools/llc/new-pm/start-stop.ll b/llvm/test/tools/llc/new-pm/start-stop.ll index 9c3b9f00..13d9663 100644 --- a/llvm/test/tools/llc/new-pm/start-stop.ll +++ b/llvm/test/tools/llc/new-pm/start-stop.ll @@ -1,5 +1,5 @@ ; RUN: llc -mtriple=x86_64-pc-linux-gnu -enable-new-pm -print-pipeline-passes -start-before=mergeicmps -stop-after=gc-lowering -filetype=null %s | FileCheck --match-full-lines %s --check-prefix=NULL ; RUN: llc -mtriple=x86_64-pc-linux-gnu -enable-new-pm -print-pipeline-passes -start-before=mergeicmps -stop-after=gc-lowering -o /dev/null %s | FileCheck --match-full-lines %s --check-prefix=OBJ -; NULL: require<MachineModuleAnalysis>,require<profile-summary>,require<collector-metadata>,function(verify,loop-mssa(loop-reduce),mergeicmps,expand-memcmp,gc-lowering,ee-instrument<post-inline>,verify) -; OBJ: require<MachineModuleAnalysis>,require<profile-summary>,require<collector-metadata>,function(verify,loop-mssa(loop-reduce),mergeicmps,expand-memcmp,gc-lowering,ee-instrument<post-inline>,verify),PrintMIRPreparePass,function(machine-function(print),invalidate<machine-function-info>) +; NULL: require<MachineModuleAnalysis>,require<profile-summary>,require<collector-metadata>,function(verify,mergeicmps,expand-memcmp,gc-lowering,verify) +; OBJ: require<MachineModuleAnalysis>,require<profile-summary>,require<collector-metadata>,function(verify,mergeicmps,expand-memcmp,gc-lowering,verify),PrintMIRPreparePass,function(machine-function(print),invalidate<machine-function-info>) |
