summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/passes/RemoveUnusedBrs.cpp17
-rw-r--r--test/passes/remove-unused-brs_enable-multivalue.txt22
-rw-r--r--test/passes/remove-unused-brs_enable-multivalue.wast22
3 files changed, 56 insertions, 5 deletions
diff --git a/src/passes/RemoveUnusedBrs.cpp b/src/passes/RemoveUnusedBrs.cpp
index 2238e9e95..0a3374c4d 100644
--- a/src/passes/RemoveUnusedBrs.cpp
+++ b/src/passes/RemoveUnusedBrs.cpp
@@ -828,11 +828,18 @@ struct RemoveUnusedBrs : public WalkerPass<PostWalker<RemoveUnusedBrs>> {
void visitSwitch(Switch* curr) {
if (BranchUtils::getUniqueTargets(curr).size() == 1) {
- // This switch has just one target no matter what; replace with a br.
- Builder builder(*getModule());
- replaceCurrent(builder.makeSequence(
- builder.makeDrop(curr->condition), // might have side effects
- builder.makeBreak(curr->default_, curr->value)));
+ // This switch has just one target no matter what; replace with a br
+ // if we can (to do so, we must put the condition before a possible
+ // value).
+ if (!curr->value || EffectAnalyzer::canReorder(passOptions,
+ getModule()->features,
+ curr->condition,
+ curr->value)) {
+ Builder builder(*getModule());
+ replaceCurrent(builder.makeSequence(
+ builder.makeDrop(curr->condition), // might have side effects
+ builder.makeBreak(curr->default_, curr->value)));
+ }
}
}
diff --git a/test/passes/remove-unused-brs_enable-multivalue.txt b/test/passes/remove-unused-brs_enable-multivalue.txt
index ee980b523..6cbfe2373 100644
--- a/test/passes/remove-unused-brs_enable-multivalue.txt
+++ b/test/passes/remove-unused-brs_enable-multivalue.txt
@@ -2502,4 +2502,26 @@
)
)
)
+ (func $unswitch-reordering (param $x i32) (result i32)
+ (block $label$1 (result i32)
+ (br_table $label$1
+ (block $label$2 (result i32)
+ (i32.store
+ (i32.const 1)
+ (i32.const 2)
+ )
+ (i32.const 3)
+ )
+ (block $block (result i32)
+ (if
+ (local.get $x)
+ (return
+ (i32.const 5)
+ )
+ )
+ (i32.const 6)
+ )
+ )
+ )
+ )
)
diff --git a/test/passes/remove-unused-brs_enable-multivalue.wast b/test/passes/remove-unused-brs_enable-multivalue.wast
index b37b75776..ceefefa40 100644
--- a/test/passes/remove-unused-brs_enable-multivalue.wast
+++ b/test/passes/remove-unused-brs_enable-multivalue.wast
@@ -2106,4 +2106,26 @@
)
)
)
+ (func $unswitch-reordering (param $x i32) (result i32)
+ (block $label$1 (result i32)
+ (br_table $label$1
+ (block $label$2 (result i32)
+ (i32.store ;; has a possible side effect
+ (i32.const 1)
+ (i32.const 2)
+ )
+ (i32.const 3)
+ )
+ (block (result i32)
+ (if
+ (local.get $x)
+ (return
+ (i32.const 5)
+ )
+ )
+ (i32.const 6)
+ )
+ )
+ )
+ )
)