[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