[llvm-branch-commits] [SPIRV][NewPM] Port SPIRVPreLegalizerCombiner (PR #219108)

via llvm-branch-commits llvm-branch-commits at lists.llvm.org
Wed Aug 26 21:38:31 PDT 2026


llvmorg-github-actions[bot] wrote:


<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-backend-spir-v

Author: Aiden Grossman (boomanaiden154)

<details>
<summary>Changes</summary>

Standard NewPM pass porting. We do need to move the rule config parsing
into being per MF, but this should not be a noticeable regression.


---
Full diff: https://github.com/llvm/llvm-project/pull/219108.diff


5 Files Affected:

- (modified) llvm/lib/Target/SPIRV/SPIRV.h (+10-2) 
- (modified) llvm/lib/Target/SPIRV/SPIRVCodeGenPassBuilder.cpp (+1-2) 
- (modified) llvm/lib/Target/SPIRV/SPIRVPassRegistry.def (+1) 
- (modified) llvm/lib/Target/SPIRV/SPIRVPreLegalizerCombiner.cpp (+51-22) 
- (modified) llvm/lib/Target/SPIRV/SPIRVTargetMachine.cpp (+2-2) 


``````````diff
diff --git a/llvm/lib/Target/SPIRV/SPIRV.h b/llvm/lib/Target/SPIRV/SPIRV.h
index cb6405a0ee785..cbf951443f0bf 100644
--- a/llvm/lib/Target/SPIRV/SPIRV.h
+++ b/llvm/lib/Target/SPIRV/SPIRV.h
@@ -127,7 +127,15 @@ class SPIRVPreLegalizerPass
 };
 
 FunctionPass *createSPIRVPreLegalizerLegacyPass();
-FunctionPass *createSPIRVPreLegalizerCombiner();
+
+class SPIRVPreLegalizerCombinerPass
+    : public RequiredPassInfoMixin<SPIRVPreLegalizerCombinerPass> {
+public:
+  PreservedAnalyses run(MachineFunction &MF,
+                        MachineFunctionAnalysisManager &MFAM);
+};
+
+FunctionPass *createSPIRVPreLegalizerCombinerLegacyPass();
 FunctionPass *createSPIRVPostLegalizerPass();
 
 class SPIRVEmitIntrinsicsPass
@@ -166,7 +174,7 @@ void initializeSPIRVModuleAnalysisPass(PassRegistry &);
 void initializeSPIRVAsmPrinterPass(PassRegistry &);
 void initializeSPIRVConvergenceRegionAnalysisWrapperPassPass(PassRegistry &);
 void initializeSPIRVPreLegalizerLegacyPass(PassRegistry &);
-void initializeSPIRVPreLegalizerCombinerPass(PassRegistry &);
+void initializeSPIRVPreLegalizerCombinerLegacyPass(PassRegistry &);
 void initializeSPIRVPostLegalizerPass(PassRegistry &);
 void initializeSPIRVStructurizerPass(PassRegistry &);
 void initializeSPIRVCBufferAccessLegacyPass(PassRegistry &);
diff --git a/llvm/lib/Target/SPIRV/SPIRVCodeGenPassBuilder.cpp b/llvm/lib/Target/SPIRV/SPIRVCodeGenPassBuilder.cpp
index 08bf905075f30..e01b8c296f0d8 100644
--- a/llvm/lib/Target/SPIRV/SPIRVCodeGenPassBuilder.cpp
+++ b/llvm/lib/Target/SPIRV/SPIRVCodeGenPassBuilder.cpp
@@ -151,8 +151,7 @@ Error SPIRVCodeGenPassBuilder::addIRTranslator(PassManagerWrapper &PMW) {
 }
 
 void SPIRVCodeGenPassBuilder::addPreLegalizeMachineIR(PassManagerWrapper &PMW) {
-  // TODO(boomanaiden154): Add SPIRVPreLegalizerCombiner when it has been
-  // ported.
+  addMachineFunctionPass(SPIRVPreLegalizerCombinerPass(), PMW);
   addMachineFunctionPass(SPIRVPreLegalizerPass(), PMW);
 }
 
diff --git a/llvm/lib/Target/SPIRV/SPIRVPassRegistry.def b/llvm/lib/Target/SPIRV/SPIRVPassRegistry.def
index 1135f48cecba4..b759ab117f98c 100644
--- a/llvm/lib/Target/SPIRV/SPIRVPassRegistry.def
+++ b/llvm/lib/Target/SPIRV/SPIRVPassRegistry.def
@@ -46,4 +46,5 @@ FUNCTION_ANALYSIS("spirv-convergence-region", SPIRVConvergenceRegionAnalysis())
 #define MACHINE_FUNCTION_PASS(NAME, CREATE_PASS)
 #endif
 MACHINE_FUNCTION_PASS("spirv-prelegalizer", SPIRVPreLegalizerPass())
+MACHINE_FUNCTION_PASS("spirv-prelegalizer-combiner", SPIRVPreLegalizerCombinerPass())
 #undef MACHINE_FUNCTION_PASS
diff --git a/llvm/lib/Target/SPIRV/SPIRVPreLegalizerCombiner.cpp b/llvm/lib/Target/SPIRV/SPIRVPreLegalizerCombiner.cpp
index c7d90f51046d4..1e1fbe75f53c2 100644
--- a/llvm/lib/Target/SPIRV/SPIRVPreLegalizerCombiner.cpp
+++ b/llvm/lib/Target/SPIRV/SPIRVPreLegalizerCombiner.cpp
@@ -21,8 +21,11 @@
 #include "llvm/CodeGen/GlobalISel/GISelValueTracking.h"
 #include "llvm/CodeGen/GlobalISel/MIPatternMatch.h"
 #include "llvm/CodeGen/MachineDominators.h"
+#include "llvm/CodeGen/MachineFunctionAnalysisManager.h"
 #include "llvm/CodeGen/MachineFunctionPass.h"
+#include "llvm/CodeGen/MachinePassManager.h"
 #include "llvm/CodeGen/TargetPassConfig.h"
+#include "llvm/IR/Analysis.h"
 
 #define GET_GICOMBINER_DEPS
 #include "SPIRVGenPreLegalizeGICombiner.inc"
@@ -91,25 +94,23 @@ bool SPIRVPreLegalizerCombinerImpl::tryCombineAll(MachineInstr &MI) const {
 // Pass boilerplate
 // ================
 
-class SPIRVPreLegalizerCombiner : public MachineFunctionPass {
+class SPIRVPreLegalizerCombinerLegacy : public MachineFunctionPass {
 public:
   static char ID;
 
-  SPIRVPreLegalizerCombiner();
+  SPIRVPreLegalizerCombinerLegacy();
 
   StringRef getPassName() const override { return "SPIRVPreLegalizerCombiner"; }
 
   bool runOnMachineFunction(MachineFunction &MF) override;
 
   void getAnalysisUsage(AnalysisUsage &AU) const override;
-
-private:
-  SPIRVPreLegalizerCombinerImplRuleConfig RuleConfig;
 };
 
 } // end anonymous namespace
 
-void SPIRVPreLegalizerCombiner::getAnalysisUsage(AnalysisUsage &AU) const {
+void SPIRVPreLegalizerCombinerLegacy::getAnalysisUsage(
+    AnalysisUsage &AU) const {
   AU.setPreservesCFG();
   getSelectionDAGFallbackAnalysisUsage(AU);
   AU.addRequired<GISelValueTrackingAnalysisLegacy>();
@@ -118,26 +119,28 @@ void SPIRVPreLegalizerCombiner::getAnalysisUsage(AnalysisUsage &AU) const {
   MachineFunctionPass::getAnalysisUsage(AU);
 }
 
-SPIRVPreLegalizerCombiner::SPIRVPreLegalizerCombiner()
-    : MachineFunctionPass(ID) {
-  if (!RuleConfig.parseCommandLineOption())
-    report_fatal_error("Invalid rule identifier");
-}
+SPIRVPreLegalizerCombinerLegacy::SPIRVPreLegalizerCombinerLegacy()
+    : MachineFunctionPass(ID) {}
 
-bool SPIRVPreLegalizerCombiner::runOnMachineFunction(MachineFunction &MF) {
+static bool
+runPreLegalizerCombiner(MachineFunction &MF, bool ShouldSkip,
+                        function_ref<GISelValueTracking *()> GetVT,
+                        function_ref<MachineDominatorTree *()> GetMDT) {
   if (MF.getProperties().hasFailedISel())
     return false;
 
+  SPIRVPreLegalizerCombinerImplRuleConfig RuleConfig;
+  if (!RuleConfig.parseCommandLineOption())
+    reportFatalUsageError("Invalid rule identifier");
+
   const SPIRVSubtarget &ST = MF.getSubtarget<SPIRVSubtarget>();
   const auto *LI = ST.getLegalizerInfo();
 
   const Function &F = MF.getFunction();
   bool EnableOpt =
-      MF.getTarget().getOptLevel() != CodeGenOptLevel::None && !skipFunction(F);
-  GISelValueTracking *VT =
-      &getAnalysis<GISelValueTrackingAnalysisLegacy>().get(MF);
-  MachineDominatorTree *MDT =
-      &getAnalysis<MachineDominatorTreeWrapperPass>().getDomTree();
+      MF.getTarget().getOptLevel() != CodeGenOptLevel::None && !ShouldSkip;
+  GISelValueTracking *VT = GetVT();
+  MachineDominatorTree *MDT = GetMDT();
   CombinerInfo CInfo(/*AllowIllegalOps*/ true, /*ShouldLegalizeIllegal*/ false,
                      /*LegalizerInfo*/ nullptr, EnableOpt, F.hasOptSize(),
                      F.hasMinSize());
@@ -152,17 +155,43 @@ bool SPIRVPreLegalizerCombiner::runOnMachineFunction(MachineFunction &MF) {
   return Impl.combineMachineInstrs();
 }
 
-char SPIRVPreLegalizerCombiner::ID = 0;
-INITIALIZE_PASS_BEGIN(SPIRVPreLegalizerCombiner, DEBUG_TYPE,
+char SPIRVPreLegalizerCombinerLegacy::ID = 0;
+INITIALIZE_PASS_BEGIN(SPIRVPreLegalizerCombinerLegacy, DEBUG_TYPE,
                       "Combine SPIRV machine instrs before legalization", false,
                       false)
 INITIALIZE_PASS_DEPENDENCY(GISelValueTrackingAnalysisLegacy)
-INITIALIZE_PASS_END(SPIRVPreLegalizerCombiner, DEBUG_TYPE,
+INITIALIZE_PASS_END(SPIRVPreLegalizerCombinerLegacy, DEBUG_TYPE,
                     "Combine SPIRV machine instrs before legalization", false,
                     false)
 
 namespace llvm {
-FunctionPass *createSPIRVPreLegalizerCombiner() {
-  return new SPIRVPreLegalizerCombiner();
+FunctionPass *createSPIRVPreLegalizerCombinerLegacyPass() {
+  return new SPIRVPreLegalizerCombinerLegacy();
 }
 } // end namespace llvm
+
+bool SPIRVPreLegalizerCombinerLegacy::runOnMachineFunction(
+    MachineFunction &MF) {
+  return runPreLegalizerCombiner(
+      MF, skipFunction(MF.getFunction()),
+      [&]() {
+        return &getAnalysis<GISelValueTrackingAnalysisLegacy>().get(MF);
+      },
+      [&]() {
+        return &getAnalysis<MachineDominatorTreeWrapperPass>().getDomTree();
+      });
+}
+
+PreservedAnalyses
+SPIRVPreLegalizerCombinerPass::run(MachineFunction &MF,
+                                   MachineFunctionAnalysisManager &MFAM) {
+  bool Changed = runPreLegalizerCombiner(
+      MF, MF.getFunction().hasOptNone(),
+      [&]() { return &MFAM.getResult<GISelValueTrackingAnalysis>(MF); },
+      [&]() { return &MFAM.getResult<MachineDominatorTreeAnalysis>(MF); });
+  if (!Changed)
+    return PreservedAnalyses::all();
+  return getMachineFunctionPassPreservedAnalyses()
+      .preserveSet<CFGAnalyses>()
+      .preserve<GISelValueTrackingAnalysis>();
+}
diff --git a/llvm/lib/Target/SPIRV/SPIRVTargetMachine.cpp b/llvm/lib/Target/SPIRV/SPIRVTargetMachine.cpp
index 7482919967c1a..e69eaab88c369 100644
--- a/llvm/lib/Target/SPIRV/SPIRVTargetMachine.cpp
+++ b/llvm/lib/Target/SPIRV/SPIRVTargetMachine.cpp
@@ -52,7 +52,7 @@ extern "C" LLVM_ABI LLVM_EXTERNAL_VISIBILITY void LLVMInitializeSPIRVTarget() {
   initializeSPIRVStructurizerPass(PR);
   initializeSPIRVCBufferAccessLegacyPass(PR);
   initializeSPIRVPushConstantAccessLegacyPass(PR);
-  initializeSPIRVPreLegalizerCombinerPass(PR);
+  initializeSPIRVPreLegalizerCombinerLegacyPass(PR);
   initializeSPIRVLegalizePointerCastLegacyPass(PR);
   initializeSPIRVLegalizeZeroSizeArraysLegacyPass(PR);
   initializeSPIRVRegularizerLegacyPass(PR);
@@ -240,7 +240,7 @@ bool SPIRVPassConfig::addIRTranslator() {
 }
 
 void SPIRVPassConfig::addPreLegalizeMachineIR() {
-  addPass(createSPIRVPreLegalizerCombiner());
+  addPass(createSPIRVPreLegalizerCombinerLegacyPass());
   addPass(createSPIRVPreLegalizerLegacyPass());
 }
 

``````````

</details>


https://github.com/llvm/llvm-project/pull/219108


More information about the llvm-branch-commits mailing list