summaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
Diffstat (limited to 'test')
-rw-r--r--test/lit/passes/signature-refining.wast99
1 files changed, 98 insertions, 1 deletions
diff --git a/test/lit/passes/signature-refining.wast b/test/lit/passes/signature-refining.wast
index 6c1c23291..c4e13b975 100644
--- a/test/lit/passes/signature-refining.wast
+++ b/test/lit/passes/signature-refining.wast
@@ -887,4 +887,101 @@
)
)
)
-) ;; TODO
+)
+
+;; Test the call.without.effects intrinsic, which may require additional work.
+(module
+ (rec
+ ;; CHECK: (rec
+ ;; CHECK-NEXT: (type $A (struct ))
+ (type $A (struct))
+
+ ;; CHECK: (type $B (sub $A (struct )))
+ (type $B (sub $A (struct)))
+
+ ;; CHECK: (type $C (sub $B (struct )))
+ (type $C (sub $B (struct)))
+
+ ;; CHECK: (type $return_A_2 (func (result (ref $C))))
+
+ ;; CHECK: (type $return_A (func (result (ref $B))))
+ (type $return_A (func (result (ref null $A))))
+
+ (type $return_A_2 (func (result (ref null $A))))
+ )
+
+ ;; CHECK: (type $none_=>_none (func))
+
+ ;; CHECK: (type $funcref_=>_ref?|$A| (func (param funcref) (result (ref null $A))))
+
+ ;; CHECK: (type $funcref_=>_ref|$B| (func (param funcref) (result (ref $B))))
+
+ ;; CHECK: (type $funcref_=>_ref|$C| (func (param funcref) (result (ref $C))))
+
+ ;; CHECK: (import "binaryen-intrinsics" "call.without.effects" (func $no.side.effects (type $funcref_=>_ref?|$A|) (param funcref) (result (ref null $A))))
+ (import "binaryen-intrinsics" "call.without.effects" (func $no.side.effects
+ (param funcref)
+ (result (ref null $A))
+ ))
+
+ ;; CHECK: (import "binaryen-intrinsics" "call.without.effects" (func $no.side.effects_4 (type $funcref_=>_ref|$B|) (param funcref) (result (ref $B))))
+
+ ;; CHECK: (import "binaryen-intrinsics" "call.without.effects" (func $no.side.effects_5 (type $funcref_=>_ref|$C|) (param funcref) (result (ref $C))))
+
+ ;; CHECK: (elem declare func $other $other2)
+
+ ;; CHECK: (func $func (type $none_=>_none)
+ ;; CHECK-NEXT: (drop
+ ;; CHECK-NEXT: (call $no.side.effects_4
+ ;; CHECK-NEXT: (ref.func $other)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (drop
+ ;; CHECK-NEXT: (call $no.side.effects_4
+ ;; CHECK-NEXT: (ref.func $other)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (drop
+ ;; CHECK-NEXT: (call $no.side.effects_5
+ ;; CHECK-NEXT: (ref.func $other2)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ (func $func
+ ;; After $other's result is refined, this will need to use a new import that
+ ;; has the refined result type.
+ (drop
+ (call $no.side.effects
+ (ref.func $other)
+ )
+ )
+ ;; A second call of the same one. This should call the same new import (that
+ ;; is, we shouldn't create unnecessary copies of the new imports).
+ (drop
+ (call $no.side.effects
+ (ref.func $other)
+ )
+ )
+ ;; A call of another function with a different refining, that will need
+ ;; another import.
+ (drop
+ (call $no.side.effects
+ (ref.func $other2)
+ )
+ )
+ )
+
+ ;; CHECK: (func $other (type $return_A) (result (ref $B))
+ ;; CHECK-NEXT: (struct.new_default $B)
+ ;; CHECK-NEXT: )
+ (func $other (type $return_A) (result (ref null $A))
+ (struct.new $B) ;; this will allow this function's result to be refined to $B
+ )
+
+ ;; CHECK: (func $other2 (type $return_A_2) (result (ref $C))
+ ;; CHECK-NEXT: (struct.new_default $C)
+ ;; CHECK-NEXT: )
+ (func $other2 (type $return_A_2) (result (ref null $A))
+ (struct.new $C) ;; this will allow this function's result to be refined to $C
+ )
+)