diff options
Diffstat (limited to 'test')
-rw-r--r-- | test/lit/passes/simplify-locals-gc-nn.wast | 90 |
1 files changed, 90 insertions, 0 deletions
diff --git a/test/lit/passes/simplify-locals-gc-nn.wast b/test/lit/passes/simplify-locals-gc-nn.wast new file mode 100644 index 000000000..eec97a4d4 --- /dev/null +++ b/test/lit/passes/simplify-locals-gc-nn.wast @@ -0,0 +1,90 @@ +;; NOTE: Assertions have been generated by update_lit_checks.py and should not be edited. +;; RUN: wasm-opt %s --simplify-locals -all --enable-gc-nn-locals -S -o - | filecheck %s + +(module + ;; CHECK: (func $test-nn + ;; CHECK-NEXT: (local $nn (ref any)) + ;; CHECK-NEXT: (local.set $nn + ;; CHECK-NEXT: (ref.as_non_null + ;; CHECK-NEXT: (ref.null any) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (try $try + ;; CHECK-NEXT: (do + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (local.get $nn) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (catch_all + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (local.get $nn) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (func $test-nn + (local $nn (ref any)) + ;; We should not sink this set into the try, as the spec does not allow it + ;; even though we are not changing dominance (we are not changing it, + ;; because there is nothing that can throw in the try's body that can reach + ;; the catch_all before the local.set that we move there). See + ;; https://github.com/WebAssembly/function-references/issues/44#issuecomment-1083146887 + (local.set $nn + (ref.as_non_null + (ref.null any) + ) + ) + (try + (do + (drop + (local.get $nn) + ) + ) + (catch_all + (drop + (local.get $nn) + ) + ) + ) + ) + + ;; CHECK: (func $test-nullable + ;; CHECK-NEXT: (local $nullable anyref) + ;; CHECK-NEXT: (nop) + ;; CHECK-NEXT: (try $try + ;; CHECK-NEXT: (do + ;; CHECK-NEXT: (local.set $nullable + ;; CHECK-NEXT: (ref.as_non_null + ;; CHECK-NEXT: (ref.null any) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (catch_all + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (local.get $nullable) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (func $test-nullable + ;; As above, but now the local is nullable. Here we *can* optimize the set + ;; into the try. + (local $nullable (ref null any)) + (local.set $nullable + (ref.as_non_null + (ref.null any) + ) + ) + (try + (do + (drop + (local.get $nullable) + ) + ) + (catch_all + (drop + (local.get $nullable) + ) + ) + ) + )) |