diff options
author | Alon Zakai <azakai@google.com> | 2021-08-09 14:20:50 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-08-09 14:20:50 -0700 |
commit | 86634774be6e060efec8f3048f82d61b8d91d5d7 (patch) | |
tree | 07beebe97d0fe235435650c233c815a8e812eaf8 /test | |
parent | 329b3606b7f966f1ac3cbb1f9a46849ea4d5c785 (diff) | |
download | binaryen-86634774be6e060efec8f3048f82d61b8d91d5d7.tar.gz binaryen-86634774be6e060efec8f3048f82d61b8d91d5d7.tar.bz2 binaryen-86634774be6e060efec8f3048f82d61b8d91d5d7.zip |
Fix BrOn logic in RemoveUnusedBrs (#4062)
This only moves code around. visitBrOn was in the main part of the pass,
which was incorrect as it could interfere with other work being done there.
Specifically, we have a stack of Ifs there, and if we replace a BrOn with
an If, an assertion was hit. To fix this, run it like sinkBlocks(), in a separate
interleaved phase.
This fixes a bug reported by askeksa-google here:
https://github.com/WebAssembly/gc/issues/226#issuecomment-868739853
Diffstat (limited to 'test')
-rw-r--r-- | test/lit/passes/remove-unused-brs-gc.wast | 31 |
1 files changed, 31 insertions, 0 deletions
diff --git a/test/lit/passes/remove-unused-brs-gc.wast b/test/lit/passes/remove-unused-brs-gc.wast index 7fe579c5a..e38eccebd 100644 --- a/test/lit/passes/remove-unused-brs-gc.wast +++ b/test/lit/passes/remove-unused-brs-gc.wast @@ -51,4 +51,35 @@ ) ) ) + + ;; CHECK: (func $br_on-if (param $0 dataref) + ;; CHECK-NEXT: (block $label + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (select (result dataref) + ;; CHECK-NEXT: (local.get $0) + ;; CHECK-NEXT: (local.get $0) + ;; CHECK-NEXT: (i32.const 0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (func $br_on-if (param $0 (ref data)) + (block $label + (drop + ;; This br is never taken, as the input is non-nullable, so we can remove + ;; it. When we do so, we replace it with the if. We should not rescan that + ;; if, which has already been walked, as that would hit an assertion. + ;; + (br_on_null $label + ;; This if can also be turned into a select, separately from the above + ;; (that is not specifically intended to be tested here). + (if (result (ref data)) + (i32.const 0) + (local.get $0) + (local.get $0) + ) + ) + ) + ) + ) ) |