summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/passes/OptimizeInstructions.cpp25
-rw-r--r--test/lit/passes/optimize-instructions.wast445
-rw-r--r--test/passes/optimize-instructions_fuzz-exec.txt61
3 files changed, 480 insertions, 51 deletions
diff --git a/src/passes/OptimizeInstructions.cpp b/src/passes/OptimizeInstructions.cpp
index f16b0c1be..2f1b6b6a4 100644
--- a/src/passes/OptimizeInstructions.cpp
+++ b/src/passes/OptimizeInstructions.cpp
@@ -414,6 +414,31 @@ struct OptimizeInstructions
}
}
{
+ // -x + y ==> y - x
+ // where x, y are floating points
+ Expression* x;
+ if (matches(curr, binary(Add, unary(Neg, any(&x)), any()))) {
+ curr->op = Abstract::getBinary(curr->type, Sub);
+ curr->left = x;
+ std::swap(curr->left, curr->right);
+ return replaceCurrent(curr);
+ }
+ }
+ {
+ // x + (-y) ==> x - y
+ // x - (-y) ==> x + y
+ // where x, y are floating points
+ Expression* y;
+ if (matches(curr, binary(Add, any(), unary(Neg, any(&y)))) ||
+ matches(curr, binary(Sub, any(), unary(Neg, any(&y))))) {
+ curr->op = Abstract::getBinary(
+ curr->type,
+ curr->op == Abstract::getBinary(curr->type, Add) ? Sub : Add);
+ curr->right = y;
+ return replaceCurrent(curr);
+ }
+ }
+ {
// -x * -y ==> x * y
// where x, y are integers
Binary* bin;
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
diff --git a/test/passes/optimize-instructions_fuzz-exec.txt b/test/passes/optimize-instructions_fuzz-exec.txt
index 33a3945dc..53f5b848e 100644
--- a/test/passes/optimize-instructions_fuzz-exec.txt
+++ b/test/passes/optimize-instructions_fuzz-exec.txt
@@ -38,20 +38,10 @@
(export "ignore" (func $3))
(func $0
(call $logf32
- (f32.add
- (f32.const -nan:0x7fff82)
- (f32.neg
- (f32.const -nan:0x7ff622)
- )
- )
+ (f32.const nan:0x400000)
)
(call $logf32
- (f32.sub
- (f32.const -nan:0x7fff82)
- (f32.neg
- (f32.const -nan:0x7ff622)
- )
- )
+ (f32.const nan:0x400000)
)
(call $logf32
(f32.mul
@@ -81,20 +71,10 @@
)
(func $1
(call $logf64
- (f64.add
- (f64.const -nan:0xfffffffffff82)
- (f64.neg
- (f64.const -nan:0xfffffffffa622)
- )
- )
+ (f64.const nan:0x8000000000000)
)
(call $logf64
- (f64.sub
- (f64.const -nan:0xfffffffffff82)
- (f64.neg
- (f64.const -nan:0xfffffffffa622)
- )
- )
+ (f64.const nan:0x8000000000000)
)
(call $logf64
(f64.mul
@@ -124,51 +104,30 @@
)
(func $2
(call $logf32
- (f32.add
- (f32.neg
- (f32.const -nan:0x7ff622)
- )
- (f32.const 0)
- )
+ (f32.const nan:0x400000)
)
(call $logf32
(f32.add
(f32.const -nan:0x7ff622)
- (f32.neg
- (f32.const 0)
- )
+ (f32.const -0)
)
)
(call $logf32
- (f32.add
- (f32.neg
- (f32.const -nan:0x7ff622)
- )
- (f32.const -0)
- )
+ (f32.const nan:0x400000)
)
(call $logf32
(f32.add
(f32.const -nan:0x7ff622)
- (f32.neg
- (f32.const -0)
- )
+ (f32.const 0)
)
)
(call $logf32
- (f32.add
- (f32.neg
- (f32.const nan:0x7ff622)
- )
- (f32.const 0)
- )
+ (f32.const nan:0x400000)
)
(call $logf32
(f32.add
(f32.const nan:0x7ff622)
- (f32.neg
- (f32.const 0)
- )
+ (f32.const -0)
)
)
)