diff options
Diffstat (limited to 'test/lit/passes/optimize-instructions.wast')
-rw-r--r-- | test/lit/passes/optimize-instructions.wast | 357 |
1 files changed, 357 insertions, 0 deletions
diff --git a/test/lit/passes/optimize-instructions.wast b/test/lit/passes/optimize-instructions.wast index d8c72bb65..728b195de 100644 --- a/test/lit/passes/optimize-instructions.wast +++ b/test/lit/passes/optimize-instructions.wast @@ -15111,4 +15111,361 @@ ) ) ) + + ;; CHECK: (func $gt_u-added-constant (param $x i32) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (i32.gt_u + ;; CHECK-NEXT: (i32.shr_u + ;; CHECK-NEXT: (local.get $x) + ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (i32.const 6) + ;; 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 0) + ;; 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: ) + ;; CHECK-NEXT: ) + (func $gt_u-added-constant (param $x i32) + ;; x + C1 > C2 => x > (C2-C1), iff x+C1 and C2-C1 don't over/underflow + (drop + (i32.gt_u + (i32.add + (i32.shr_u + (local.get $x) + (i32.const 1) + ) + (i32.const 5) + ) + (i32.const 11) + ) + ) + ;; We can optimize even if the constants are equal. + (drop + (i32.gt_u + (i32.add + (i32.shr_u + (local.get $x) + (i32.const 1) + ) + (i32.const 5) + ) + (i32.const 5) + ) + ) + ;; x + C1 > C2 => x + (C1-C2) > 0, iff x+C1 and C1-C2 don't over/underflow + ;; After doing that, further optimizations are possible here. + (drop + (i32.gt_u + (i32.add + (i32.shr_u + (local.get $x) + (i32.const 1) + ) + (i32.const 6) + ) + (i32.const 5) + ) + ) + ) + + ;; CHECK: (func $gt_u-added-constant-no (param $x i32) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (i32.gt_u + ;; CHECK-NEXT: (i32.add + ;; CHECK-NEXT: (local.get $x) + ;; CHECK-NEXT: (i32.const 5) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (i32.const 11) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (i32.gt_u + ;; CHECK-NEXT: (i32.sub + ;; CHECK-NEXT: (i32.shr_u + ;; CHECK-NEXT: (local.get $x) + ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (i32.const -2147483648) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (i32.const 11) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (i32.gt_u + ;; CHECK-NEXT: (i32.sub + ;; 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 11) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (func $gt_u-added-constant-no (param $x i32) + ;; As above, but without the shr_u, A is big enough for a possible overflow, + ;; and we cannot optimize. + (drop + (i32.gt_u + (i32.add + (local.get $x) + (i32.const 5) + ) + (i32.const 11) + ) + ) + ;; With the added constant too big, it might overflow, and we cannot + ;; optimize. + (drop + (i32.gt_u + (i32.add + (i32.shr_u + (local.get $x) + (i32.const 1) + ) + (i32.const 0x80000000) + ) + (i32.const 11) + ) + ) + (drop + (i32.gt_u + (i32.add + (i32.shr_u + (local.get $x) + (i32.const 1) + ) + (i32.const 0xffffffff) + ) + (i32.const 11) + ) + ) + ) + + ;; CHECK: (func $ge_u-added-constant (param $x i32) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (i32.ge_u + ;; CHECK-NEXT: (i32.shr_u + ;; CHECK-NEXT: (local.get $x) + ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (i32.const 6) + ;; CHECK-NEXT: ) + ;; 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 $ge_u-added-constant (param $x i32) + ;; As above, but with ge rather than gt. We can optimize here. + (drop + (i32.ge_u + (i32.add + (i32.shr_u + (local.get $x) + (i32.const 1) + ) + (i32.const 5) + ) + (i32.const 11) + ) + ) + (drop + (i32.ge_u + (i32.add + (i32.shr_u + (local.get $x) + (i32.const 1) + ) + (i32.const 5) + ) + (i32.const 5) + ) + ) + (drop + (i32.ge_u + (i32.add + (i32.shr_u + (local.get $x) + (i32.const 1) + ) + (i32.const 6) + ) + (i32.const 5) + ) + ) + ) + + ;; CHECK: (func $ge_u-added-constant-no (param $x i32) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (i32.ge_u + ;; CHECK-NEXT: (i32.add + ;; CHECK-NEXT: (local.get $x) + ;; CHECK-NEXT: (i32.const 5) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (i32.const 11) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (i32.ge_u + ;; CHECK-NEXT: (i32.sub + ;; CHECK-NEXT: (i32.shr_u + ;; CHECK-NEXT: (local.get $x) + ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (i32.const -2147483648) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (i32.const 11) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (i32.ge_u + ;; CHECK-NEXT: (i32.sub + ;; 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 11) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (func $ge_u-added-constant-no (param $x i32) + ;; As above, but with ge rather than gt. We cannot optimize here. + (drop + (i32.ge_u + (i32.add + (local.get $x) + (i32.const 5) + ) + (i32.const 11) + ) + ) + (drop + (i32.ge_u + (i32.add + (i32.shr_u + (local.get $x) + (i32.const 1) + ) + (i32.const 0x80000000) + ) + (i32.const 11) + ) + ) + (drop + (i32.ge_u + (i32.add + (i32.shr_u + (local.get $x) + (i32.const 1) + ) + (i32.const 0xffffffff) + ) + (i32.const 11) + ) + ) + ) + + ;; CHECK: (func $eq-added-constant (param $x i32) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (i32.eq + ;; CHECK-NEXT: (i32.shr_u + ;; CHECK-NEXT: (local.get $x) + ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (i32.const 6) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (func $eq-added-constant (param $x i32) + ;; As above, but with eq rather than gt. We can optimize here. + (drop + (i32.eq + (i32.add + (i32.shr_u + (local.get $x) + (i32.const 1) + ) + (i32.const 5) + ) + (i32.const 11) + ) + ) + ) + + ;; CHECK: (func $ne-added-constant (param $x i32) + ;; 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 6) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (func $ne-added-constant (param $x i32) + ;; As above, but with ne rather than gt. We can optimize here. + (drop + (i32.ne + (i32.add + (i32.shr_u + (local.get $x) + (i32.const 1) + ) + (i32.const 5) + ) + (i32.const 11) + ) + ) + ) + + ;; CHECK: (func $lt-added-constant (param $x i32) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (i32.lt_u + ;; CHECK-NEXT: (i32.shr_u + ;; CHECK-NEXT: (local.get $x) + ;; CHECK-NEXT: (i32.const 1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (i32.const 6) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (func $lt-added-constant (param $x i32) + ;; As above, but with lt_s rather than gt_u. We can optimize here. + (drop + (i32.lt_s + (i32.add + (i32.shr_u + (local.get $x) + (i32.const 1) + ) + (i32.const 5) + ) + (i32.const 11) + ) + ) + ) ) |