[llvm-branch-commits] [WebAssembly] Port WebAssemblyPostLegalizerCombiner (PR #218101)

via llvm-branch-commits llvm-branch-commits at lists.llvm.org
Fri Aug 21 22:48:01 PDT 2026


llvmorg-github-actions[bot] wrote:


<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-backend-webassembly

Author: Aiden Grossman (boomanaiden154)

<details>
<summary>Changes</summary>

Standard NewPM pass porting. Again, we do need to move the rule parsing
into the per-MF implementation since it's hard to get the type
definition into the NewPM pass definition, but this should be low
overhead.


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


5 Files Affected:

- (modified) llvm/lib/Target/WebAssembly/GISel/WebAssemblyPostLegalizerCombiner.cpp (+57-30) 
- (modified) llvm/lib/Target/WebAssembly/WebAssembly.h (+9-2) 
- (modified) llvm/lib/Target/WebAssembly/WebAssemblyCodeGenPassBuilder.cpp (+2-4) 
- (modified) llvm/lib/Target/WebAssembly/WebAssemblyPassRegistry.def (+1) 
- (modified) llvm/lib/Target/WebAssembly/WebAssemblyTargetMachine.cpp (+2-2) 


``````````diff
diff --git a/llvm/lib/Target/WebAssembly/GISel/WebAssemblyPostLegalizerCombiner.cpp b/llvm/lib/Target/WebAssembly/GISel/WebAssemblyPostLegalizerCombiner.cpp
index d5eabb6285d88..6bf77b6cf27cb 100644
--- a/llvm/lib/Target/WebAssembly/GISel/WebAssemblyPostLegalizerCombiner.cpp
+++ b/llvm/lib/Target/WebAssembly/GISel/WebAssemblyPostLegalizerCombiner.cpp
@@ -26,8 +26,11 @@
 #include "llvm/CodeGen/GlobalISel/GISelValueTracking.h"
 #include "llvm/CodeGen/GlobalISel/MachineIRBuilder.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 "WebAssemblyGenPostLegalizeGICombiner.inc"
@@ -86,11 +89,11 @@ WebAssemblyPostLegalizerCombinerImpl::WebAssemblyPostLegalizerCombinerImpl(
 {
 }
 
-class WebAssemblyPostLegalizerCombiner : public MachineFunctionPass {
+class WebAssemblyPostLegalizerCombinerLegacy : public MachineFunctionPass {
 public:
   static char ID;
 
-  WebAssemblyPostLegalizerCombiner();
+  WebAssemblyPostLegalizerCombinerLegacy();
 
   StringRef getPassName() const override {
     return "WebAssemblyPostLegalizerCombiner";
@@ -98,13 +101,10 @@ class WebAssemblyPostLegalizerCombiner : public MachineFunctionPass {
 
   bool runOnMachineFunction(MachineFunction &MF) override;
   void getAnalysisUsage(AnalysisUsage &AU) const override;
-
-private:
-  WebAssemblyPostLegalizerCombinerImplRuleConfig RuleConfig;
 };
 } // end anonymous namespace
 
-void WebAssemblyPostLegalizerCombiner::getAnalysisUsage(
+void WebAssemblyPostLegalizerCombinerLegacy::getAnalysisUsage(
     AnalysisUsage &AU) const {
   AU.addRequired<TargetPassConfig>();
   AU.setPreservesCFG();
@@ -117,35 +117,32 @@ void WebAssemblyPostLegalizerCombiner::getAnalysisUsage(
   MachineFunctionPass::getAnalysisUsage(AU);
 }
 
-WebAssemblyPostLegalizerCombiner::WebAssemblyPostLegalizerCombiner()
-    : MachineFunctionPass(ID) {
-  if (!RuleConfig.parseCommandLineOption())
-    report_fatal_error("Invalid rule identifier");
-}
+WebAssemblyPostLegalizerCombinerLegacy::WebAssemblyPostLegalizerCombinerLegacy()
+    : MachineFunctionPass(ID) {}
 
-bool WebAssemblyPostLegalizerCombiner::runOnMachineFunction(
-    MachineFunction &MF) {
+static bool
+runCombinerOnMachineFunction(MachineFunction &MF,
+                             function_ref<bool()> ShouldSkip,
+                             function_ref<GISelValueTracking *()> GetVT,
+                             function_ref<MachineDominatorTree *()> GetMDT,
+                             function_ref<GISelCSEInfo *()> GetCSEInfo) {
   if (MF.getProperties().hasFailedISel())
     return false;
   assert(MF.getProperties().hasLegalized() && "Expected a legalized function?");
-  auto *TPC = &getAnalysis<TargetPassConfig>();
   const Function &F = MF.getFunction();
   bool EnableOpt =
-      MF.getTarget().getOptLevel() != CodeGenOptLevel::None && !skipFunction(F);
+      MF.getTarget().getOptLevel() != CodeGenOptLevel::None && !ShouldSkip;
+
+  WebAssemblyPostLegalizerCombinerImplRuleConfig RuleConfig;
+  if (!RuleConfig.parseCommandLineOption())
+    reportFatalUsageError("Invalid rule identifier");
 
   const WebAssemblySubtarget &ST = MF.getSubtarget<WebAssemblySubtarget>();
   const auto *LI = ST.getLegalizerInfo();
 
-  GISelValueTracking *VT =
-      &getAnalysis<GISelValueTrackingAnalysisLegacy>().get(MF);
-  MachineDominatorTree *MDT = nullptr;
-  GISelCSEInfo *CSEInfo = nullptr;
-
-  MDT = &getAnalysis<MachineDominatorTreeWrapperPass>().getDomTree();
-
-  GISelCSEAnalysisWrapper &Wrapper =
-      getAnalysis<GISelCSEAnalysisWrapperPass>().getCSEWrapper();
-  CSEInfo = &Wrapper.get(TPC->getCSEConfig());
+  GISelValueTracking *VT = GetVT();
+  MachineDominatorTree *MDT = GetMDT();
+  GISelCSEInfo *CSEInfo = GetCSEInfo();
 
   CombinerInfo CInfo(/*AllowIllegalOps*/ true, /*ShouldLegalizeIllegal*/ false,
                      /*LegalizerInfo*/ nullptr, EnableOpt, F.hasOptSize(),
@@ -160,16 +157,46 @@ bool WebAssemblyPostLegalizerCombiner::runOnMachineFunction(
   return Impl.combineMachineInstrs();
 }
 
-char WebAssemblyPostLegalizerCombiner::ID = 0;
-INITIALIZE_PASS_BEGIN(WebAssemblyPostLegalizerCombiner, DEBUG_TYPE,
+char WebAssemblyPostLegalizerCombinerLegacy::ID = 0;
+INITIALIZE_PASS_BEGIN(WebAssemblyPostLegalizerCombinerLegacy, DEBUG_TYPE,
                       "Combine WebAssembly MachineInstrs after legalization",
                       false, false)
 INITIALIZE_PASS_DEPENDENCY(TargetPassConfig)
 INITIALIZE_PASS_DEPENDENCY(GISelValueTrackingAnalysisLegacy)
-INITIALIZE_PASS_END(WebAssemblyPostLegalizerCombiner, DEBUG_TYPE,
+INITIALIZE_PASS_END(WebAssemblyPostLegalizerCombinerLegacy, DEBUG_TYPE,
                     "Combine WebAssembly MachineInstrs after legalization",
                     false, false)
 
-FunctionPass *llvm::createWebAssemblyPostLegalizerCombiner() {
-  return new WebAssemblyPostLegalizerCombiner();
+FunctionPass *llvm::createWebAssemblyPostLegalizerCombinerLegacyPass() {
+  return new WebAssemblyPostLegalizerCombinerLegacy();
+}
+
+bool WebAssemblyPostLegalizerCombinerLegacy::runOnMachineFunction(
+    MachineFunction &MF) {
+  return runCombinerOnMachineFunction(
+      MF, [&]() { return skipFunction(MF.getFunction()); },
+      [&]() {
+        return &getAnalysis<GISelValueTrackingAnalysisLegacy>().get(MF);
+      },
+      [&]() {
+        return &getAnalysis<MachineDominatorTreeWrapperPass>().getDomTree();
+      },
+      [&]() {
+        TargetPassConfig *TPC = &getAnalysis<TargetPassConfig>();
+        GISelCSEAnalysisWrapper &Wrapper =
+            getAnalysis<GISelCSEAnalysisWrapperPass>().getCSEWrapper();
+        return &Wrapper.get(TPC->getCSEConfig());
+      });
+}
+
+PreservedAnalyses WebAssemblyPostLegalizerCombinerPass::run(
+    MachineFunction &MF, MachineFunctionAnalysisManager &MFAM) {
+  bool Changed = runCombinerOnMachineFunction(
+      MF, [&]() { return MF.getFunction().hasOptNone(); },
+      [&]() { return &MFAM.getResult<GISelValueTrackingAnalysis>(MF); },
+      [&]() { return &MFAM.getResult<MachineDominatorTreeAnalysis>(MF); },
+      [&]() { return MFAM.getResult<GISelCSEAnalysis>(MF).get(); });
+  return Changed ? getMachineFunctionPassPreservedAnalyses()
+                       .preserveSet<CFGAnalyses>()
+                 : PreservedAnalyses::all();
 }
diff --git a/llvm/lib/Target/WebAssembly/WebAssembly.h b/llvm/lib/Target/WebAssembly/WebAssembly.h
index a899da2ecfb73..94628d0944f8d 100644
--- a/llvm/lib/Target/WebAssembly/WebAssembly.h
+++ b/llvm/lib/Target/WebAssembly/WebAssembly.h
@@ -108,8 +108,14 @@ createWebAssemblyInstructionSelector(const WebAssemblyTargetMachine &,
                                      const WebAssemblySubtarget &,
                                      const WebAssemblyRegisterBankInfo &);
 
-FunctionPass *createWebAssemblyPostLegalizerCombiner();
-void initializeWebAssemblyPostLegalizerCombinerPass(PassRegistry &);
+class WebAssemblyPostLegalizerCombinerPass
+    : public RequiredPassInfoMixin<WebAssemblyPostLegalizerCombinerPass> {
+public:
+  PreservedAnalyses run(MachineFunction &MF,
+                        MachineFunctionAnalysisManager &MFAM);
+};
+
+FunctionPass *createWebAssemblyPostLegalizerCombinerLegacyPass();
 
 class WebAssemblyPreLegalizerCombinerPass
     : public RequiredPassInfoMixin<WebAssemblyPreLegalizerCombinerPass> {
@@ -339,6 +345,7 @@ void initializeWebAssemblyMemIntrinsicResultsLegacyPass(PassRegistry &);
 void initializeWebAssemblyNullifyDebugValueListsLegacyPass(PassRegistry &);
 void initializeWebAssemblyOptimizeLiveIntervalsLegacyPass(PassRegistry &);
 void initializeWebAssemblyPeepholeLegacyPass(PassRegistry &);
+void initializeWebAssemblyPostLegalizerCombinerLegacyPass(PassRegistry &);
 void initializeWebAssemblyPreLegalizerCombinerLegacyPass(PassRegistry &);
 void initializeWebAssemblyRegColoringLegacyPass(PassRegistry &);
 void initializeWebAssemblyRegNumberingLegacyPass(PassRegistry &);
diff --git a/llvm/lib/Target/WebAssembly/WebAssemblyCodeGenPassBuilder.cpp b/llvm/lib/Target/WebAssembly/WebAssemblyCodeGenPassBuilder.cpp
index 106c91c89f9bd..7fecb163625cf 100644
--- a/llvm/lib/Target/WebAssembly/WebAssemblyCodeGenPassBuilder.cpp
+++ b/llvm/lib/Target/WebAssembly/WebAssemblyCodeGenPassBuilder.cpp
@@ -209,10 +209,8 @@ Error WebAssemblyCodeGenPassBuilder::addLegalizeMachineIR(
 
 void WebAssemblyCodeGenPassBuilder::addPreRegBankSelect(
     PassManagerWrapper &PMW) {
-  if (getOptLevel() != CodeGenOptLevel::None) {
-    // TODO(boomanaiden154): Add WebAssemblyPostLegalizerCombiner when it has
-    // been ported.
-  }
+  if (getOptLevel() != CodeGenOptLevel::None)
+    addMachineFunctionPass(WebAssemblyPostLegalizerCombinerPass(), PMW);
 }
 
 Error WebAssemblyCodeGenPassBuilder::addRegBankSelect(PassManagerWrapper &PMW) {
diff --git a/llvm/lib/Target/WebAssembly/WebAssemblyPassRegistry.def b/llvm/lib/Target/WebAssembly/WebAssemblyPassRegistry.def
index 6bfc64195af72..a70603ef47ae3 100644
--- a/llvm/lib/Target/WebAssembly/WebAssemblyPassRegistry.def
+++ b/llvm/lib/Target/WebAssembly/WebAssemblyPassRegistry.def
@@ -67,6 +67,7 @@ MACHINE_FUNCTION_PASS("wasm-nullify-dbg-value-lists",
 MACHINE_FUNCTION_PASS("wasm-optimize-live-intervals",
                       WebAssemblyOptimizeLiveIntervalsPass())
 MACHINE_FUNCTION_PASS("wasm-peephole", WebAssemblyPeepholePass())
+MACHINE_FUNCTION_PASS("wasm-postlegalizer-combiner", WebAssemblyPostLegalizerCombinerPass())
 MACHINE_FUNCTION_PASS("wasm-prelegalizer-combiner", WebAssemblyPreLegalizerCombinerPass())
 MACHINE_FUNCTION_PASS("wasm-reg-coloring", WebAssemblyRegColoringPass())
 MACHINE_FUNCTION_PASS("wasm-reg-numbering", WebAssemblyRegNumberingPass())
diff --git a/llvm/lib/Target/WebAssembly/WebAssemblyTargetMachine.cpp b/llvm/lib/Target/WebAssembly/WebAssemblyTargetMachine.cpp
index 265ff20244f87..d0356fbb8d7ba 100644
--- a/llvm/lib/Target/WebAssembly/WebAssemblyTargetMachine.cpp
+++ b/llvm/lib/Target/WebAssembly/WebAssemblyTargetMachine.cpp
@@ -92,7 +92,7 @@ LLVMInitializeWebAssemblyTarget() {
   auto &PR = *PassRegistry::getPassRegistry();
   initializeGlobalISel(PR);
   initializeWebAssemblyPreLegalizerCombinerLegacyPass(PR);
-  initializeWebAssemblyPostLegalizerCombinerPass(PR);
+  initializeWebAssemblyPostLegalizerCombinerLegacyPass(PR);
   initializeWebAssemblyAddMissingPrototypesLegacyPass(PR);
   initializeWebAssemblyLowerEmscriptenEHSjLjLegacyPass(PR);
   initializeLowerGlobalDtorsLegacyPassPass(PR);
@@ -532,7 +532,7 @@ bool WebAssemblyPassConfig::addLegalizeMachineIR() {
 
 void WebAssemblyPassConfig::addPreRegBankSelect() {
   if (getOptLevel() != CodeGenOptLevel::None) {
-    addPass(createWebAssemblyPostLegalizerCombiner());
+    addPass(createWebAssemblyPostLegalizerCombinerLegacyPass());
   }
 }
 

``````````

</details>


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


More information about the llvm-branch-commits mailing list