summaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
Diffstat (limited to 'test')
-rw-r--r--test/lit/passes/dae-refine-params-and-optimize.wast42
1 files changed, 42 insertions, 0 deletions
diff --git a/test/lit/passes/dae-refine-params-and-optimize.wast b/test/lit/passes/dae-refine-params-and-optimize.wast
new file mode 100644
index 000000000..65611908a
--- /dev/null
+++ b/test/lit/passes/dae-refine-params-and-optimize.wast
@@ -0,0 +1,42 @@
+;; NOTE: Assertions have been generated by update_lit_checks.py --all-items and should not be edited.
+
+;; RUN: foreach %s %t wasm-opt -all --dae-optimizing -S -o - | filecheck %s
+
+;; The br_on_cast_fail is optimized away thanks to the refined type. The output still has some unoptimized code (an additional --dce pass would get rid of the drop-return pattern here), but that is not directly relevant to this test.
+(module
+ ;; CHECK: (type $ref|array|_=>_i32 (func (param (ref array)) (result i32)))
+
+ ;; CHECK: (func $len (type $ref|array|_=>_i32) (param $0 (ref array)) (result i32)
+ ;; CHECK-NEXT: (drop
+ ;; CHECK-NEXT: (return
+ ;; CHECK-NEXT: (array.len
+ ;; CHECK-NEXT: (local.get $0)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ (func $len (param (ref eq)) (result i32)
+ (drop
+ (block $not_array (result (ref eq))
+ (return
+ (array.len
+ (br_on_cast_fail $not_array (ref eq) (ref array)
+ (local.get 0)
+ )
+ )
+ )
+ )
+ )
+ (i32.const -1)
+ )
+ ;; CHECK: (func $optimize-after-refinement (type $ref|array|_=>_i32) (param $0 (ref array)) (result i32)
+ ;; CHECK-NEXT: (call $len
+ ;; CHECK-NEXT: (local.get $0)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ (func $optimize-after-refinement (param (ref array)) (result i32)
+ (call $len
+ (local.get 0)
+ )
+ )
+)