diff options
author | Max Graey <maxgraey@gmail.com> | 2022-09-15 23:17:51 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-09-15 13:17:51 -0700 |
commit | 2fdb22bc26185e94ccd775bbfe8ea271be03df45 (patch) | |
tree | 7c9935698de035f905eafc247f547af6acd3aea1 /test | |
parent | 0d8aff6d85850a5f05ed6f5dc359f1b93120769d (diff) | |
download | binaryen-2fdb22bc26185e94ccd775bbfe8ea271be03df45.tar.gz binaryen-2fdb22bc26185e94ccd775bbfe8ea271be03df45.tar.bz2 binaryen-2fdb22bc26185e94ccd775bbfe8ea271be03df45.zip |
[OptimizeInstructions] More canonizations for floating points (#5033)
x - C -> x + (-C)
min(C, x) -> min(x, C)
max(C, x) -> max(x, C)
And remove redundant rules
Diffstat (limited to 'test')
-rw-r--r-- | test/lit/passes/optimize-instructions.wast | 109 | ||||
-rw-r--r-- | test/passes/optimize-instructions_fuzz-exec.txt | 28 |
2 files changed, 107 insertions, 30 deletions
diff --git a/test/lit/passes/optimize-instructions.wast b/test/lit/passes/optimize-instructions.wast index df8037a72..c1835442d 100644 --- a/test/lit/passes/optimize-instructions.wast +++ b/test/lit/passes/optimize-instructions.wast @@ -2016,6 +2016,103 @@ (drop (i32.add (i32.ctz (local.get $x)) (i32.eqz (local.get $y)))) (drop (i32.add (i32.eqz (local.get $x)) (i32.ctz (local.get $y)))) ) + ;; CHECK: (func $canonicalize-consts-floats (param $x f32) (param $y f64) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (f32.add + ;; CHECK-NEXT: (local.get $x) + ;; CHECK-NEXT: (f32.const -1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (f64.add + ;; CHECK-NEXT: (local.get $y) + ;; CHECK-NEXT: (f64.const -1) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (f32.mul + ;; CHECK-NEXT: (local.get $x) + ;; CHECK-NEXT: (f32.const 3.4000000953674316) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (f64.mul + ;; CHECK-NEXT: (local.get $y) + ;; CHECK-NEXT: (f64.const 3.4) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (f32.min + ;; CHECK-NEXT: (local.get $x) + ;; CHECK-NEXT: (f32.const 3.4000000953674316) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (f64.min + ;; CHECK-NEXT: (local.get $y) + ;; CHECK-NEXT: (f64.const 3.4) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (f32.max + ;; CHECK-NEXT: (local.get $x) + ;; CHECK-NEXT: (f32.const 3.4000000953674316) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (f64.max + ;; CHECK-NEXT: (local.get $y) + ;; CHECK-NEXT: (f64.const 3.4) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (f32.const nan:0x400000) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (f64.const nan:0x8000000000000) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (f32.const nan:0x400000) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (f64.const nan:0x8000000000000) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (f32.copysign + ;; CHECK-NEXT: (f32.const 1) + ;; CHECK-NEXT: (local.get $x) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (f64.copysign + ;; CHECK-NEXT: (f64.const 1) + ;; CHECK-NEXT: (local.get $y) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (func $canonicalize-consts-floats (param $x f32) (param $y f64) + (drop (f32.sub (local.get $x) (f32.const 1.0))) + (drop (f64.sub (local.get $y) (f64.const 1.0))) + + (drop (f32.mul (f32.const 3.4) (local.get $x))) + (drop (f64.mul (f64.const 3.4) (local.get $y))) + + (drop (f32.min (f32.const 3.4) (local.get $x))) + (drop (f64.min (f64.const 3.4) (local.get $y))) + + (drop (f32.max (f32.const 3.4) (local.get $x))) + (drop (f64.max (f64.const 3.4) (local.get $y))) + + (drop (f32.min (f32.const nan) (local.get $x))) + (drop (f64.min (f64.const nan) (local.get $y))) + + (drop (f32.max (f32.const nan) (local.get $x))) + (drop (f64.max (f64.const nan) (local.get $y))) + + ;; skips + (drop (f32.copysign (f32.const 1.0) (local.get $x))) + (drop (f64.copysign (f64.const 1.0) (local.get $y))) + ) ;; CHECK: (func $ne0 (result i32) ;; CHECK-NEXT: (if ;; CHECK-NEXT: (call $ne0) @@ -10303,15 +10400,15 @@ ) ;; CHECK: (func $const-float-zero (param $fx f32) (param $fy f64) ;; CHECK-NEXT: (drop - ;; CHECK-NEXT: (f32.sub + ;; CHECK-NEXT: (f32.add ;; CHECK-NEXT: (local.get $fx) - ;; CHECK-NEXT: (f32.const 0) + ;; CHECK-NEXT: (f32.const -0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (drop - ;; CHECK-NEXT: (f64.sub + ;; CHECK-NEXT: (f64.add ;; CHECK-NEXT: (local.get $fy) - ;; CHECK-NEXT: (f64.const 0) + ;; CHECK-NEXT: (f64.const -0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (drop @@ -10363,9 +10460,9 @@ ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: (drop - ;; CHECK-NEXT: (f32.sub + ;; CHECK-NEXT: (f32.add ;; CHECK-NEXT: (f32.const -nan:0x34546d) - ;; CHECK-NEXT: (f32.const 0) + ;; CHECK-NEXT: (f32.const -0) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) diff --git a/test/passes/optimize-instructions_fuzz-exec.txt b/test/passes/optimize-instructions_fuzz-exec.txt index 16b17cf26..33a3945dc 100644 --- a/test/passes/optimize-instructions_fuzz-exec.txt +++ b/test/passes/optimize-instructions_fuzz-exec.txt @@ -73,20 +73,10 @@ ) ) (call $logf32 - (f32.min - (f32.const -nan:0x7fff82) - (f32.neg - (f32.const -nan:0x7ff622) - ) - ) + (f32.const nan:0x400000) ) (call $logf32 - (f32.max - (f32.const -nan:0x7fff82) - (f32.neg - (f32.const -nan:0x7ff622) - ) - ) + (f32.const nan:0x400000) ) ) (func $1 @@ -126,20 +116,10 @@ ) ) (call $logf64 - (f64.min - (f64.const -nan:0xfffffffffff82) - (f64.neg - (f64.const -nan:0xfffffffffa622) - ) - ) + (f64.const nan:0x8000000000000) ) (call $logf64 - (f64.max - (f64.const -nan:0xfffffffffff82) - (f64.neg - (f64.const -nan:0xfffffffffa622) - ) - ) + (f64.const nan:0x8000000000000) ) ) (func $2 |