diff options
Diffstat (limited to 'test/lit/passes/optimize-instructions.wast')
-rw-r--r-- | test/lit/passes/optimize-instructions.wast | 445 |
1 files changed, 445 insertions, 0 deletions
diff --git a/test/lit/passes/optimize-instructions.wast b/test/lit/passes/optimize-instructions.wast index c1835442d..a4c8170a6 100644 --- a/test/lit/passes/optimize-instructions.wast +++ b/test/lit/passes/optimize-instructions.wast @@ -10517,6 +10517,425 @@ (f32.const 0) )) ) + + ;; CHECK: (func $simplify-add-sub-with-neg-float (param $a f32) (param $b f32) (param $x f64) (param $y f64) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (f32.sub + ;; CHECK-NEXT: (local.get $b) + ;; CHECK-NEXT: (local.get $a) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (f64.sub + ;; CHECK-NEXT: (local.get $y) + ;; CHECK-NEXT: (local.get $x) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (f32.sub + ;; CHECK-NEXT: (local.get $a) + ;; CHECK-NEXT: (local.get $b) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (f64.sub + ;; CHECK-NEXT: (local.get $x) + ;; CHECK-NEXT: (local.get $y) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (f32.add + ;; CHECK-NEXT: (local.get $a) + ;; CHECK-NEXT: (local.get $b) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (f64.add + ;; CHECK-NEXT: (local.get $x) + ;; CHECK-NEXT: (local.get $y) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (f32.sub + ;; CHECK-NEXT: (f32.neg + ;; CHECK-NEXT: (local.get $a) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.get $b) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (f64.sub + ;; CHECK-NEXT: (f64.neg + ;; CHECK-NEXT: (local.get $x) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (local.get $y) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (func $simplify-add-sub-with-neg-float (param $a f32) (param $b f32) (param $x f64) (param $y f64) + ;; -x + y ==> y - x + (drop (f32.add (f32.neg (local.get $a)) (local.get $b))) + (drop (f64.add (f64.neg (local.get $x)) (local.get $y))) + + ;; x + (-y) ==> x - y + (drop (f32.add (local.get $a) (f32.neg (local.get $b)))) + (drop (f64.add (local.get $x) (f64.neg (local.get $y)))) + + ;; x - (-y) ==> x + y + (drop (f32.sub (local.get $a) (f32.neg (local.get $b)))) + (drop (f64.sub (local.get $x) (f64.neg (local.get $y)))) + + ;; skips + ;; -x - y -> skip + (drop (f32.sub (f32.neg (local.get $a)) (local.get $b))) + (drop (f64.sub (f64.neg (local.get $x)) (local.get $y))) + ) + ;; CHECK: (func $simplify-add-sub-with-neg-float-zeros (param $a f32) (param $b f32) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (f32.add + ;; CHECK-NEXT: (local.get $b) + ;; CHECK-NEXT: (f32.const -0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (f32.sub + ;; CHECK-NEXT: (f32.const 0) + ;; CHECK-NEXT: (local.get $a) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (f32.add + ;; CHECK-NEXT: (local.get $b) + ;; CHECK-NEXT: (f32.const 0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (f32.sub + ;; CHECK-NEXT: (f32.const -0) + ;; CHECK-NEXT: (local.get $a) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (f32.sub + ;; CHECK-NEXT: (f32.const 0) + ;; CHECK-NEXT: (local.get $b) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (f32.add + ;; CHECK-NEXT: (local.get $a) + ;; CHECK-NEXT: (f32.const -0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (f32.sub + ;; CHECK-NEXT: (f32.const -0) + ;; CHECK-NEXT: (local.get $b) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (f32.add + ;; CHECK-NEXT: (local.get $a) + ;; CHECK-NEXT: (f32.const 0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (f32.add + ;; CHECK-NEXT: (local.get $b) + ;; CHECK-NEXT: (f32.const 0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (f32.add + ;; CHECK-NEXT: (local.get $a) + ;; CHECK-NEXT: (f32.const 0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (f32.add + ;; CHECK-NEXT: (local.get $b) + ;; CHECK-NEXT: (f32.const -0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (f32.add + ;; CHECK-NEXT: (local.get $a) + ;; CHECK-NEXT: (f32.const -0) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (func $simplify-add-sub-with-neg-float-zeros (param $a f32) (param $b f32) + ;; edge cases for -x + y + (drop (f32.add (f32.neg (f32.const 0)) (local.get $b))) + (drop (f32.add (f32.neg (local.get $a)) (f32.const 0))) + (drop (f32.add (f32.neg (f32.const -0)) (local.get $b))) + (drop (f32.add (f32.neg (local.get $a)) (f32.const -0))) + ;; edge cases for x + (-y) + (drop (f32.add (f32.const 0) (f32.neg (local.get $b)))) + (drop (f32.add (local.get $a) (f32.neg (f32.const 0)))) + (drop (f32.add (f32.const -0) (f32.neg (local.get $b)))) + (drop (f32.add (local.get $a) (f32.neg (f32.const -0)))) + ;; edge cases for x - (-y) + (drop (f32.sub (f32.const 0) (f32.neg (local.get $b)))) + (drop (f32.sub (local.get $a) (f32.neg (f32.const 0)))) + (drop (f32.sub (f32.const -0) (f32.neg (local.get $b)))) + (drop (f32.sub (local.get $a) (f32.neg (f32.const -0)))) + ) + ;; CHECK: (func $simplify-add-sub-with-neg-float-nans (param $a f32) (param $b f32) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (f32.const nan:0x400000) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (f32.sub + ;; CHECK-NEXT: (f32.const nan:0x400000) + ;; CHECK-NEXT: (local.get $a) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (f32.const nan:0x400000) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (f32.sub + ;; CHECK-NEXT: (f32.const -nan:0x400000) + ;; CHECK-NEXT: (local.get $a) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (f32.sub + ;; CHECK-NEXT: (f32.const nan:0x400000) + ;; CHECK-NEXT: (local.get $b) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (f32.const nan:0x400000) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (f32.sub + ;; CHECK-NEXT: (f32.const -nan:0x400000) + ;; CHECK-NEXT: (local.get $b) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (f32.const nan:0x400000) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (f32.add + ;; CHECK-NEXT: (f32.const nan:0x400000) + ;; CHECK-NEXT: (local.get $b) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (f32.const nan:0x400000) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (f32.add + ;; CHECK-NEXT: (f32.const -nan:0x400000) + ;; CHECK-NEXT: (local.get $b) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (f32.const nan:0x400000) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (func $simplify-add-sub-with-neg-float-nans (param $a f32) (param $b f32) + ;; edge cases for -x + y + (drop (f32.add (f32.neg (f32.const nan)) (local.get $b))) + (drop (f32.add (f32.neg (local.get $a)) (f32.const nan))) + (drop (f32.add (f32.neg (f32.const -nan)) (local.get $b))) + (drop (f32.add (f32.neg (local.get $a)) (f32.const -nan))) + ;; edge cases for x + (-y) + (drop (f32.add (f32.const nan) (f32.neg (local.get $b)))) + (drop (f32.add (local.get $a) (f32.neg (f32.const nan)))) + (drop (f32.add (f32.const -nan) (f32.neg (local.get $b)))) + (drop (f32.add (local.get $a) (f32.neg (f32.const -nan)))) + ;; edge cases for x - (-y) + (drop (f32.sub (f32.const nan) (f32.neg (local.get $b)))) + (drop (f32.sub (local.get $a) (f32.neg (f32.const nan)))) + (drop (f32.sub (f32.const -nan) (f32.neg (local.get $b)))) + (drop (f32.sub (local.get $a) (f32.neg (f32.const -nan)))) + ) + ;; CHECK: (func $simplify-add-sub-with-neg-float-infs (param $a f32) (param $b f32) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (f32.add + ;; CHECK-NEXT: (local.get $b) + ;; CHECK-NEXT: (f32.const -inf) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (f32.sub + ;; CHECK-NEXT: (f32.const inf) + ;; CHECK-NEXT: (local.get $a) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (f32.add + ;; CHECK-NEXT: (local.get $b) + ;; CHECK-NEXT: (f32.const inf) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (f32.sub + ;; CHECK-NEXT: (f32.const -inf) + ;; CHECK-NEXT: (local.get $a) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (f32.sub + ;; CHECK-NEXT: (f32.const inf) + ;; CHECK-NEXT: (local.get $b) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (f32.add + ;; CHECK-NEXT: (local.get $a) + ;; CHECK-NEXT: (f32.const -inf) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (f32.sub + ;; CHECK-NEXT: (f32.const -inf) + ;; CHECK-NEXT: (local.get $b) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (f32.add + ;; CHECK-NEXT: (local.get $a) + ;; CHECK-NEXT: (f32.const inf) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (f32.add + ;; CHECK-NEXT: (local.get $b) + ;; CHECK-NEXT: (f32.const inf) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (f32.add + ;; CHECK-NEXT: (local.get $a) + ;; CHECK-NEXT: (f32.const inf) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (f32.add + ;; CHECK-NEXT: (local.get $b) + ;; CHECK-NEXT: (f32.const -inf) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (f32.add + ;; CHECK-NEXT: (local.get $a) + ;; CHECK-NEXT: (f32.const -inf) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (func $simplify-add-sub-with-neg-float-infs (param $a f32) (param $b f32) + ;; edge cases for -x + y + (drop (f32.add (f32.neg (f32.const inf)) (local.get $b))) + (drop (f32.add (f32.neg (local.get $a)) (f32.const inf))) + (drop (f32.add (f32.neg (f32.const -inf)) (local.get $b))) + (drop (f32.add (f32.neg (local.get $a)) (f32.const -inf))) + ;; edge cases for x + (-y) + (drop (f32.add (f32.const inf) (f32.neg (local.get $b)))) + (drop (f32.add (local.get $a) (f32.neg (f32.const inf)))) + (drop (f32.add (f32.const -inf) (f32.neg (local.get $b)))) + (drop (f32.add (local.get $a) (f32.neg (f32.const -inf)))) + ;; edge cases for x - (-y) + (drop (f32.sub (f32.const inf) (f32.neg (local.get $b)))) + (drop (f32.sub (local.get $a) (f32.neg (f32.const inf)))) + (drop (f32.sub (f32.const -inf) (f32.neg (local.get $b)))) + (drop (f32.sub (local.get $a) (f32.neg (f32.const -inf)))) + ) + ;; CHECK: (func $simplify-add-sub-with-neg-float-mins (param $a f32) (param $b f32) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (f32.add + ;; CHECK-NEXT: (local.get $b) + ;; CHECK-NEXT: (f32.const -1.401298464324817e-45) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (f32.sub + ;; CHECK-NEXT: (f32.const 1.401298464324817e-45) + ;; CHECK-NEXT: (local.get $a) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (f32.add + ;; CHECK-NEXT: (local.get $b) + ;; CHECK-NEXT: (f32.const 1.401298464324817e-45) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (f32.sub + ;; CHECK-NEXT: (f32.const -1.401298464324817e-45) + ;; CHECK-NEXT: (local.get $a) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (f32.sub + ;; CHECK-NEXT: (f32.const 1.401298464324817e-45) + ;; CHECK-NEXT: (local.get $b) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (f32.add + ;; CHECK-NEXT: (local.get $a) + ;; CHECK-NEXT: (f32.const -1.401298464324817e-45) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (f32.sub + ;; CHECK-NEXT: (f32.const -1.401298464324817e-45) + ;; CHECK-NEXT: (local.get $b) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (f32.add + ;; CHECK-NEXT: (local.get $a) + ;; CHECK-NEXT: (f32.const 1.401298464324817e-45) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (f32.add + ;; CHECK-NEXT: (local.get $b) + ;; CHECK-NEXT: (f32.const 1.401298464324817e-45) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (f32.add + ;; CHECK-NEXT: (local.get $a) + ;; CHECK-NEXT: (f32.const 1.401298464324817e-45) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (f32.add + ;; CHECK-NEXT: (local.get $b) + ;; CHECK-NEXT: (f32.const -1.401298464324817e-45) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (f32.add + ;; CHECK-NEXT: (local.get $a) + ;; CHECK-NEXT: (f32.const -1.401298464324817e-45) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + (func $simplify-add-sub-with-neg-float-mins (param $a f32) (param $b f32) + ;; edge cases for -x + y + (drop (f32.add (f32.neg (f32.const 1.401298464324817e-45)) (local.get $b))) ;; +min value + (drop (f32.add (f32.neg (local.get $a)) (f32.const 1.401298464324817e-45))) ;; +min value + (drop (f32.add (f32.neg (f32.const -1.401298464324817e-45)) (local.get $b))) ;; -min value + (drop (f32.add (f32.neg (local.get $a)) (f32.const -1.401298464324817e-45))) ;; -min value + ;; edge cases for x + (-y) + (drop (f32.add (f32.const 1.401298464324817e-45) (f32.neg (local.get $b)))) + (drop (f32.add (local.get $a) (f32.neg (f32.const 1.401298464324817e-45)))) + (drop (f32.add (f32.const -1.401298464324817e-45) (f32.neg (local.get $b)))) + (drop (f32.add (local.get $a) (f32.neg (f32.const -1.401298464324817e-45)))) + ;; edge cases for x - (-y) + (drop (f32.sub (f32.const 1.401298464324817e-45) (f32.neg (local.get $b)))) + (drop (f32.sub (local.get $a) (f32.neg (f32.const 1.401298464324817e-45)))) + (drop (f32.sub (f32.const -1.401298464324817e-45) (f32.neg (local.get $b)))) + (drop (f32.sub (local.get $a) (f32.neg (f32.const -1.401298464324817e-45)))) + ) ;; CHECK: (func $rhs-is-neg-one (param $x i32) (param $y i64) (param $fx f32) (param $fy f64) ;; CHECK-NEXT: (drop ;; CHECK-NEXT: (i32.add @@ -10932,6 +11351,18 @@ ;; CHECK-NEXT: (local.get $fy) ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (f32.sub + ;; CHECK-NEXT: (f32.const 3.5) + ;; CHECK-NEXT: (local.get $fx) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: (drop + ;; CHECK-NEXT: (f64.sub + ;; CHECK-NEXT: (f64.const 5) + ;; CHECK-NEXT: (local.get $fy) + ;; CHECK-NEXT: ) + ;; CHECK-NEXT: ) ;; CHECK-NEXT: ) (func $rhs-is-const (param $x i32) (param $y i64) (param $fx f32) (param $fy f64) ;; signed divs @@ -11160,6 +11591,20 @@ (local.get $fy) ) )) + + ;; -x + C -> C - x + (drop (f32.add + (f32.neg + (local.get $fx) + ) + (f32.const 3.5) + )) + (drop (f64.sub + (f64.neg + (local.get $fy) + ) + (f64.const -5) + )) ) ;; CHECK: (func $rhs-is-const-nan (param $x f32) (param $y f64) ;; CHECK-NEXT: (drop |