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.wast496
1 files changed, 443 insertions, 53 deletions
diff --git a/test/lit/passes/optimize-instructions.wast b/test/lit/passes/optimize-instructions.wast
index c75040a9f..df8037a72 100644
--- a/test/lit/passes/optimize-instructions.wast
+++ b/test/lit/passes/optimize-instructions.wast
@@ -152,9 +152,8 @@
)
)
;; CHECK: (func $eqz-gt_s (result i32)
- ;; CHECK-NEXT: (i32.le_u
- ;; CHECK-NEXT: (i32.const 1)
- ;; CHECK-NEXT: (i32.const 2)
+ ;; CHECK-NEXT: (i32.eqz
+ ;; CHECK-NEXT: (i32.const 0)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $eqz-gt_s (result i32)
@@ -166,9 +165,8 @@
)
)
;; CHECK: (func $eqz-ge_s (result i32)
- ;; CHECK-NEXT: (i32.lt_u
- ;; CHECK-NEXT: (i32.const 1)
- ;; CHECK-NEXT: (i32.const 2)
+ ;; CHECK-NEXT: (i32.eqz
+ ;; CHECK-NEXT: (i32.const 0)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $eqz-ge_s (result i32)
@@ -180,9 +178,8 @@
)
)
;; CHECK: (func $eqz-lt_s (result i32)
- ;; CHECK-NEXT: (i32.ge_u
+ ;; CHECK-NEXT: (i32.eqz
;; CHECK-NEXT: (i32.const 1)
- ;; CHECK-NEXT: (i32.const 2)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $eqz-lt_s (result i32)
@@ -194,9 +191,8 @@
)
)
;; CHECK: (func $eqz-le_s (result i32)
- ;; CHECK-NEXT: (i32.gt_u
+ ;; CHECK-NEXT: (i32.eqz
;; CHECK-NEXT: (i32.const 1)
- ;; CHECK-NEXT: (i32.const 2)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $eqz-le_s (result i32)
@@ -208,9 +204,8 @@
)
)
;; CHECK: (func $eqz-gt_u (result i32)
- ;; CHECK-NEXT: (i32.le_u
- ;; CHECK-NEXT: (i32.const 1)
- ;; CHECK-NEXT: (i32.const 2)
+ ;; CHECK-NEXT: (i32.eqz
+ ;; CHECK-NEXT: (i32.const 0)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $eqz-gt_u (result i32)
@@ -222,9 +217,8 @@
)
)
;; CHECK: (func $eqz-ge_u (result i32)
- ;; CHECK-NEXT: (i32.lt_u
- ;; CHECK-NEXT: (i32.const 1)
- ;; CHECK-NEXT: (i32.const 2)
+ ;; CHECK-NEXT: (i32.eqz
+ ;; CHECK-NEXT: (i32.const 0)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $eqz-ge_u (result i32)
@@ -236,9 +230,8 @@
)
)
;; CHECK: (func $eqz-lt_u (result i32)
- ;; CHECK-NEXT: (i32.ge_u
+ ;; CHECK-NEXT: (i32.eqz
;; CHECK-NEXT: (i32.const 1)
- ;; CHECK-NEXT: (i32.const 2)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $eqz-lt_u (result i32)
@@ -250,9 +243,8 @@
)
)
;; CHECK: (func $eqz-le_u (result i32)
- ;; CHECK-NEXT: (i32.gt_u
+ ;; CHECK-NEXT: (i32.eqz
;; CHECK-NEXT: (i32.const 1)
- ;; CHECK-NEXT: (i32.const 2)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $eqz-le_u (result i32)
@@ -463,10 +455,7 @@
)
)
;; CHECK: (func $eq-zero-lhs (result i32)
- ;; CHECK-NEXT: (i32.eq
- ;; CHECK-NEXT: (i32.const 0)
- ;; CHECK-NEXT: (i32.const 100)
- ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (i32.const 0)
;; CHECK-NEXT: )
(func $eq-zero-lhs (result i32)
(i32.eq
@@ -497,10 +486,7 @@
)
)
;; CHECK: (func $eq-zero-lhs-i64 (result i32)
- ;; CHECK-NEXT: (i64.eq
- ;; CHECK-NEXT: (i64.const 0)
- ;; CHECK-NEXT: (i64.const 100)
- ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (i32.const 0)
;; CHECK-NEXT: )
(func $eq-zero-lhs-i64 (result i32)
(i64.eq
@@ -1385,10 +1371,7 @@
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (drop
- ;; CHECK-NEXT: (i32.lt_u
- ;; CHECK-NEXT: (i32.const 2000)
- ;; CHECK-NEXT: (i32.const 3000)
- ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (i32.const 1)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $and-pos1
@@ -12702,13 +12685,7 @@
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (drop
- ;; CHECK-NEXT: (i32.eq
- ;; CHECK-NEXT: (i32.and
- ;; CHECK-NEXT: (local.get $x)
- ;; CHECK-NEXT: (i32.const 2147483647)
- ;; CHECK-NEXT: )
- ;; CHECK-NEXT: (i32.const -2147483648)
- ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (i32.const 0)
;; CHECK-NEXT: )
;; CHECK-NEXT: (drop
;; CHECK-NEXT: (i64.shr_u
@@ -12756,13 +12733,7 @@
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (drop
- ;; CHECK-NEXT: (i32.ge_s
- ;; CHECK-NEXT: (i32.and
- ;; CHECK-NEXT: (local.get $x)
- ;; CHECK-NEXT: (i32.const 2147483647)
- ;; CHECK-NEXT: )
- ;; CHECK-NEXT: (i32.const -7)
- ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (i32.const 1)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $unsigned-context (param $x i32) (param $y i64)
@@ -15314,13 +15285,7 @@
;; CHECK-NEXT: )
;; CHECK-NEXT: )
;; CHECK-NEXT: (drop
- ;; CHECK-NEXT: (i32.ne
- ;; CHECK-NEXT: (i32.shr_u
- ;; CHECK-NEXT: (local.get $x)
- ;; CHECK-NEXT: (i32.const 1)
- ;; CHECK-NEXT: )
- ;; CHECK-NEXT: (i32.const -1)
- ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (i32.const 1)
;; CHECK-NEXT: )
;; CHECK-NEXT: )
(func $gt_u-added-constant (param $x i32)
@@ -15650,4 +15615,429 @@
)
)
)
+
+ ;; CHECK: (func $too-few-bits (param $x i32)
+ ;; CHECK-NEXT: (drop
+ ;; CHECK-NEXT: (i32.const 0)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (drop
+ ;; CHECK-NEXT: (i32.const 0)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (drop
+ ;; CHECK-NEXT: (i32.const 0)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (drop
+ ;; CHECK-NEXT: (i32.const 0)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (drop
+ ;; CHECK-NEXT: (i32.const 0)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (drop
+ ;; CHECK-NEXT: (i32.const 1)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (drop
+ ;; CHECK-NEXT: (i32.const 1)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (drop
+ ;; CHECK-NEXT: (i32.const 1)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (drop
+ ;; CHECK-NEXT: (i32.const 1)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (drop
+ ;; CHECK-NEXT: (i32.const 1)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ (func $too-few-bits (param $x i32)
+ ;; Comparison of something with at most 8 bits to something with more than
+ ;; 8. These must all be false.
+ (drop
+ (i32.eq
+ (i32.and
+ (local.get $x)
+ (i32.const 255)
+ )
+ (i32.const 256)
+ )
+ )
+ (drop
+ (i32.gt_s
+ (i32.and
+ (local.get $x)
+ (i32.const 255)
+ )
+ (i32.const 256)
+ )
+ )
+ (drop
+ (i32.gt_u
+ (i32.and
+ (local.get $x)
+ (i32.const 255)
+ )
+ (i32.const 256)
+ )
+ )
+ (drop
+ (i32.ge_s
+ (i32.and
+ (local.get $x)
+ (i32.const 255)
+ )
+ (i32.const 256)
+ )
+ )
+ (drop
+ (i32.ge_u
+ (i32.and
+ (local.get $x)
+ (i32.const 255)
+ )
+ (i32.const 256)
+ )
+ )
+ ;; These are all true.
+ (drop
+ (i32.ne
+ (i32.and
+ (local.get $x)
+ (i32.const 255)
+ )
+ (i32.const 256)
+ )
+ )
+ (drop
+ (i32.lt_s
+ (i32.and
+ (local.get $x)
+ (i32.const 255)
+ )
+ (i32.const 256)
+ )
+ )
+ (drop
+ (i32.lt_u
+ (i32.and
+ (local.get $x)
+ (i32.const 255)
+ )
+ (i32.const 256)
+ )
+ )
+ (drop
+ (i32.le_s
+ (i32.and
+ (local.get $x)
+ (i32.const 255)
+ )
+ (i32.const 256)
+ )
+ )
+ (drop
+ (i32.le_u
+ (i32.and
+ (local.get $x)
+ (i32.const 255)
+ )
+ (i32.const 256)
+ )
+ )
+ )
+
+ ;; CHECK: (func $too-few-bits-no (param $x i32)
+ ;; CHECK-NEXT: (drop
+ ;; CHECK-NEXT: (i32.eq
+ ;; CHECK-NEXT: (i32.and
+ ;; CHECK-NEXT: (local.get $x)
+ ;; CHECK-NEXT: (i32.const 255)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (i32.const 255)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (drop
+ ;; CHECK-NEXT: (i32.ne
+ ;; CHECK-NEXT: (i32.and
+ ;; CHECK-NEXT: (local.get $x)
+ ;; CHECK-NEXT: (i32.const 255)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (i32.const 255)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (drop
+ ;; CHECK-NEXT: (i32.lt_u
+ ;; CHECK-NEXT: (i32.and
+ ;; CHECK-NEXT: (local.get $x)
+ ;; CHECK-NEXT: (i32.const 255)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (i32.const 255)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (drop
+ ;; CHECK-NEXT: (i32.lt_u
+ ;; CHECK-NEXT: (i32.and
+ ;; CHECK-NEXT: (local.get $x)
+ ;; CHECK-NEXT: (i32.const 255)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (i32.const 255)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (drop
+ ;; CHECK-NEXT: (i32.le_u
+ ;; CHECK-NEXT: (i32.and
+ ;; CHECK-NEXT: (local.get $x)
+ ;; CHECK-NEXT: (i32.const 255)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (i32.const 255)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (drop
+ ;; CHECK-NEXT: (i32.le_u
+ ;; CHECK-NEXT: (i32.and
+ ;; CHECK-NEXT: (local.get $x)
+ ;; CHECK-NEXT: (i32.const 255)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (i32.const 255)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (drop
+ ;; CHECK-NEXT: (i32.gt_u
+ ;; CHECK-NEXT: (i32.and
+ ;; CHECK-NEXT: (local.get $x)
+ ;; CHECK-NEXT: (i32.const 255)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (i32.const 255)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (drop
+ ;; CHECK-NEXT: (i32.gt_u
+ ;; CHECK-NEXT: (i32.and
+ ;; CHECK-NEXT: (local.get $x)
+ ;; CHECK-NEXT: (i32.const 255)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (i32.const 255)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (drop
+ ;; CHECK-NEXT: (i32.ge_u
+ ;; CHECK-NEXT: (i32.and
+ ;; CHECK-NEXT: (local.get $x)
+ ;; CHECK-NEXT: (i32.const 255)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (i32.const 255)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (drop
+ ;; CHECK-NEXT: (i32.ge_u
+ ;; CHECK-NEXT: (i32.and
+ ;; CHECK-NEXT: (local.get $x)
+ ;; CHECK-NEXT: (i32.const 255)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (i32.const 255)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ (func $too-few-bits-no (param $x i32)
+ ;; Identical to the above, but the constant is changed from 256 to 255. We
+ ;; cannot optimize here: the number of bits is the same and we can't infer
+ ;; anything.
+ (drop
+ (i32.eq
+ (i32.and
+ (local.get $x)
+ (i32.const 255)
+ )
+ (i32.const 255)
+ )
+ )
+ (drop
+ (i32.ne
+ (i32.and
+ (local.get $x)
+ (i32.const 255)
+ )
+ (i32.const 255)
+ )
+ )
+ (drop
+ (i32.lt_s
+ (i32.and
+ (local.get $x)
+ (i32.const 255)
+ )
+ (i32.const 255)
+ )
+ )
+ (drop
+ (i32.lt_u
+ (i32.and
+ (local.get $x)
+ (i32.const 255)
+ )
+ (i32.const 255)
+ )
+ )
+ (drop
+ (i32.le_s
+ (i32.and
+ (local.get $x)
+ (i32.const 255)
+ )
+ (i32.const 255)
+ )
+ )
+ (drop
+ (i32.le_u
+ (i32.and
+ (local.get $x)
+ (i32.const 255)
+ )
+ (i32.const 255)
+ )
+ )
+ (drop
+ (i32.gt_s
+ (i32.and
+ (local.get $x)
+ (i32.const 255)
+ )
+ (i32.const 255)
+ )
+ )
+ (drop
+ (i32.gt_u
+ (i32.and
+ (local.get $x)
+ (i32.const 255)
+ )
+ (i32.const 255)
+ )
+ )
+ (drop
+ (i32.ge_s
+ (i32.and
+ (local.get $x)
+ (i32.const 255)
+ )
+ (i32.const 255)
+ )
+ )
+ (drop
+ (i32.ge_u
+ (i32.and
+ (local.get $x)
+ (i32.const 255)
+ )
+ (i32.const 255)
+ )
+ )
+ )
+
+ ;; CHECK: (func $too-few-bits-signed (param $x i32)
+ ;; CHECK-NEXT: (drop
+ ;; CHECK-NEXT: (i32.const 0)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (drop
+ ;; CHECK-NEXT: (i32.const 0)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (drop
+ ;; CHECK-NEXT: (i32.const 1)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (drop
+ ;; CHECK-NEXT: (i32.const 1)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (drop
+ ;; CHECK-NEXT: (i32.ne
+ ;; CHECK-NEXT: (local.get $x)
+ ;; CHECK-NEXT: (i32.const -2147483648)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ (func $too-few-bits-signed (param $x i32)
+ ;; As above, but now using only signed operations and the constant on the
+ ;; right has the sign bit set. The left side is non-negative, which lets us
+ ;; infer the results here.
+ ;; These are all false:
+ (drop
+ (i32.lt_s
+ (i32.and
+ (local.get $x)
+ (i32.const 255)
+ )
+ (i32.const 0x80000000) ;; -2147483648
+ )
+ )
+ (drop
+ (i32.le_s
+ (i32.and
+ (local.get $x)
+ (i32.const 255)
+ )
+ (i32.const 0x80000000) ;; -2147483648
+ )
+ )
+ ;; These are all true:
+ (drop
+ (i32.gt_s
+ (i32.and
+ (local.get $x)
+ (i32.const 255)
+ )
+ (i32.const 0x80000000) ;; -2147483648
+ )
+ )
+ (drop
+ (i32.ge_s
+ (i32.and
+ (local.get $x)
+ (i32.const 255)
+ )
+ (i32.const 0x80000000) ;; -2147483648
+ )
+ )
+ ;; This cannot be inferred, as the left has too many possible bits (so it
+ ;; may have the sign bit set).
+ (drop
+ (i32.gt_s
+ (local.get $x)
+ (i32.const 0x80000000) ;; -2147483648
+ )
+ )
+ )
+
+ ;; CHECK: (func $too-few-bits-i64 (param $x i64)
+ ;; CHECK-NEXT: (drop
+ ;; CHECK-NEXT: (i32.const 0)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (drop
+ ;; CHECK-NEXT: (i64.eq
+ ;; CHECK-NEXT: (i64.and
+ ;; CHECK-NEXT: (local.get $x)
+ ;; CHECK-NEXT: (i64.const 255)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: (i64.const 255)
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ ;; CHECK-NEXT: )
+ (func $too-few-bits-i64 (param $x i64)
+ ;; As above, but with i64 values. We can infer 0 here.
+ (drop
+ (i64.eq
+ (i64.and
+ (local.get $x)
+ (i64.const 255)
+ )
+ (i64.const 256)
+ )
+ )
+ ;; The constant is now 255 and we cannot optimize here.
+ (drop
+ (i64.eq
+ (i64.and
+ (local.get $x)
+ (i64.const 255)
+ )
+ (i64.const 255)
+ )
+ )
+ )
)