[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