diff --git a/llvm/include/llvm/Passes/CodeGenPassBuilder.h b/llvm/include/llvm/Passes/CodeGenPassBuilder.h index 80b74785473f7..a252f31ec37dd 100644 --- a/llvm/include/llvm/Passes/CodeGenPassBuilder.h +++ b/llvm/include/llvm/Passes/CodeGenPassBuilder.h @@ -187,9 +187,6 @@ template class CodeGenPassBuilder { } protected: - template - using has_required_t = decltype(std::declval().isRequired()); - template using is_module_pass_t = decltype(std::declval().run( std::declval(), std::declval())); @@ -216,14 +213,12 @@ template class CodeGenPassBuilder { } template - void operator()(PassT &&Pass, StringRef Name = PassT::name()) { + void operator()(PassT &&Pass, bool Force = false, + StringRef Name = PassT::name()) { static_assert((is_detected::value || is_detected::value) && "Only module pass and function pass are supported."); - bool Required = false; - if constexpr (is_detected::value) - Required = PassT::isRequired(); - if (!PB.runBeforeAdding(Name) && !Required) + if (!Force && !PB.runBeforeAdding(Name)) return; // Add Function Pass @@ -571,9 +566,12 @@ Error CodeGenPassBuilder::buildPipeline( { AddIRPass addIRPass(MPM, derived()); - addIRPass(RequireAnalysisPass()); - addIRPass(RequireAnalysisPass()); - addIRPass(RequireAnalysisPass()); + addIRPass(RequireAnalysisPass(), + /*Force=*/true); + addIRPass(RequireAnalysisPass(), + /*Force=*/true); + addIRPass(RequireAnalysisPass(), + /*Force=*/true); addISelPasses(addIRPass); } @@ -689,7 +687,7 @@ void CodeGenPassBuilder::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) { @@ -826,7 +824,7 @@ void CodeGenPassBuilder::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 diff --git a/llvm/lib/Target/AMDGPU/AMDGPUTargetMachine.cpp b/llvm/lib/Target/AMDGPU/AMDGPUTargetMachine.cpp index 1a5f415f906e6..90659adcd13d0 100644 --- a/llvm/lib/Target/AMDGPU/AMDGPUTargetMachine.cpp +++ b/llvm/lib/Target/AMDGPU/AMDGPUTargetMachine.cpp @@ -2113,7 +2113,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()); + addPass(RequireAnalysisPass(), + /*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 761a3a424ee67..8f8e443923b7b 100644 --- a/llvm/test/tools/llc/new-pm/pipeline.mir +++ b/llvm/test/tools/llc/new-pm/pipeline.mir @@ -1,8 +1,10 @@ # 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,print' -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: function(machine-function(no-op-machine-function)),PrintMIRPreparePass,function(machine-function(verify,print)) +# CHECK-REQ-NOT: greedy # ANALYSIS: require,print --- diff --git a/llvm/test/tools/llc/new-pm/start-stop.ll b/llvm/test/tools/llc/new-pm/start-stop.ll index 9c3b9f009178f..13d9663221115 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,require,require,function(verify,loop-mssa(loop-reduce),mergeicmps,expand-memcmp,gc-lowering,ee-instrument,verify) -; OBJ: require,require,require,function(verify,loop-mssa(loop-reduce),mergeicmps,expand-memcmp,gc-lowering,ee-instrument,verify),PrintMIRPreparePass,function(machine-function(print),invalidate) +; NULL: require,require,require,function(verify,mergeicmps,expand-memcmp,gc-lowering,verify) +; OBJ: require,require,require,function(verify,mergeicmps,expand-memcmp,gc-lowering,verify),PrintMIRPreparePass,function(machine-function(print),invalidate)