[llvm] 491539a - [WebAssembly] Port WebAssemblyOptimizeReturnedPass
via llvm-commits
llvm-commits at lists.llvm.org
Wed Jul 15 06:53:53 PDT 2026
Author: Aiden Grossman
Date: 2026-07-15T06:53:48-07:00
New Revision: 491539a8b801aad5706cc32fc54a319791d57a91
URL: https://github.com/llvm/llvm-project/commit/491539a8b801aad5706cc32fc54a319791d57a91
DIFF: https://github.com/llvm/llvm-project/commit/491539a8b801aad5706cc32fc54a319791d57a91.diff
LOG: [WebAssembly] Port WebAssemblyOptimizeReturnedPass
Standard pass porting for the NewPM.
Reviewers: sbc100, dschuff, aheejin
Pull Request: https://github.com/llvm/llvm-project/pull/209036
Added:
Modified:
llvm/lib/Target/WebAssembly/WebAssembly.h
llvm/lib/Target/WebAssembly/WebAssemblyCodeGenPassBuilder.cpp
llvm/lib/Target/WebAssembly/WebAssemblyOptimizeReturned.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 0d215264b6bbc..681fea9f41a00 100644
--- a/llvm/lib/Target/WebAssembly/WebAssembly.h
+++ b/llvm/lib/Target/WebAssembly/WebAssembly.h
@@ -48,7 +48,14 @@ class WebAssemblyFixFunctionBitcastsPass
};
ModulePass *createWebAssemblyFixFunctionBitcastsLegacyPass();
-FunctionPass *createWebAssemblyOptimizeReturned();
+
+class WebAssemblyOptimizeReturnedPass
+ : public OptionalPassInfoMixin<WebAssemblyOptimizeReturnedPass> {
+public:
+ PreservedAnalyses run(Function &F, FunctionAnalysisManager &FAM);
+};
+
+FunctionPass *createWebAssemblyOptimizeReturnedLegacyPass();
FunctionPass *createWebAssemblyRefTypeMem2Local();
FunctionPass *createWebAssemblyReduceToAnyAllTrue(WebAssemblyTargetMachine &TM);
@@ -98,7 +105,7 @@ FunctionPass *createWebAssemblyPeephole();
ModulePass *createWebAssemblyMCLowerPrePass();
// PassRegistry initialization declarations.
-void initializeOptimizeReturnedPass(PassRegistry &);
+void initializeWebAssemblyOptimizeReturnedLegacyPass(PassRegistry &);
void initializeWebAssemblyRefTypeMem2LocalPass(PassRegistry &);
void initializeWebAssemblyAddMissingPrototypesLegacyPass(PassRegistry &);
void initializeWebAssemblyArgumentMovePass(PassRegistry &);
diff --git a/llvm/lib/Target/WebAssembly/WebAssemblyCodeGenPassBuilder.cpp b/llvm/lib/Target/WebAssembly/WebAssemblyCodeGenPassBuilder.cpp
index 6060b58430008..2a819039d1dd8 100644
--- a/llvm/lib/Target/WebAssembly/WebAssemblyCodeGenPassBuilder.cpp
+++ b/llvm/lib/Target/WebAssembly/WebAssemblyCodeGenPassBuilder.cpp
@@ -94,9 +94,8 @@ void WebAssemblyCodeGenPassBuilder::addIRPasses(PassManagerWrapper &PMW) const {
addModulePass(WebAssemblyFixFunctionBitcastsPass(), PMW);
// Optimize "returned" function attributes.
- if (getOptLevel() != CodeGenOptLevel::None) {
- // TODO(boomanaiden154): WebAssemblyOptimizeReturned
- }
+ if (getOptLevel() != CodeGenOptLevel::None)
+ addFunctionPass(WebAssemblyOptimizeReturnedPass(), PMW);
// If exception handling is not enabled and setjmp/longjmp handling is
// enabled, we lower invokes into calls and delete unreachable landingpad
diff --git a/llvm/lib/Target/WebAssembly/WebAssemblyOptimizeReturned.cpp b/llvm/lib/Target/WebAssembly/WebAssemblyOptimizeReturned.cpp
index ffd135d62aaf0..534ae934a9528 100644
--- a/llvm/lib/Target/WebAssembly/WebAssemblyOptimizeReturned.cpp
+++ b/llvm/lib/Target/WebAssembly/WebAssemblyOptimizeReturned.cpp
@@ -12,8 +12,10 @@
//===----------------------------------------------------------------------===//
#include "WebAssembly.h"
+#include "llvm/IR/Analysis.h"
#include "llvm/IR/Dominators.h"
#include "llvm/IR/InstVisitor.h"
+#include "llvm/IR/PassManager.h"
#include "llvm/Support/Debug.h"
#include "llvm/Support/raw_ostream.h"
using namespace llvm;
@@ -21,8 +23,17 @@ using namespace llvm;
#define DEBUG_TYPE "wasm-optimize-returned"
namespace {
-class OptimizeReturned final : public FunctionPass,
- public InstVisitor<OptimizeReturned> {
+class WebAssemblyOptimizeReturnedImpl
+ : public InstVisitor<WebAssemblyOptimizeReturnedImpl> {
+ DominatorTree *DT = nullptr;
+
+public:
+ WebAssemblyOptimizeReturnedImpl(DominatorTree *DT) : DT(DT) {}
+ bool runOnFunction(Function &F);
+ void visitCallBase(CallBase &CB);
+};
+
+class WebAssemblyOptimizeReturnedLegacy final : public FunctionPass {
StringRef getPassName() const override {
return "WebAssembly Optimize Returned";
}
@@ -36,26 +47,24 @@ class OptimizeReturned final : public FunctionPass,
bool runOnFunction(Function &F) override;
- DominatorTree *DT = nullptr;
-
public:
static char ID;
- OptimizeReturned() : FunctionPass(ID) {}
+ WebAssemblyOptimizeReturnedLegacy() : FunctionPass(ID) {}
void visitCallBase(CallBase &CB);
};
} // End anonymous namespace
-char OptimizeReturned::ID = 0;
-INITIALIZE_PASS(OptimizeReturned, DEBUG_TYPE,
+char WebAssemblyOptimizeReturnedLegacy::ID = 0;
+INITIALIZE_PASS(WebAssemblyOptimizeReturnedLegacy, DEBUG_TYPE,
"Optimize calls with \"returned\" attributes for WebAssembly",
false, false)
-FunctionPass *llvm::createWebAssemblyOptimizeReturned() {
- return new OptimizeReturned();
+FunctionPass *llvm::createWebAssemblyOptimizeReturnedLegacyPass() {
+ return new WebAssemblyOptimizeReturnedLegacy();
}
-void OptimizeReturned::visitCallBase(CallBase &CB) {
+void WebAssemblyOptimizeReturnedImpl::visitCallBase(CallBase &CB) {
for (unsigned I = 0, E = CB.arg_size(); I < E; ++I)
if (CB.paramHasAttr(I, Attribute::Returned)) {
Value *Arg = CB.getArgOperand(I);
@@ -70,12 +79,27 @@ void OptimizeReturned::visitCallBase(CallBase &CB) {
}
}
-bool OptimizeReturned::runOnFunction(Function &F) {
+bool WebAssemblyOptimizeReturnedImpl::runOnFunction(Function &F) {
LLVM_DEBUG(dbgs() << "********** Optimize returned Attributes **********\n"
"********** Function: "
<< F.getName() << '\n');
- DT = &getAnalysis<DominatorTreeWrapperPass>().getDomTree();
visit(F);
return true;
}
+
+bool WebAssemblyOptimizeReturnedLegacy::runOnFunction(Function &F) {
+ DominatorTree *DT = &getAnalysis<DominatorTreeWrapperPass>().getDomTree();
+ WebAssemblyOptimizeReturnedImpl Impl(DT);
+ return Impl.runOnFunction(F);
+}
+
+PreservedAnalyses
+WebAssemblyOptimizeReturnedPass::run(Function &F,
+ FunctionAnalysisManager &FAM) {
+ DominatorTree *DT = &FAM.getResult<DominatorTreeAnalysis>(F);
+ WebAssemblyOptimizeReturnedImpl Impl(DT);
+ return Impl.runOnFunction(F)
+ ? PreservedAnalyses::none().preserveSet<CFGAnalyses>()
+ : PreservedAnalyses::all();
+}
diff --git a/llvm/lib/Target/WebAssembly/WebAssemblyPassRegistry.def b/llvm/lib/Target/WebAssembly/WebAssemblyPassRegistry.def
index 01f4394454a03..3c9a21978bf46 100644
--- a/llvm/lib/Target/WebAssembly/WebAssemblyPassRegistry.def
+++ b/llvm/lib/Target/WebAssembly/WebAssemblyPassRegistry.def
@@ -18,6 +18,12 @@ MODULE_PASS("wasm-add-missing-prototypes", WebAssemblyAddMissingPrototypesPass()
MODULE_PASS("wasm-fix-function-bitcasts", WebAssemblyFixFunctionBitcastsPass())
#undef MODULE_PASS
+#ifndef FUNCTION_PASS
+#define FUNCTION_PASS(NAME, CREATE_PASS)
+#endif
+FUNCTION_PASS("wasm-optimize-returned", WebAssemblyOptimizeReturnedPass())
+#undef FUNCTION_PASS
+
#ifndef MACHINE_FUNCTION_PASS
#define MACHINE_FUNCTION_PASS(NAME, CREATE_PASS)
#endif
diff --git a/llvm/lib/Target/WebAssembly/WebAssemblyTargetMachine.cpp b/llvm/lib/Target/WebAssembly/WebAssemblyTargetMachine.cpp
index 073edc6d98623..b5533d4c9bc6f 100644
--- a/llvm/lib/Target/WebAssembly/WebAssemblyTargetMachine.cpp
+++ b/llvm/lib/Target/WebAssembly/WebAssemblyTargetMachine.cpp
@@ -97,7 +97,7 @@ LLVMInitializeWebAssemblyTarget() {
initializeWebAssemblyLowerEmscriptenEHSjLjPass(PR);
initializeLowerGlobalDtorsLegacyPassPass(PR);
initializeWebAssemblyFixFunctionBitcastsLegacyPass(PR);
- initializeOptimizeReturnedPass(PR);
+ initializeWebAssemblyOptimizeReturnedLegacyPass(PR);
initializeWebAssemblyRefTypeMem2LocalPass(PR);
initializeWebAssemblyArgumentMovePass(PR);
initializeWebAssemblyAsmPrinterPass(PR);
@@ -498,7 +498,7 @@ void WebAssemblyPassConfig::addIRPasses() {
// Optimize "returned" function attributes.
if (getOptLevel() != CodeGenOptLevel::None)
- addPass(createWebAssemblyOptimizeReturned());
+ addPass(createWebAssemblyOptimizeReturnedLegacyPass());
// If exception handling is not enabled and setjmp/longjmp handling is
// enabled, we lower invokes into calls and delete unreachable landingpad
More information about the llvm-commits
mailing list