diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/ast_utils.h | 1 | ||||
-rw-r--r-- | src/passes/RemoveUnusedBrs.cpp | 7 | ||||
-rw-r--r-- | src/passes/pass.cpp | 2 |
3 files changed, 9 insertions, 1 deletions
diff --git a/src/ast_utils.h b/src/ast_utils.h index 0c2c318e2..8952114bc 100644 --- a/src/ast_utils.h +++ b/src/ast_utils.h @@ -105,7 +105,6 @@ struct EffectAnalyzer : public PostWalker<EffectAnalyzer, Visitor<EffectAnalyzer || (accessesMemory() && (other.writesMemory || other.calls))) { return true; } - assert(localsWritten.size() + localsRead.size() <= 1); // the code below is fast on that case, of one element vs many for (auto local : localsWritten) { if (other.localsWritten.count(local) || other.localsRead.count(local)) { return true; diff --git a/src/passes/RemoveUnusedBrs.cpp b/src/passes/RemoveUnusedBrs.cpp index ffdba0768..3f909c32e 100644 --- a/src/passes/RemoveUnusedBrs.cpp +++ b/src/passes/RemoveUnusedBrs.cpp @@ -128,6 +128,13 @@ struct RemoveUnusedBrs : public WalkerPass<PostWalker<RemoveUnusedBrs, Visitor<R // if without an else. try to reduce if (condition) br => br_if (condition) Break* br = curr->ifTrue->dynCast<Break>(); if (br && !br->condition) { // TODO: if there is a condition, join them + // if the br has a value, then if => br_if means we always execute the value, and also the order is value,condition vs condition,value + if (br->value) { + EffectAnalyzer value(br->value); + if (value.hasSideEffects()) return; + EffectAnalyzer condition(curr->condition); + if (condition.invalidates(value)) return; + } br->condition = curr->condition; replaceCurrent(br); anotherCycle = true; diff --git a/src/passes/pass.cpp b/src/passes/pass.cpp index e43b712e5..babb4635b 100644 --- a/src/passes/pass.cpp +++ b/src/passes/pass.cpp @@ -65,6 +65,7 @@ void PassRunner::addDefaultOptimizationPasses() { add("optimize-instructions"); add("simplify-locals"); add("vacuum"); // previous pass creates garbage + add("remove-unused-brs"); // simplify-locals opens opportunities for phi optimizations add("coalesce-locals"); add("vacuum"); // previous pass creates garbage add("reorder-locals"); @@ -81,6 +82,7 @@ void PassRunner::addDefaultFunctionOptimizationPasses() { add("optimize-instructions"); add("simplify-locals"); add("vacuum"); // previous pass creates garbage + add("remove-unused-brs"); // simplify-locals opens opportunities for phi optimizations add("coalesce-locals"); add("vacuum"); // previous pass creates garbage add("reorder-locals"); |