summaryrefslogtreecommitdiff
path: root/test/lit/passes/optimize-instructions.wast
diff options
context:
space:
mode:
Diffstat (limited to 'test/lit/passes/optimize-instructions.wast')
-rw-r--r--test/lit/passes/optimize-instructions.wast303
1 files changed, 293 insertions, 10 deletions
diff --git a/test/lit/passes/optimize-instructions.wast b/test/lit/passes/optimize-instructions.wast
index 22edf58e2..76074dadf 100644
--- a/test/lit/passes/optimize-instructions.wast
+++ b/test/lit/passes/optimize-instructions.wast
@@ -8608,18 +8608,10 @@
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (drop
- ;; CHECK-NEXT: (select
- ;; CHECK-NEXT: (i32.const 0)
- ;; CHECK-NEXT: (local.get $x)
- ;; CHECK-NEXT: (i32.const 0)
- ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (local.get $x)
;; CHECK-NEXT: )
;; CHECK-NEXT: (drop
- ;; CHECK-NEXT: (select
- ;; CHECK-NEXT: (i32.const 2)
- ;; CHECK-NEXT: (local.get $x)
- ;; CHECK-NEXT: (i32.const 2)
- ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (i32.const 2)
;; CHECK-NEXT: )
;; CHECK-NEXT: (drop
;; CHECK-NEXT: (select
@@ -10566,6 +10558,297 @@
(unreachable)
)
)
+ ;; CHECK: (func $select-with-same-arm-and-cond-32 (param $x i32)
+ ;; CHECK-NEXT: (drop
+ ;; CHECK-NEXT: (local.get $x)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (drop
+ ;; CHECK-NEXT: (block (result i32)
+ ;; CHECK-NEXT: (drop
+ ;; CHECK-NEXT: (local.get $x)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (i32.const 0)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (drop
+ ;; CHECK-NEXT: (block (result i32)
+ ;; CHECK-NEXT: (drop
+ ;; CHECK-NEXT: (local.get $x)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (i32.const 0)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ (func $select-with-same-arm-and-cond-32 (param $x i32)
+ ;; i32(x) ? i32(x) : 0 ==> x
+ (drop (select
+ (local.get $x)
+ (i32.const 0)
+ (local.get $x)
+ ))
+ ;; i32(x) ? 0 : i32(x) ==> {x, 0}
+ (drop (select
+ (i32.const 0)
+ (local.get $x)
+ (local.get $x)
+ ))
+ ;; i32(x) == 0 ? i32(x) : 0 ==> {x, 0}
+ (drop (select
+ (local.get $x)
+ (i32.const 0)
+ (i32.eqz (local.get $x))
+ ))
+ )
+
+ ;; CHECK: (func $select-with-same-arm-and-cond-64 (param $x i64)
+ ;; CHECK-NEXT: (drop
+ ;; CHECK-NEXT: (local.get $x)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (drop
+ ;; CHECK-NEXT: (local.get $x)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (drop
+ ;; CHECK-NEXT: (block (result i64)
+ ;; CHECK-NEXT: (drop
+ ;; CHECK-NEXT: (local.get $x)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (i64.const 0)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (drop
+ ;; CHECK-NEXT: (block (result i64)
+ ;; CHECK-NEXT: (drop
+ ;; CHECK-NEXT: (local.get $x)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (i64.const 0)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (drop
+ ;; CHECK-NEXT: (block (result i64)
+ ;; CHECK-NEXT: (drop
+ ;; CHECK-NEXT: (local.get $x)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (i64.const 0)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ (func $select-with-same-arm-and-cond-64 (param $x i64)
+ ;; i64(x) != 0 ? i64(x) : 0 ==> x
+ (drop (select
+ (local.get $x)
+ (i64.const 0)
+ (i64.ne
+ (local.get $x)
+ (i64.const 0)
+ )
+ ))
+ ;; i64(x) == 0 ? 0 : i64(x) ==> x
+ (drop (select
+ (i64.const 0)
+ (local.get $x)
+ (i64.eqz
+ (local.get $x)
+ )
+ ))
+ ;; i64(x) != 0 ? 0 : i64(x) ==> 0
+ (drop (select
+ (i64.const 0)
+ (local.get $x)
+ (i64.ne
+ (local.get $x)
+ (i64.const 0)
+ )
+ ))
+ ;; i64(x) == 0 ? i64(x) : 0 ==> {x, 0}
+ (drop (select
+ (local.get $x)
+ (i64.const 0)
+ (i64.eqz
+ (local.get $x)
+ )
+ ))
+ (drop (select
+ (local.get $x)
+ (i64.const 0)
+ (i64.eq
+ (local.get $x)
+ (i64.const 0)
+ )
+ ))
+ )
+
+ ;; CHECK: (func $select-with-same-arm-and-cond-skips (param $x i32) (param $y i64)
+ ;; CHECK-NEXT: (drop
+ ;; CHECK-NEXT: (select
+ ;; CHECK-NEXT: (local.get $x)
+ ;; CHECK-NEXT: (i32.const 0)
+ ;; CHECK-NEXT: (i32.wrap_i64
+ ;; CHECK-NEXT: (local.get $y)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (drop
+ ;; CHECK-NEXT: (select
+ ;; CHECK-NEXT: (i32.const 0)
+ ;; CHECK-NEXT: (i32.sub
+ ;; CHECK-NEXT: (i32.const 0)
+ ;; CHECK-NEXT: (local.get $x)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (local.get $x)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (drop
+ ;; CHECK-NEXT: (select
+ ;; CHECK-NEXT: (local.get $x)
+ ;; CHECK-NEXT: (i32.const -1)
+ ;; CHECK-NEXT: (local.get $x)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (drop
+ ;; CHECK-NEXT: (select
+ ;; CHECK-NEXT: (i32.const -1)
+ ;; CHECK-NEXT: (local.get $x)
+ ;; CHECK-NEXT: (local.get $x)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (drop
+ ;; CHECK-NEXT: (select
+ ;; CHECK-NEXT: (i64.const -1)
+ ;; CHECK-NEXT: (local.get $y)
+ ;; CHECK-NEXT: (i64.ne
+ ;; CHECK-NEXT: (local.get $y)
+ ;; CHECK-NEXT: (i64.const 0)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (drop
+ ;; CHECK-NEXT: (select
+ ;; CHECK-NEXT: (i64.const 0)
+ ;; CHECK-NEXT: (local.get $y)
+ ;; CHECK-NEXT: (i64.ne
+ ;; CHECK-NEXT: (local.get $y)
+ ;; CHECK-NEXT: (i64.const 1)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ (func $select-with-same-arm-and-cond-skips (param $x i32) (param $y i64)
+ ;; skip not equals
+ (drop (select
+ (local.get $x)
+ (i32.const 0)
+ (i32.wrap_i64 (local.get $y))
+ ))
+ (drop (select
+ (i32.const 0)
+ (i32.sub (i32.const 0) (local.get $x))
+ (local.get $x)
+ ))
+
+ ;; skip not zero
+ (drop (select
+ (local.get $x)
+ (i32.const -1)
+ (local.get $x)
+ ))
+ (drop (select
+ (i32.const -1)
+ (local.get $x)
+ (local.get $x)
+ ))
+ (drop (select
+ (i64.const -1)
+ (local.get $y)
+ (i64.ne
+ (local.get $y)
+ (i64.const 0)
+ )
+ ))
+ (drop (select
+ (i64.const 0)
+ (local.get $y)
+ (i64.ne
+ (local.get $y)
+ (i64.const 1)
+ )
+ ))
+ )
+
+ ;; CHECK: (func $select-with-same-arm-and-cond-skips-side-effects (param $x i32) (param $y i64)
+ ;; CHECK-NEXT: (drop
+ ;; CHECK-NEXT: (select
+ ;; CHECK-NEXT: (i32.div_u
+ ;; CHECK-NEXT: (i32.const 10)
+ ;; CHECK-NEXT: (local.get $x)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (i32.const 0)
+ ;; CHECK-NEXT: (i32.div_u
+ ;; CHECK-NEXT: (i32.const 10)
+ ;; CHECK-NEXT: (local.get $x)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (drop
+ ;; CHECK-NEXT: (select
+ ;; CHECK-NEXT: (i32.const 0)
+ ;; CHECK-NEXT: (call $ne0)
+ ;; CHECK-NEXT: (call $ne0)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (drop
+ ;; CHECK-NEXT: (select
+ ;; CHECK-NEXT: (call $select-sign-64-lt
+ ;; CHECK-NEXT: (local.get $y)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (i64.const 0)
+ ;; CHECK-NEXT: (i64.eqz
+ ;; CHECK-NEXT: (call $select-sign-64-lt
+ ;; CHECK-NEXT: (local.get $y)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (drop
+ ;; CHECK-NEXT: (select
+ ;; CHECK-NEXT: (i64.const 0)
+ ;; CHECK-NEXT: (call $select-sign-64-lt
+ ;; CHECK-NEXT: (local.get $y)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (i64.eqz
+ ;; CHECK-NEXT: (call $select-sign-64-lt
+ ;; CHECK-NEXT: (local.get $y)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ (func $select-with-same-arm-and-cond-skips-side-effects (param $x i32) (param $y i64)
+ ;; skip with side effects
+ (drop (select
+ (i32.div_u (i32.const 10) (local.get $x))
+ (i32.const 0)
+ (i32.div_u (i32.const 10) (local.get $x))
+ ))
+ (drop (select
+ (i32.const 0)
+ (call $ne0)
+ (call $ne0)
+ ))
+ (drop (select
+ (call $select-sign-64-lt (local.get $y))
+ (i64.const 0)
+ (i64.eqz
+ (call $select-sign-64-lt (local.get $y))
+ )
+ ))
+ (drop (select
+ (i64.const 0)
+ (call $select-sign-64-lt (local.get $y))
+ (i64.eqz
+ (call $select-sign-64-lt (local.get $y))
+ )
+ ))
+ )
;; CHECK: (func $optimize-boolean-context (param $x i32) (param $y i32)
;; CHECK-NEXT: (if
;; CHECK-NEXT: (local.get $x)