diff options
author | Max Graey <maxgraey@gmail.com> | 2020-09-30 05:36:17 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-09-29 19:36:17 -0700 |
commit | 7e99538386e047bddc41ad50b9762b7d4b9611b8 (patch) | |
tree | bd0d875a773e255c6e35be3806de71ec47250180 /test | |
parent | 67a96ae60085366b59d64bc997c9e6525c247e27 (diff) | |
download | binaryen-7e99538386e047bddc41ad50b9762b7d4b9611b8.tar.gz binaryen-7e99538386e047bddc41ad50b9762b7d4b9611b8.tar.bz2 binaryen-7e99538386e047bddc41ad50b9762b7d4b9611b8.zip |
Simplify signed remainders compared with zero (#3153)
Specifically when the divisor is a power of two.
`eqz((signed)x % C_pot)` -> `eqz(x & (C_pot - 1))`
`(signed)x % C_pot != 0` -> `x & (C_pot - 1) != 0`
Diffstat (limited to 'test')
-rw-r--r-- | test/passes/optimize-instructions_all-features.txt | 77 | ||||
-rw-r--r-- | test/passes/optimize-instructions_all-features.wast | 67 |
2 files changed, 143 insertions, 1 deletions
diff --git a/test/passes/optimize-instructions_all-features.txt b/test/passes/optimize-instructions_all-features.txt index e3ad30a0b..860783f36 100644 --- a/test/passes/optimize-instructions_all-features.txt +++ b/test/passes/optimize-instructions_all-features.txt @@ -2,8 +2,8 @@ (type $i32_i32_=>_none (func (param i32 i32))) (type $i32_=>_i32 (func (param i32) (result i32))) (type $none_=>_i32 (func (result i32))) - (type $none_=>_none (func)) (type $i32_i64_=>_none (func (param i32 i64))) + (type $none_=>_none (func)) (type $i32_i32_=>_i32 (func (param i32 i32) (result i32))) (type $i32_=>_none (func (param i32))) (type $none_=>_i64 (func (result i64))) @@ -2744,6 +2744,81 @@ (i64.const 0) ) ) + (func $srem-by-pot-eq-ne-zero (param $x i32) (param $y i64) + (drop + (i32.eqz + (i32.and + (local.get $x) + (i32.const 3) + ) + ) + ) + (drop + (i64.eqz + (i64.and + (local.get $y) + (i64.const 3) + ) + ) + ) + (drop + (i32.eqz + (i32.and + (local.get $x) + (i32.const 3) + ) + ) + ) + (drop + (i64.eqz + (i64.and + (local.get $y) + (i64.const 1) + ) + ) + ) + (drop + (i32.ne + (i32.and + (local.get $x) + (i32.const 1) + ) + (i32.const 0) + ) + ) + (drop + (i32.wrap_i64 + (i64.and + (local.get $y) + (i64.const 1) + ) + ) + ) + (drop + (i32.eqz + (i32.rem_s + (local.get $x) + (i32.const 3) + ) + ) + ) + (drop + (i32.eqz + (i32.rem_s + (local.get $x) + (i32.const -4) + ) + ) + ) + (drop + (i64.eqz + (i64.rem_s + (local.get $y) + (i64.const 3) + ) + ) + ) + ) (func $orZero (param $0 i32) (result i32) (local.get $0) ) diff --git a/test/passes/optimize-instructions_all-features.wast b/test/passes/optimize-instructions_all-features.wast index 8c2cefb53..1afa3e5b5 100644 --- a/test/passes/optimize-instructions_all-features.wast +++ b/test/passes/optimize-instructions_all-features.wast @@ -3104,6 +3104,73 @@ (i64.const 1) )) ) + (func $srem-by-pot-eq-ne-zero (param $x i32) (param $y i64) + ;; eqz((signed)x % 4) + (drop (i32.eqz + (i32.rem_s + (local.get $x) + (i32.const 4) + ) + )) + (drop (i64.eqz + (i64.rem_s + (local.get $y) + (i64.const 4) + ) + )) + ;; (signed)x % 4 == 0 + (drop (i32.eq + (i32.rem_s + (local.get $x) + (i32.const 4) + ) + (i32.const 0) + )) + (drop (i64.eq + (i64.rem_s + (local.get $y) + (i64.const 2) + ) + (i64.const 0) + )) + ;; ;; (signed)x % 2 != 0 + (drop (i32.ne + (i32.rem_s + (local.get $x) + (i32.const 2) + ) + (i32.const 0) + )) + (drop (i64.ne + (i64.rem_s + (local.get $y) + (i64.const 2) + ) + (i64.const 0) + )) + ;; ;; + (drop (i32.eq + (i32.rem_s + (local.get $x) + (i32.const 3) ;; skip + ) + (i32.const 0) + )) + (drop (i32.eq + (i32.rem_s + (local.get $x) + (i32.const -4) ;; skip + ) + (i32.const 0) + )) + (drop (i64.eq + (i64.rem_s + (local.get $y) + (i64.const 3) ;; skip + ) + (i64.const 0) + )) + ) (func $orZero (param $0 i32) (result i32) (i32.or (local.get $0) |