summaryrefslogtreecommitdiff
path: root/test/lit/passes/optimize-instructions.wast
diff options
context:
space:
mode:
authorMax Graey <maxgraey@gmail.com>2022-01-26 19:50:59 +0200
committerGitHub <noreply@github.com>2022-01-26 09:50:59 -0800
commitcabe97319f146d72da26d9c3f7b41e920fa982de (patch)
treeaacf97444584edcbcccbcbf0954cc9ad1f1f0a8a /test/lit/passes/optimize-instructions.wast
parent707be2b55075dccaaf0a70e23352c972fce5aa76 (diff)
downloadbinaryen-cabe97319f146d72da26d9c3f7b41e920fa982de.tar.gz
binaryen-cabe97319f146d72da26d9c3f7b41e920fa982de.tar.bz2
binaryen-cabe97319f146d72da26d9c3f7b41e920fa982de.zip
[OptimizeInstructions] Combine some relational ops joined Or/And (Part 7-8) (#4399)
Final part of #4265 (i32(x) >= 0) & (i32(y) >= 0) ==> i32(x | y) >= 0 (i64(x) >= 0) & (i64(y) >= 0) ==> i64(x | y) >= 0 (i32(x) == -1) & (i32(y) == -1) ==> i32(x & y) == -1 (i64(x) == -1) & (i64(y) == -1) ==> i64(x & y) == -1
Diffstat (limited to 'test/lit/passes/optimize-instructions.wast')
-rw-r--r--test/lit/passes/optimize-instructions.wast102
1 files changed, 102 insertions, 0 deletions
diff --git a/test/lit/passes/optimize-instructions.wast b/test/lit/passes/optimize-instructions.wast
index 5d8d0473f..70e28cfd6 100644
--- a/test/lit/passes/optimize-instructions.wast
+++ b/test/lit/passes/optimize-instructions.wast
@@ -11253,6 +11253,108 @@
(i64.lt_s (local.get $b) (i64.const 0))
))
)
+ ;; CHECK: (func $optimize-combined-by-and-greatequal-zero (param $x i32) (param $y i32) (param $a i64) (param $b i64)
+ ;; CHECK-NEXT: (drop
+ ;; CHECK-NEXT: (i32.ge_s
+ ;; CHECK-NEXT: (i32.or
+ ;; CHECK-NEXT: (local.get $x)
+ ;; CHECK-NEXT: (local.get $y)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (i32.const 0)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (drop
+ ;; CHECK-NEXT: (i64.ge_s
+ ;; CHECK-NEXT: (i64.or
+ ;; CHECK-NEXT: (local.get $a)
+ ;; CHECK-NEXT: (local.get $b)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (i64.const 0)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (drop
+ ;; CHECK-NEXT: (i32.and
+ ;; CHECK-NEXT: (i32.ge_s
+ ;; CHECK-NEXT: (local.get $x)
+ ;; CHECK-NEXT: (i32.const 0)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (i64.ge_s
+ ;; CHECK-NEXT: (local.get $a)
+ ;; CHECK-NEXT: (i64.const 0)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ (func $optimize-combined-by-and-greatequal-zero (param $x i32) (param $y i32) (param $a i64) (param $b i64)
+ ;; (i32(x) >= 0) & (i32(y) >= 0) ==> i32(x | y) >= 0
+ (drop (i32.and
+ (i32.ge_s (local.get $x) (i32.const 0))
+ (i32.ge_s (local.get $y) (i32.const 0))
+ ))
+ ;; (i64(x) >= 0) & (i64(y) >= 0) ==> i64(x | y) >= 0
+ (drop (i32.and
+ (i64.ge_s (local.get $a) (i64.const 0))
+ (i64.ge_s (local.get $b) (i64.const 0))
+ ))
+
+ ;; skips
+ ;; (i32(x) >= 0) & (i64(y) >= 0) ==> skip
+ (drop (i32.and
+ (i32.ge_s (local.get $x) (i32.const 0))
+ (i64.ge_s (local.get $a) (i64.const 0))
+ ))
+ )
+ ;; CHECK: (func $optimize-combined-by-and-equal-neg-one (param $x i32) (param $y i32) (param $a i64) (param $b i64)
+ ;; CHECK-NEXT: (drop
+ ;; CHECK-NEXT: (i32.eq
+ ;; CHECK-NEXT: (i32.and
+ ;; CHECK-NEXT: (local.get $x)
+ ;; CHECK-NEXT: (local.get $y)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (i32.const -1)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (drop
+ ;; CHECK-NEXT: (i64.eq
+ ;; CHECK-NEXT: (i64.and
+ ;; CHECK-NEXT: (local.get $a)
+ ;; CHECK-NEXT: (local.get $b)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (i64.const -1)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (drop
+ ;; CHECK-NEXT: (i32.and
+ ;; CHECK-NEXT: (i32.eq
+ ;; CHECK-NEXT: (local.get $x)
+ ;; CHECK-NEXT: (i32.const -1)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (i64.eq
+ ;; CHECK-NEXT: (local.get $a)
+ ;; CHECK-NEXT: (i64.const -1)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ (func $optimize-combined-by-and-equal-neg-one (param $x i32) (param $y i32) (param $a i64) (param $b i64)
+ ;; (i32(x) == -1) & (i32(y) == -1) ==> i32(x & y) == -1
+ (drop (i32.and
+ (i32.eq (local.get $x) (i32.const -1))
+ (i32.eq (local.get $y) (i32.const -1))
+ ))
+ ;; (i64(x) == -1) & (i64(y) == -1) ==> i64(x & y) == -1
+ (drop (i32.and
+ (i64.eq (local.get $a) (i64.const -1))
+ (i64.eq (local.get $b) (i64.const -1))
+ ))
+
+ ;; skips
+ ;; (i32(x) == -1) & (i64(y) == -1) ==> skip
+ (drop (i32.and
+ (i32.eq (local.get $x) (i32.const -1))
+ (i64.eq (local.get $a) (i64.const -1))
+ ))
+ )
;; CHECK: (func $optimize-relationals (param $x i32) (param $y i32) (param $X i64) (param $Y i64)
;; CHECK-NEXT: (drop
;; CHECK-NEXT: (i32.eq