diff options
author | Alon Zakai <azakai@google.com> | 2021-04-12 18:36:46 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2021-04-12 18:36:46 -0700 |
commit | 5c8dcfe744d759b9436a04b0267978f42e4725ab (patch) | |
tree | 74d1529167b3580578672267c7cdcee7dcc0c6bb /test | |
parent | 0d7dac2923f9164ca7f1450b6f394ef8fa9d8a68 (diff) | |
download | binaryen-5c8dcfe744d759b9436a04b0267978f42e4725ab.tar.gz binaryen-5c8dcfe744d759b9436a04b0267978f42e4725ab.tar.bz2 binaryen-5c8dcfe744d759b9436a04b0267978f42e4725ab.zip |
[Wasm GC] Optimize away unnecessary non-null assertions (#3800)
ref.as_non_null is not needed if the value flows into a place that traps
on null anyhow. We replace a trap on one instruction with a trap on
another, but we allow such things (and even changing trap types, which
does not happen here).
Diffstat (limited to 'test')
-rw-r--r-- | test/lit/passes/optimize-instructions-gc.wast | 91 |
1 files changed, 82 insertions, 9 deletions
diff --git a/test/lit/passes/optimize-instructions-gc.wast b/test/lit/passes/optimize-instructions-gc.wast index 5c469b617..b00d08193 100644 --- a/test/lit/passes/optimize-instructions-gc.wast +++ b/test/lit/passes/optimize-instructions-gc.wast @@ -386,9 +386,7 @@ ;; CHECK-NEXT: (drop ;; CHECK-NEXT: (block ;; CHECK-NEXT: (drop - ;; CHECK-NEXT: (ref.as_non_null - ;; CHECK-NEXT: (local.get $data) - ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.get $data) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) @@ -396,9 +394,7 @@ ;; CHECK-NEXT: (drop ;; CHECK-NEXT: (block ;; CHECK-NEXT: (drop - ;; CHECK-NEXT: (ref.as_non_null - ;; CHECK-NEXT: (local.get $i31) - ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.get $i31) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) @@ -406,9 +402,7 @@ ;; CHECK-NEXT: (drop ;; CHECK-NEXT: (block ;; CHECK-NEXT: (drop - ;; CHECK-NEXT: (ref.as_non_null - ;; CHECK-NEXT: (local.get $func) - ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.get $func) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (unreachable) ;; CHECK-NEXT: ) @@ -460,4 +454,83 @@ (ref.as_func (unreachable)) ) ) + + ;; CHECK: (func $redundant-non-null-casts (param $x (ref null $struct)) (param $y (ref null $array)) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (ref.as_non_null + ;; CHECK-NEXT: (local.get $x) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (struct.set $struct $i8 + ;; CHECK-NEXT: (local.get $x) + ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (struct.get_u $struct $i8 + ;; CHECK-NEXT: (local.get $x) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (array.set $array + ;; CHECK-NEXT: (local.get $y) + ;; CHECK-NEXT: (i32.const 2) + ;; CHECK-NEXT: (i32.const 3) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (array.get_u $array + ;; CHECK-NEXT: (local.get $y) + ;; CHECK-NEXT: (i32.const 4) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (array.len $array + ;; CHECK-NEXT: (local.get $y) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (func $redundant-non-null-casts (param $x (ref null $struct)) (param $y (ref null $array)) + (drop + (ref.as_non_null + (ref.as_non_null + (ref.as_non_null + (local.get $x) + ) + ) + ) + ) + (struct.set $struct 0 + (ref.as_non_null + (local.get $x) + ) + (i32.const 1) + ) + (drop + (struct.get_u $struct 0 + (ref.as_non_null + (local.get $x) + ) + ) + ) + (array.set $array + (ref.as_non_null + (local.get $y) + ) + (i32.const 2) + (i32.const 3) + ) + (drop + (array.get $array + (ref.as_non_null + (local.get $y) + ) + (i32.const 4) + ) + ) + (drop + (array.len $array + (ref.as_non_null + (local.get $y) + ) + ) + ) + ) ) |