[llvm] 90bed50 - [WebAssembly] Port WebAssemblyExplicitLocalsPass
via llvm-commits
llvm-commits at lists.llvm.org
Wed Jul 22 20:53:26 PDT 2026
Author: Aiden Grossman
Date: 2026-07-22T20:53:21-07:00
New Revision: 90bed5073e12836f8511c6d8dd7c553345b87f7a
URL: https://github.com/llvm/llvm-project/commit/90bed5073e12836f8511c6d8dd7c553345b87f7a
DIFF: https://github.com/llvm/llvm-project/commit/90bed5073e12836f8511c6d8dd7c553345b87f7a.diff
LOG: [WebAssembly] Port WebAssemblyExplicitLocalsPass
Standard NewPM pass porting.
Reviewers: dschuff, aheejin, sbc100
Pull Request: https://github.com/llvm/llvm-project/pull/210256
Added:
Modified:
llvm/lib/Target/WebAssembly/WebAssembly.h
llvm/lib/Target/WebAssembly/WebAssemblyCodeGenPassBuilder.cpp
llvm/lib/Target/WebAssembly/WebAssemblyExplicitLocals.cpp
llvm/lib/Target/WebAssembly/WebAssemblyPassRegistry.def
llvm/lib/Target/WebAssembly/WebAssemblyTargetMachine.cpp
Removed:
################################################################################
diff --git a/llvm/lib/Target/WebAssembly/WebAssembly.h b/llvm/lib/Target/WebAssembly/WebAssembly.h
index 91c88282ca8a9..8c0e3504d2b83 100644
--- a/llvm/lib/Target/WebAssembly/WebAssembly.h
+++ b/llvm/lib/Target/WebAssembly/WebAssembly.h
@@ -255,7 +255,15 @@ class WebAssemblyCFGStackifyPass
};
FunctionPass *createWebAssemblyCFGStackifyLegacyPass();
-FunctionPass *createWebAssemblyExplicitLocals();
+
+class WebAssemblyExplicitLocalsPass
+ : public RequiredPassInfoMixin<WebAssemblyExplicitLocalsPass> {
+public:
+ PreservedAnalyses run(MachineFunction &MF,
+ MachineFunctionAnalysisManager &MFAM);
+};
+
+FunctionPass *createWebAssemblyExplicitLocalsLegacyPass();
FunctionPass *createWebAssemblyLowerBrUnless();
FunctionPass *createWebAssemblyRegNumbering();
FunctionPass *createWebAssemblyVecReduce();
@@ -275,7 +283,7 @@ void initializeWebAssemblyCFGStackifyLegacyPass(PassRegistry &);
void initializeWebAssemblyDAGToDAGISelLegacyPass(PassRegistry &);
void initializeWebAssemblyDebugFixupPass(PassRegistry &);
void initializeWebAssemblyExceptionInfoWrapperPassPass(PassRegistry &);
-void initializeWebAssemblyExplicitLocalsPass(PassRegistry &);
+void initializeWebAssemblyExplicitLocalsLegacyPass(PassRegistry &);
void initializeWebAssemblyFixBrTableDefaultsLegacyPass(PassRegistry &);
void initializeWebAssemblyFixFunctionBitcastsLegacyPass(PassRegistry &);
void initializeWebAssemblyFixIrreducibleControlFlowLegacyPass(PassRegistry &);
diff --git a/llvm/lib/Target/WebAssembly/WebAssemblyCodeGenPassBuilder.cpp b/llvm/lib/Target/WebAssembly/WebAssemblyCodeGenPassBuilder.cpp
index 9cdb42b3ca9eb..9a31d2ab0d075 100644
--- a/llvm/lib/Target/WebAssembly/WebAssemblyCodeGenPassBuilder.cpp
+++ b/llvm/lib/Target/WebAssembly/WebAssemblyCodeGenPassBuilder.cpp
@@ -223,9 +223,8 @@ void WebAssemblyCodeGenPassBuilder::addPreEmitPass(
addMachineFunctionPass(WebAssemblyCFGStackifyPass(), PMW);
// Insert explicit local.get and local.set operators.
- if (!WasmDisableExplicitLocals) {
- // TODO(boomanaiden154): WebAssemblyExplicitLocals
- }
+ if (!WasmDisableExplicitLocals)
+ addMachineFunctionPass(WebAssemblyExplicitLocalsPass(), PMW);
// Lower br_unless into br_if.
// TODO(boomanaiden154): WebAssemblyLowerBrUnless
diff --git a/llvm/lib/Target/WebAssembly/WebAssemblyExplicitLocals.cpp b/llvm/lib/Target/WebAssembly/WebAssemblyExplicitLocals.cpp
index e05b23d255894..55bb28c1d6483 100644
--- a/llvm/lib/Target/WebAssembly/WebAssemblyExplicitLocals.cpp
+++ b/llvm/lib/Target/WebAssembly/WebAssemblyExplicitLocals.cpp
@@ -22,9 +22,12 @@
#include "WebAssemblySubtarget.h"
#include "WebAssemblyUtilities.h"
#include "llvm/CodeGen/MachineBlockFrequencyInfo.h"
+#include "llvm/CodeGen/MachineFunctionAnalysisManager.h"
#include "llvm/CodeGen/MachineInstrBuilder.h"
+#include "llvm/CodeGen/MachinePassManager.h"
#include "llvm/CodeGen/MachineRegisterInfo.h"
#include "llvm/CodeGen/Passes.h"
+#include "llvm/IR/Analysis.h"
#include "llvm/Support/Debug.h"
#include "llvm/Support/raw_ostream.h"
using namespace llvm;
@@ -32,7 +35,7 @@ using namespace llvm;
#define DEBUG_TYPE "wasm-explicit-locals"
namespace {
-class WebAssemblyExplicitLocals final : public MachineFunctionPass {
+class WebAssemblyExplicitLocalsLegacy final : public MachineFunctionPass {
StringRef getPassName() const override {
return "WebAssembly Explicit Locals";
}
@@ -47,16 +50,16 @@ class WebAssemblyExplicitLocals final : public MachineFunctionPass {
public:
static char ID; // Pass identification, replacement for typeid
- WebAssemblyExplicitLocals() : MachineFunctionPass(ID) {}
+ WebAssemblyExplicitLocalsLegacy() : MachineFunctionPass(ID) {}
};
} // end anonymous namespace
-char WebAssemblyExplicitLocals::ID = 0;
-INITIALIZE_PASS(WebAssemblyExplicitLocals, DEBUG_TYPE,
+char WebAssemblyExplicitLocalsLegacy::ID = 0;
+INITIALIZE_PASS(WebAssemblyExplicitLocalsLegacy, DEBUG_TYPE,
"Convert registers to WebAssembly locals", false, false)
-FunctionPass *llvm::createWebAssemblyExplicitLocals() {
- return new WebAssemblyExplicitLocals();
+FunctionPass *llvm::createWebAssemblyExplicitLocalsLegacyPass() {
+ return new WebAssemblyExplicitLocalsLegacy();
}
static void checkFrameBase(WebAssemblyFunctionInfo &MFI, unsigned Local,
@@ -228,7 +231,7 @@ static void removeFakeUses(MachineFunction &MF) {
MI->eraseFromParent();
}
-bool WebAssemblyExplicitLocals::runOnMachineFunction(MachineFunction &MF) {
+static bool explicitLocals(MachineFunction &MF) {
LLVM_DEBUG(dbgs() << "********** Make Locals Explicit **********\n"
"********** Function: "
<< MF.getName() << '\n');
@@ -500,3 +503,16 @@ bool WebAssemblyExplicitLocals::runOnMachineFunction(MachineFunction &MF) {
return Changed;
}
+
+bool WebAssemblyExplicitLocalsLegacy::runOnMachineFunction(
+ MachineFunction &MF) {
+ return explicitLocals(MF);
+}
+
+PreservedAnalyses
+WebAssemblyExplicitLocalsPass::run(MachineFunction &MF,
+ MachineFunctionAnalysisManager &MFAM) {
+ return explicitLocals(MF) ? getMachineFunctionPassPreservedAnalyses()
+ .preserveSet<CFGAnalyses>()
+ : PreservedAnalyses::all();
+}
diff --git a/llvm/lib/Target/WebAssembly/WebAssemblyPassRegistry.def b/llvm/lib/Target/WebAssembly/WebAssemblyPassRegistry.def
index 467a88e28cb34..aa7819d59f450 100644
--- a/llvm/lib/Target/WebAssembly/WebAssemblyPassRegistry.def
+++ b/llvm/lib/Target/WebAssembly/WebAssemblyPassRegistry.def
@@ -43,6 +43,7 @@ MACHINE_FUNCTION_PASS("wasm-cfg-sort", WebAssemblyCFGSortPass())
MACHINE_FUNCTION_PASS("wasm-cfg-stackify", WebAssemblyCFGStackifyPass())
MACHINE_FUNCTION_PASS("wasm-clean-code-after-trap",
WebAssemblyCleanCodeAfterTrapPass())
+MACHINE_FUNCTION_PASS("wasm-explicit-locals", WebAssemblyExplicitLocalsPass())
MACHINE_FUNCTION_PASS("wasm-isel", WebAssemblyISelDAGToDAGPass(*this, getOptLevel()))
MACHINE_FUNCTION_PASS("wasm-fix-br-table-defaults",
WebAssemblyFixBrTableDefaultsPass())
diff --git a/llvm/lib/Target/WebAssembly/WebAssemblyTargetMachine.cpp b/llvm/lib/Target/WebAssembly/WebAssemblyTargetMachine.cpp
index ac242f34c3971..aef29b428ee85 100644
--- a/llvm/lib/Target/WebAssembly/WebAssemblyTargetMachine.cpp
+++ b/llvm/lib/Target/WebAssembly/WebAssemblyTargetMachine.cpp
@@ -113,7 +113,7 @@ LLVMInitializeWebAssemblyTarget() {
initializeWebAssemblyExceptionInfoWrapperPassPass(PR);
initializeWebAssemblyCFGSortLegacyPass(PR);
initializeWebAssemblyCFGStackifyLegacyPass(PR);
- initializeWebAssemblyExplicitLocalsPass(PR);
+ initializeWebAssemblyExplicitLocalsLegacyPass(PR);
initializeWebAssemblyLowerBrUnlessPass(PR);
initializeWebAssemblyRegNumberingPass(PR);
initializeWebAssemblyDebugFixupPass(PR);
@@ -490,7 +490,7 @@ void WebAssemblyPassConfig::addPreEmitPass() {
// Insert explicit local.get and local.set operators.
if (!WasmDisableExplicitLocals)
- addPass(createWebAssemblyExplicitLocals());
+ addPass(createWebAssemblyExplicitLocalsLegacyPass());
// Lower br_unless into br_if.
addPass(createWebAssemblyLowerBrUnless());
More information about the llvm-commits
mailing list