Skip to content

Commit 2fdb22b

Browse files
authored
[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
1 parent 0d8aff6 commit 2fdb22b

File tree

4 files changed

+116
-44
lines changed

4 files changed

+116
-44
lines changed

src/ir/properties.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,8 +42,12 @@ inline bool isSymmetric(Binary* binary) {
4242
case EqInt64:
4343
case NeInt64:
4444

45+
case MinFloat32:
46+
case MaxFloat32:
4547
case EqFloat32:
4648
case NeFloat32:
49+
case MinFloat64:
50+
case MaxFloat64:
4751
case EqFloat64:
4852
case NeFloat64:
4953
return true;

src/passes/OptimizeInstructions.cpp

Lines changed: 5 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -3507,20 +3507,6 @@ struct OptimizeInstructions
35073507
return curr;
35083508
}
35093509
}
3510-
{
3511-
double value;
3512-
if (matches(curr, binary(Sub, any(), fval(&value))) && value == 0.0) {
3513-
// x - (-0.0) ==> x + 0.0
3514-
if (std::signbit(value)) {
3515-
curr->op = Abstract::getBinary(type, Add);
3516-
right->value = right->value.neg();
3517-
return curr;
3518-
} else if (fastMath) {
3519-
// x - 0.0 ==> x
3520-
return curr->left;
3521-
}
3522-
}
3523-
}
35243510
{
35253511
// x * 2.0 ==> x + x
35263512
// but we apply this only for simple expressions like
@@ -4709,6 +4695,11 @@ struct OptimizeInstructions
47094695
return true;
47104696
}
47114697
switch (binary->op) {
4698+
case SubFloat32:
4699+
case SubFloat64: {
4700+
// Should apply x - C -> x + (-C)
4701+
return binary->right->is<Const>();
4702+
}
47124703
case AddFloat32:
47134704
case MulFloat32:
47144705
case AddFloat64:

test/lit/passes/optimize-instructions.wast

Lines changed: 103 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2016,6 +2016,103 @@
20162016
(drop (i32.add (i32.ctz (local.get $x)) (i32.eqz (local.get $y))))
20172017
(drop (i32.add (i32.eqz (local.get $x)) (i32.ctz (local.get $y))))
20182018
)
2019+
;; CHECK: (func $canonicalize-consts-floats (param $x f32) (param $y f64)
2020+
;; CHECK-NEXT: (drop
2021+
;; CHECK-NEXT: (f32.add
2022+
;; CHECK-NEXT: (local.get $x)
2023+
;; CHECK-NEXT: (f32.const -1)
2024+
;; CHECK-NEXT: )
2025+
;; CHECK-NEXT: )
2026+
;; CHECK-NEXT: (drop
2027+
;; CHECK-NEXT: (f64.add
2028+
;; CHECK-NEXT: (local.get $y)
2029+
;; CHECK-NEXT: (f64.const -1)
2030+
;; CHECK-NEXT: )
2031+
;; CHECK-NEXT: )
2032+
;; CHECK-NEXT: (drop
2033+
;; CHECK-NEXT: (f32.mul
2034+
;; CHECK-NEXT: (local.get $x)
2035+
;; CHECK-NEXT: (f32.const 3.4000000953674316)
2036+
;; CHECK-NEXT: )
2037+
;; CHECK-NEXT: )
2038+
;; CHECK-NEXT: (drop
2039+
;; CHECK-NEXT: (f64.mul
2040+
;; CHECK-NEXT: (local.get $y)
2041+
;; CHECK-NEXT: (f64.const 3.4)
2042+
;; CHECK-NEXT: )
2043+
;; CHECK-NEXT: )
2044+
;; CHECK-NEXT: (drop
2045+
;; CHECK-NEXT: (f32.min
2046+
;; CHECK-NEXT: (local.get $x)
2047+
;; CHECK-NEXT: (f32.const 3.4000000953674316)
2048+
;; CHECK-NEXT: )
2049+
;; CHECK-NEXT: )
2050+
;; CHECK-NEXT: (drop
2051+
;; CHECK-NEXT: (f64.min
2052+
;; CHECK-NEXT: (local.get $y)
2053+
;; CHECK-NEXT: (f64.const 3.4)
2054+
;; CHECK-NEXT: )
2055+
;; CHECK-NEXT: )
2056+
;; CHECK-NEXT: (drop
2057+
;; CHECK-NEXT: (f32.max
2058+
;; CHECK-NEXT: (local.get $x)
2059+
;; CHECK-NEXT: (f32.const 3.4000000953674316)
2060+
;; CHECK-NEXT: )
2061+
;; CHECK-NEXT: )
2062+
;; CHECK-NEXT: (drop
2063+
;; CHECK-NEXT: (f64.max
2064+
;; CHECK-NEXT: (local.get $y)
2065+
;; CHECK-NEXT: (f64.const 3.4)
2066+
;; CHECK-NEXT: )
2067+
;; CHECK-NEXT: )
2068+
;; CHECK-NEXT: (drop
2069+
;; CHECK-NEXT: (f32.const nan:0x400000)
2070+
;; CHECK-NEXT: )
2071+
;; CHECK-NEXT: (drop
2072+
;; CHECK-NEXT: (f64.const nan:0x8000000000000)
2073+
;; CHECK-NEXT: )
2074+
;; CHECK-NEXT: (drop
2075+
;; CHECK-NEXT: (f32.const nan:0x400000)
2076+
;; CHECK-NEXT: )
2077+
;; CHECK-NEXT: (drop
2078+
;; CHECK-NEXT: (f64.const nan:0x8000000000000)
2079+
;; CHECK-NEXT: )
2080+
;; CHECK-NEXT: (drop
2081+
;; CHECK-NEXT: (f32.copysign
2082+
;; CHECK-NEXT: (f32.const 1)
2083+
;; CHECK-NEXT: (local.get $x)
2084+
;; CHECK-NEXT: )
2085+
;; CHECK-NEXT: )
2086+
;; CHECK-NEXT: (drop
2087+
;; CHECK-NEXT: (f64.copysign
2088+
;; CHECK-NEXT: (f64.const 1)
2089+
;; CHECK-NEXT: (local.get $y)
2090+
;; CHECK-NEXT: )
2091+
;; CHECK-NEXT: )
2092+
;; CHECK-NEXT: )
2093+
(func $canonicalize-consts-floats (param $x f32) (param $y f64)
2094+
(drop (f32.sub (local.get $x) (f32.const 1.0)))
2095+
(drop (f64.sub (local.get $y) (f64.const 1.0)))
2096+
2097+
(drop (f32.mul (f32.const 3.4) (local.get $x)))
2098+
(drop (f64.mul (f64.const 3.4) (local.get $y)))
2099+
2100+
(drop (f32.min (f32.const 3.4) (local.get $x)))
2101+
(drop (f64.min (f64.const 3.4) (local.get $y)))
2102+
2103+
(drop (f32.max (f32.const 3.4) (local.get $x)))
2104+
(drop (f64.max (f64.const 3.4) (local.get $y)))
2105+
2106+
(drop (f32.min (f32.const nan) (local.get $x)))
2107+
(drop (f64.min (f64.const nan) (local.get $y)))
2108+
2109+
(drop (f32.max (f32.const nan) (local.get $x)))
2110+
(drop (f64.max (f64.const nan) (local.get $y)))
2111+
2112+
;; skips
2113+
(drop (f32.copysign (f32.const 1.0) (local.get $x)))
2114+
(drop (f64.copysign (f64.const 1.0) (local.get $y)))
2115+
)
20192116
;; CHECK: (func $ne0 (result i32)
20202117
;; CHECK-NEXT: (if
20212118
;; CHECK-NEXT: (call $ne0)
@@ -10303,15 +10400,15 @@
1030310400
)
1030410401
;; CHECK: (func $const-float-zero (param $fx f32) (param $fy f64)
1030510402
;; CHECK-NEXT: (drop
10306-
;; CHECK-NEXT: (f32.sub
10403+
;; CHECK-NEXT: (f32.add
1030710404
;; CHECK-NEXT: (local.get $fx)
10308-
;; CHECK-NEXT: (f32.const 0)
10405+
;; CHECK-NEXT: (f32.const -0)
1030910406
;; CHECK-NEXT: )
1031010407
;; CHECK-NEXT: )
1031110408
;; CHECK-NEXT: (drop
10312-
;; CHECK-NEXT: (f64.sub
10409+
;; CHECK-NEXT: (f64.add
1031310410
;; CHECK-NEXT: (local.get $fy)
10314-
;; CHECK-NEXT: (f64.const 0)
10411+
;; CHECK-NEXT: (f64.const -0)
1031510412
;; CHECK-NEXT: )
1031610413
;; CHECK-NEXT: )
1031710414
;; CHECK-NEXT: (drop
@@ -10363,9 +10460,9 @@
1036310460
;; CHECK-NEXT: )
1036410461
;; CHECK-NEXT: )
1036510462
;; CHECK-NEXT: (drop
10366-
;; CHECK-NEXT: (f32.sub
10463+
;; CHECK-NEXT: (f32.add
1036710464
;; CHECK-NEXT: (f32.const -nan:0x34546d)
10368-
;; CHECK-NEXT: (f32.const 0)
10465+
;; CHECK-NEXT: (f32.const -0)
1036910466
;; CHECK-NEXT: )
1037010467
;; CHECK-NEXT: )
1037110468
;; CHECK-NEXT: )

test/passes/optimize-instructions_fuzz-exec.txt

Lines changed: 4 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -73,20 +73,10 @@
7373
)
7474
)
7575
(call $logf32
76-
(f32.min
77-
(f32.const -nan:0x7fff82)
78-
(f32.neg
79-
(f32.const -nan:0x7ff622)
80-
)
81-
)
76+
(f32.const nan:0x400000)
8277
)
8378
(call $logf32
84-
(f32.max
85-
(f32.const -nan:0x7fff82)
86-
(f32.neg
87-
(f32.const -nan:0x7ff622)
88-
)
89-
)
79+
(f32.const nan:0x400000)
9080
)
9181
)
9282
(func $1
@@ -126,20 +116,10 @@
126116
)
127117
)
128118
(call $logf64
129-
(f64.min
130-
(f64.const -nan:0xfffffffffff82)
131-
(f64.neg
132-
(f64.const -nan:0xfffffffffa622)
133-
)
134-
)
119+
(f64.const nan:0x8000000000000)
135120
)
136121
(call $logf64
137-
(f64.max
138-
(f64.const -nan:0xfffffffffff82)
139-
(f64.neg
140-
(f64.const -nan:0xfffffffffa622)
141-
)
142-
)
122+
(f64.const nan:0x8000000000000)
143123
)
144124
)
145125
(func $2

0 commit comments

Comments
 (0)