Commit 822a9f53 authored by fanzha02's avatar fanzha02 Committed by Cherry Zhang

cmd/compile: fix the error of absorbing boolean tests into block(FGE, FGT)

The CL 164718 mistyped the comparison flags. The rules for floating
point comparison should be GreaterThanF and GreaterEqualF. Fortunately,
the wrong optimizations were overwritten by other integer rules, so the
issue won't cause failure but just some performance impact.

The fixed CL optimizes the floating point test as follows.

source code: func foo(f float64) bool { return f > 4 || f < -4}
previous version: "FCMPD", "CSET\tGT", "CBZ"
fixed version: "FCMPD", BLE"

Add the test case.

Change-Id: Iea954fdbb8272b2d642dae0f816dc77286e6e1fa
Reviewed-on: https://go-review.googlesource.com/c/go/+/177121Reviewed-by: default avatarBen Shi <powerman1st@163.com>
Reviewed-by: default avatarCherry Zhang <cherryyz@google.com>
Run-TryBot: Ben Shi <powerman1st@163.com>
TryBot-Result: Gobot Gobot <gobot@golang.org>
parent 12279faa
......@@ -630,8 +630,8 @@
(NZ (GreaterEqualU cc) yes no) -> (UGE cc yes no)
(NZ (LessThanF cc) yes no) -> (FLT cc yes no)
(NZ (LessEqualF cc) yes no) -> (FLE cc yes no)
(NZ (GreaterThan cc) yes no) -> (FGT cc yes no)
(NZ (GreaterEqual cc) yes no) -> (FGE cc yes no)
(NZ (GreaterThanF cc) yes no) -> (FGT cc yes no)
(NZ (GreaterEqualF cc) yes no) -> (FGE cc yes no)
(EQ (CMPWconst [0] x:(ANDconst [c] y)) yes no) && x.Uses == 1 -> (EQ (TSTWconst [c] y) yes no)
(NE (CMPWconst [0] x:(ANDconst [c] y)) yes no) && x.Uses == 1 -> (NE (TSTWconst [c] y) yes no)
......
......@@ -41214,20 +41214,20 @@ func rewriteBlockARM64(b *Block) bool {
b.Aux = nil
return true
}
// match: (NZ (GreaterThan cc) yes no)
// match: (NZ (GreaterThanF cc) yes no)
// cond:
// result: (FGT cc yes no)
for v.Op == OpARM64GreaterThan {
for v.Op == OpARM64GreaterThanF {
cc := v.Args[0]
b.Kind = BlockARM64FGT
b.SetControl(cc)
b.Aux = nil
return true
}
// match: (NZ (GreaterEqual cc) yes no)
// match: (NZ (GreaterEqualF cc) yes no)
// cond:
// result: (FGE cc yes no)
for v.Op == OpARM64GreaterEqual {
for v.Op == OpARM64GreaterEqualF {
cc := v.Args[0]
b.Kind = BlockARM64FGE
b.SetControl(cc)
......
......@@ -117,6 +117,11 @@ func FusedSub64_b(x, y, z float64) float64 {
return z - x*y
}
func Cmp(f float64) bool {
// arm64:"FCMPD","BLE",-"CSET\tGT",-"CBZ"
return f > 4 || f < -4
}
// ---------------- //
// Non-floats //
// ---------------- //
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment