[llvm] 8396c75 - [WebAssembly] Port WebAssemblyRefTypeMem2LocalPass
via llvm-commits
llvm-commits at lists.llvm.org
Wed Jul 15 07:00:36 PDT 2026
Author: Aiden Grossman
Date: 2026-07-15T07:00:31-07:00
New Revision: 8396c758875a11a57a4b6a2b6b06b719c1b2ab1b
URL: https://github.com/llvm/llvm-project/commit/8396c758875a11a57a4b6a2b6b06b719c1b2ab1b
DIFF: https://github.com/llvm/llvm-project/commit/8396c758875a11a57a4b6a2b6b06b719c1b2ab1b.diff
LOG: [WebAssembly] Port WebAssemblyRefTypeMem2LocalPass
Standard NewPM pass porting.
Reviewers: sbc100, aheejin, dschuff
Pull Request: https://github.com/llvm/llvm-project/pull/209044
Added:
Modified:
llvm/lib/Target/WebAssembly/WebAssembly.h
llvm/lib/Target/WebAssembly/WebAssemblyCodeGenPassBuilder.cpp
llvm/lib/Target/WebAssembly/WebAssemblyPassRegistry.def
llvm/lib/Target/WebAssembly/WebAssemblyRefTypeMem2Local.cpp
llvm/lib/Target/WebAssembly/WebAssemblyTargetMachine.cpp
Removed:
################################################################################
diff --git a/llvm/lib/Target/WebAssembly/WebAssembly.h b/llvm/lib/Target/WebAssembly/WebAssembly.h
index bfc2107858165..933062c86c8eb 100644
--- a/llvm/lib/Target/WebAssembly/WebAssembly.h
+++ b/llvm/lib/Target/WebAssembly/WebAssembly.h
@@ -62,7 +62,14 @@ class WebAssemblyOptimizeReturnedPass
};
FunctionPass *createWebAssemblyOptimizeReturnedLegacyPass();
-FunctionPass *createWebAssemblyRefTypeMem2Local();
+
+class WebAssemblyRefTypeMem2LocalPass
+ : public RequiredPassInfoMixin<WebAssemblyRefTypeMem2LocalPass> {
+public:
+ PreservedAnalyses run(Function &F, FunctionAnalysisManager &FAM);
+};
+
+FunctionPass *createWebAssemblyRefTypeMem2LocalLegacyPass();
class WebAssemblyReduceToAnyAllTruePass
: public RequiredPassInfoMixin<WebAssemblyReduceToAnyAllTruePass> {
@@ -126,7 +133,7 @@ ModulePass *createWebAssemblyMCLowerPrePass();
// PassRegistry initialization declarations.
void initializeWebAssemblyOptimizeReturnedLegacyPass(PassRegistry &);
-void initializeWebAssemblyRefTypeMem2LocalPass(PassRegistry &);
+void initializeWebAssemblyRefTypeMem2LocalLegacyPass(PassRegistry &);
void initializeWebAssemblyAddMissingPrototypesLegacyPass(PassRegistry &);
void initializeWebAssemblyArgumentMovePass(PassRegistry &);
void initializeWebAssemblyAsmPrinterPass(PassRegistry &);
diff --git a/llvm/lib/Target/WebAssembly/WebAssemblyCodeGenPassBuilder.cpp b/llvm/lib/Target/WebAssembly/WebAssemblyCodeGenPassBuilder.cpp
index eab85273e812e..aa73e75165aff 100644
--- a/llvm/lib/Target/WebAssembly/WebAssemblyCodeGenPassBuilder.cpp
+++ b/llvm/lib/Target/WebAssembly/WebAssemblyCodeGenPassBuilder.cpp
@@ -132,7 +132,7 @@ void WebAssemblyCodeGenPassBuilder::addISelPrepare(
PassManagerWrapper &PMW) const {
// We need to move reference type allocas to WASM_ADDRESS_SPACE_VAR so that
// loads and stores are promoted to local.gets/local.sets.
- // TODO(boomanaiden154): WebAssemblyRefTypeMem2Local
+ addFunctionPass(WebAssemblyRefTypeMem2LocalPass(), PMW);
// Lower atomics and TLS if necessary
// TODO(boomanaiden154): CoalesceFeaturesAndStripAtomics
diff --git a/llvm/lib/Target/WebAssembly/WebAssemblyPassRegistry.def b/llvm/lib/Target/WebAssembly/WebAssemblyPassRegistry.def
index a771512786b6e..6767f7a6a6b77 100644
--- a/llvm/lib/Target/WebAssembly/WebAssemblyPassRegistry.def
+++ b/llvm/lib/Target/WebAssembly/WebAssemblyPassRegistry.def
@@ -24,6 +24,7 @@ MODULE_PASS("wasm-lower-em-ehsjlj", WebAssemblyLowerEmscriptenEHSjLjPass())
#endif
FUNCTION_PASS("wasm-optimize-returned", WebAssemblyOptimizeReturnedPass())
FUNCTION_PASS("wasm-reduce-to-any-all-true", WebAssemblyReduceToAnyAllTruePass(*this))
+FUNCTION_PASS("wasm-ref-type-mem2local", WebAssemblyRefTypeMem2LocalPass())
#undef FUNCTION_PASS
#ifndef MACHINE_FUNCTION_PASS
diff --git a/llvm/lib/Target/WebAssembly/WebAssemblyRefTypeMem2Local.cpp b/llvm/lib/Target/WebAssembly/WebAssemblyRefTypeMem2Local.cpp
index d2ff9b264d576..2c162308700af 100644
--- a/llvm/lib/Target/WebAssembly/WebAssemblyRefTypeMem2Local.cpp
+++ b/llvm/lib/Target/WebAssembly/WebAssemblyRefTypeMem2Local.cpp
@@ -15,8 +15,11 @@
#include "Utils/WasmAddressSpaces.h"
#include "Utils/WebAssemblyTypeUtilities.h"
#include "WebAssembly.h"
+#include "llvm/IR/Analysis.h"
#include "llvm/IR/IRBuilder.h"
#include "llvm/IR/InstVisitor.h"
+#include "llvm/IR/Instructions.h"
+#include "llvm/IR/PassManager.h"
#include "llvm/IR/ValueHandle.h"
#include "llvm/Pass.h"
using namespace llvm;
@@ -24,9 +27,16 @@ using namespace llvm;
#define DEBUG_TYPE "wasm-ref-type-mem2local"
namespace {
-class WebAssemblyRefTypeMem2Local final
- : public FunctionPass,
- public InstVisitor<WebAssemblyRefTypeMem2Local> {
+class WebAssemblyRefTypeMem2LocalImpl
+ : public InstVisitor<WebAssemblyRefTypeMem2LocalImpl> {
+ bool Changed = false;
+
+public:
+ void visitAllocaInst(AllocaInst &AI);
+ bool runOnFunction(Function &F);
+};
+
+class WebAssemblyRefTypeMem2LocalLegacy final : public FunctionPass {
StringRef getPassName() const override {
return "WebAssembly Reference Types Memory to Local";
}
@@ -37,26 +47,23 @@ class WebAssemblyRefTypeMem2Local final
}
bool runOnFunction(Function &F) override;
- bool Changed = false;
public:
static char ID;
- WebAssemblyRefTypeMem2Local() : FunctionPass(ID) {}
-
- void visitAllocaInst(AllocaInst &AI);
+ WebAssemblyRefTypeMem2LocalLegacy() : FunctionPass(ID) {}
};
} // End anonymous namespace
-char WebAssemblyRefTypeMem2Local::ID = 0;
-INITIALIZE_PASS(WebAssemblyRefTypeMem2Local, DEBUG_TYPE,
+char WebAssemblyRefTypeMem2LocalLegacy::ID = 0;
+INITIALIZE_PASS(WebAssemblyRefTypeMem2LocalLegacy, DEBUG_TYPE,
"Assign reference type allocas to local address space", true,
false)
-FunctionPass *llvm::createWebAssemblyRefTypeMem2Local() {
- return new WebAssemblyRefTypeMem2Local();
+FunctionPass *llvm::createWebAssemblyRefTypeMem2LocalLegacyPass() {
+ return new WebAssemblyRefTypeMem2LocalLegacy();
}
-void WebAssemblyRefTypeMem2Local::visitAllocaInst(AllocaInst &AI) {
+void WebAssemblyRefTypeMem2LocalImpl::visitAllocaInst(AllocaInst &AI) {
if (WebAssembly::isWebAssemblyReferenceType(AI.getAllocatedType())) {
Changed = true;
IRBuilder<> IRB(AI.getContext());
@@ -83,7 +90,7 @@ void WebAssemblyRefTypeMem2Local::visitAllocaInst(AllocaInst &AI) {
}
}
-bool WebAssemblyRefTypeMem2Local::runOnFunction(Function &F) {
+bool WebAssemblyRefTypeMem2LocalImpl::runOnFunction(Function &F) {
LLVM_DEBUG(dbgs() << "********** WebAssembly RefType Mem2Local **********\n"
"********** Function: "
<< F.getName() << '\n');
@@ -94,3 +101,17 @@ bool WebAssemblyRefTypeMem2Local::runOnFunction(Function &F) {
visit(F);
return Changed;
}
+
+bool WebAssemblyRefTypeMem2LocalLegacy::runOnFunction(Function &F) {
+ WebAssemblyRefTypeMem2LocalImpl Impl;
+ return Impl.runOnFunction(F);
+}
+
+PreservedAnalyses
+WebAssemblyRefTypeMem2LocalPass::run(Function &F,
+ FunctionAnalysisManager &FAM) {
+ WebAssemblyRefTypeMem2LocalImpl Impl;
+ return Impl.runOnFunction(F)
+ ? PreservedAnalyses::none().preserveSet<CFGAnalyses>()
+ : PreservedAnalyses::all();
+}
diff --git a/llvm/lib/Target/WebAssembly/WebAssemblyTargetMachine.cpp b/llvm/lib/Target/WebAssembly/WebAssemblyTargetMachine.cpp
index ac292f5c665c1..cdea4298aed20 100644
--- a/llvm/lib/Target/WebAssembly/WebAssemblyTargetMachine.cpp
+++ b/llvm/lib/Target/WebAssembly/WebAssemblyTargetMachine.cpp
@@ -98,7 +98,7 @@ LLVMInitializeWebAssemblyTarget() {
initializeLowerGlobalDtorsLegacyPassPass(PR);
initializeWebAssemblyFixFunctionBitcastsLegacyPass(PR);
initializeWebAssemblyOptimizeReturnedLegacyPass(PR);
- initializeWebAssemblyRefTypeMem2LocalPass(PR);
+ initializeWebAssemblyRefTypeMem2LocalLegacyPass(PR);
initializeWebAssemblyArgumentMovePass(PR);
initializeWebAssemblyAsmPrinterPass(PR);
initializeWebAssemblySetP2AlignOperandsPass(PR);
@@ -533,7 +533,7 @@ void WebAssemblyPassConfig::addIRPasses() {
void WebAssemblyPassConfig::addISelPrepare() {
// We need to move reference type allocas to WASM_ADDRESS_SPACE_VAR so that
// loads and stores are promoted to local.gets/local.sets.
- addPass(createWebAssemblyRefTypeMem2Local());
+ addPass(createWebAssemblyRefTypeMem2LocalLegacyPass());
// Lower atomics and TLS if necessary
addPass(new CoalesceFeaturesAndStripAtomics(&getWebAssemblyTargetMachine()));
More information about the llvm-commits
mailing list