summaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
Diffstat (limited to 'test')
-rw-r--r--test/lit/passes/heap2local.wast103
1 files changed, 96 insertions, 7 deletions
diff --git a/test/lit/passes/heap2local.wast b/test/lit/passes/heap2local.wast
index 6fa0e2a1f..b814c4987 100644
--- a/test/lit/passes/heap2local.wast
+++ b/test/lit/passes/heap2local.wast
@@ -629,7 +629,7 @@
)
)
- ;; CHECK: (func $local-copies-conditional (type $7) (param $x i32) (result f64)
+ ;; CHECK: (func $local-copies-conditional (type $8) (param $x i32) (result f64)
;; CHECK-NEXT: (local $ref (ref null $struct.A))
;; CHECK-NEXT: (local $2 i32)
;; CHECK-NEXT: (local $3 f64)
@@ -719,7 +719,7 @@
)
)
- ;; CHECK: (func $non-exclusive-get (type $7) (param $x i32) (result f64)
+ ;; CHECK: (func $non-exclusive-get (type $8) (param $x i32) (result f64)
;; CHECK-NEXT: (local $ref (ref null $struct.A))
;; CHECK-NEXT: (local.set $ref
;; CHECK-NEXT: (struct.new_default $struct.A)
@@ -751,7 +751,7 @@
)
)
- ;; CHECK: (func $tee (type $8) (result i32)
+ ;; CHECK: (func $tee (type $5) (result i32)
;; CHECK-NEXT: (local $ref (ref null $struct.A))
;; CHECK-NEXT: (local $1 i32)
;; CHECK-NEXT: (local $2 f64)
@@ -871,7 +871,7 @@
)
)
- ;; CHECK: (func $escape-flow-out (type $5) (result anyref)
+ ;; CHECK: (func $escape-flow-out (type $6) (result anyref)
;; CHECK-NEXT: (local $ref (ref null $struct.A))
;; CHECK-NEXT: (struct.set $struct.A 0
;; CHECK-NEXT: (local.tee $ref
@@ -893,7 +893,7 @@
(local.get $ref)
)
- ;; CHECK: (func $escape-return (type $5) (result anyref)
+ ;; CHECK: (func $escape-return (type $6) (result anyref)
;; CHECK-NEXT: (local $ref (ref null $struct.A))
;; CHECK-NEXT: (struct.set $struct.A 0
;; CHECK-NEXT: (local.tee $ref
@@ -1636,7 +1636,7 @@
)
)
- ;; CHECK: (func $ref-as-non-null-through-local (type $8) (result i32)
+ ;; CHECK: (func $ref-as-non-null-through-local (type $5) (result i32)
;; CHECK-NEXT: (local $ref (ref null $struct.A))
;; CHECK-NEXT: (local $1 i32)
;; CHECK-NEXT: (local $2 f64)
@@ -1774,7 +1774,7 @@
)
)
- ;; CHECK: (func $non-nullable-local (type $5) (result anyref)
+ ;; CHECK: (func $non-nullable-local (type $6) (result anyref)
;; CHECK-NEXT: (local $0 (ref null $struct.A))
;; CHECK-NEXT: (local $1 i32)
;; CHECK-NEXT: (local $2 f64)
@@ -1895,6 +1895,41 @@
(br $loop)
)
)
+
+ ;; CHECK: (func $ref-cast (type $5) (result i32)
+ ;; CHECK-NEXT: (local $0 i32)
+ ;; CHECK-NEXT: (local $1 f64)
+ ;; CHECK-NEXT: (local $2 i32)
+ ;; CHECK-NEXT: (local $3 f64)
+ ;; CHECK-NEXT: (drop
+ ;; CHECK-NEXT: (block (result nullref)
+ ;; CHECK-NEXT: (local.set $2
+ ;; CHECK-NEXT: (i32.const 0)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (local.set $3
+ ;; CHECK-NEXT: (f64.const 0)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (local.set $0
+ ;; CHECK-NEXT: (local.get $2)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (local.set $1
+ ;; CHECK-NEXT: (local.get $3)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (ref.null none)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (local.get $0)
+ ;; CHECK-NEXT: )
+ (func $ref-cast (result i32)
+ (struct.get $struct.A 0
+ (ref.cast (ref $struct.A)
+ (struct.new $struct.A
+ (i32.const 0)
+ (f64.const 0)
+ )
+ )
+ )
+ )
)
(module
@@ -1945,4 +1980,58 @@
)
)
)
+
+ ;; CHECK: (func $cast-success (type $1) (result anyref)
+ ;; CHECK-NEXT: (local $0 (ref $A))
+ ;; CHECK-NEXT: (local $1 (ref $A))
+ ;; CHECK-NEXT: (drop
+ ;; CHECK-NEXT: (block (result nullref)
+ ;; CHECK-NEXT: (local.set $1
+ ;; CHECK-NEXT: (struct.new $A
+ ;; CHECK-NEXT: (ref.null none)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (local.set $0
+ ;; CHECK-NEXT: (local.get $1)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (ref.null none)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (local.get $0)
+ ;; CHECK-NEXT: )
+ (func $cast-success (result anyref)
+ (struct.get $A 0
+ (ref.cast (ref $A)
+ (struct.new $B
+ (struct.new $A
+ (ref.null none)
+ )
+ )
+ )
+ )
+ )
+ ;; CHECK: (func $cast-failure (type $1) (result anyref)
+ ;; CHECK-NEXT: (struct.get $B 0
+ ;; CHECK-NEXT: (ref.cast (ref $B)
+ ;; CHECK-NEXT: (struct.new $A
+ ;; CHECK-NEXT: (struct.new $A
+ ;; CHECK-NEXT: (ref.null none)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ (func $cast-failure (result anyref)
+ (struct.get $B 0
+ ;; The allocated $A arrives here, but the cast will fail,
+ ;; so we do not optimize.
+ (ref.cast (ref $B)
+ (struct.new $A
+ (struct.new $A
+ (ref.null none)
+ )
+ )
+ )
+ )
+ )
)