summaryrefslogtreecommitdiff
path: root/src/passes/SimplifyGlobals.cpp
diff options
context:
space:
mode:
authorAlon Zakai <azakai@google.com>2022-12-15 13:46:35 -0800
committerGitHub <noreply@github.com>2022-12-15 13:46:35 -0800
commitbead42c46d48e4c5584f035f7a805911dc59ae35 (patch)
tree4079c1b3e7e850ad568fbb1b957aba985258425b /src/passes/SimplifyGlobals.cpp
parent7769196090e7ce2c150cd8a58fad0c89430d3d2b (diff)
downloadbinaryen-bead42c46d48e4c5584f035f7a805911dc59ae35.tar.gz
binaryen-bead42c46d48e4c5584f035f7a805911dc59ae35.tar.bz2
binaryen-bead42c46d48e4c5584f035f7a805911dc59ae35.zip
Properly use pass options in nested pass runners (up to -O1) (#5351)
This fixes a TODO. There is a runtime cost to this in higher opt levels, as passing through -O3 makes nested optimization work take longer. But it can lead to better results. For now, this PR moves us from 0 before to a maximum of 1, as a compromise. 1 does not regress compile times, but there may be further benefits to allowing 2 and 3 in the future. Also fix a fuzzer bug that becomes uncovered by tihs PR: Now that we actually optimize in simplify-globals, we need to handle the case of the optimizer there seeing a call with the effects of writing to a global (we had an assert on that never happening, but with function effects that can happen, and so a GlobalSet is not the only thing that can set a global). Aside from the opt and shrink levels this passes through all other options, like trapsNeverHappen.
Diffstat (limited to 'src/passes/SimplifyGlobals.cpp')
-rw-r--r--src/passes/SimplifyGlobals.cpp16
1 files changed, 12 insertions, 4 deletions
diff --git a/src/passes/SimplifyGlobals.cpp b/src/passes/SimplifyGlobals.cpp
index 463261d35..f9bccab23 100644
--- a/src/passes/SimplifyGlobals.cpp
+++ b/src/passes/SimplifyGlobals.cpp
@@ -364,12 +364,20 @@ struct ConstantGlobalApplier
}
return;
}
- // Otherwise, invalidate if we need to.
- EffectAnalyzer effects(getPassOptions(), *getModule());
- effects.visit(curr);
- assert(effects.globalsWritten.empty()); // handled above
+
+ // Otherwise, invalidate if we need to. Note that we handled a GlobalSet
+ // earlier, but also need to handle calls. A general call forces us to
+ // forget everything, but in some cases we can do better, if we have a call
+ // and have computed function effects for it.
+ ShallowEffectAnalyzer effects(getPassOptions(), *getModule(), curr);
if (effects.calls) {
+ // Forget everything.
currConstantGlobals.clear();
+ } else {
+ // Forget just the globals written, if any.
+ for (auto writtenGlobal : effects.globalsWritten) {
+ currConstantGlobals.erase(writtenGlobal);
+ }
}
}