summaryrefslogtreecommitdiff
path: root/src/passes/pass.cpp
diff options
context:
space:
mode:
authorAlon Zakai <azakai@google.com>2022-03-25 16:33:53 -0700
committerGitHub <noreply@github.com>2022-03-25 16:33:53 -0700
commit11932cc31e88d3d368714fcca43df979f7694bd1 (patch)
tree889faa7d6c6e2e261970ea776e3183202e9d6cba /src/passes/pass.cpp
parent3a1953a1f417eb2f588eeb35bf26a3df6ea8f8e1 (diff)
downloadbinaryen-11932cc31e88d3d368714fcca43df979f7694bd1.tar.gz
binaryen-11932cc31e88d3d368714fcca43df979f7694bd1.tar.bz2
binaryen-11932cc31e88d3d368714fcca43df979f7694bd1.zip
[Wasm GC] Signature Pruning (#4545)
This adds a new signature-pruning pass that prunes parameters from signature types where those parameters are never used in any function that has that type. This is similar to DeadArgumentElimination but works on a set of functions, and it can handle indirect calls. Also move a little code from SignatureRefining into a shared place to avoid duplication of logic to update signature types. This pattern happens in j2wasm code, for example if all method functions for some virtual method just return a constant and do not use the this pointer.
Diffstat (limited to 'src/passes/pass.cpp')
-rw-r--r--src/passes/pass.cpp4
1 files changed, 4 insertions, 0 deletions
diff --git a/src/passes/pass.cpp b/src/passes/pass.cpp
index 3ac4485e3..04947ae07 100644
--- a/src/passes/pass.cpp
+++ b/src/passes/pass.cpp
@@ -353,6 +353,9 @@ void PassRegistry::registerPasses() {
registerPass("set-globals",
"sets specified globals to specified values",
createSetGlobalsPass);
+ registerPass("signature-pruning",
+ "remove params from function signature types where possible",
+ createSignaturePruningPass);
registerPass("signature-refining",
"apply more specific subtypes to signature types where possible",
createSignatureRefiningPass);
@@ -549,6 +552,7 @@ void PassRunner::addDefaultGlobalOptimizationPrePasses() {
if (wasm->features.hasGC() && getTypeSystem() == TypeSystem::Nominal &&
options.optimizeLevel >= 2) {
addIfNoDWARFIssues("type-refining");
+ addIfNoDWARFIssues("signature-pruning");
addIfNoDWARFIssues("signature-refining");
addIfNoDWARFIssues("global-refining");
// Global type optimization can remove fields that are not needed, which can