cmd/compile: fix boolean comparison on RISCV64

Following CL 405114, for RISCV64.

May fix RISCV64 builds.

Updates #52788.

Change-Id: Ifc34658703d1e8b97665e7b862060152e3005d71
Reviewed-on: https://go-review.googlesource.com/c/go/+/405553
Reviewed-by: David Chase <drchase@google.com>
Run-TryBot: Cherry Mui <cherryyz@google.com>
This commit is contained in:
Cherry Mui 2022-05-10 10:49:33 -04:00
parent f269d90bf2
commit d6e6140c98
2 changed files with 50 additions and 3 deletions

View File

@ -583,7 +583,7 @@
(AtomicOr32 ...) => (LoweredAtomicOr32 ...)
// Conditional branches
(If cond yes no) => (BNEZ cond yes no)
(If cond yes no) => (BNEZ (MOVBUreg <typ.UInt64> cond) yes no)
// Optimizations
@ -621,6 +621,10 @@
(MOVWstore [off] {sym} ptr (MOVDconst [0]) mem) => (MOVWstorezero [off] {sym} ptr mem)
(MOVDstore [off] {sym} ptr (MOVDconst [0]) mem) => (MOVDstorezero [off] {sym} ptr mem)
// Boolean ops are already extended.
(MOVBUreg x:((SEQZ|SNEZ) _)) => x
(MOVBUreg x:((SLT|SLTU) _ _)) => x
// Avoid sign/zero extension for consts.
(MOVBreg (MOVDconst [c])) => (MOVDconst [int64(int8(c))])
(MOVHreg (MOVDconst [c])) => (MOVDconst [int64(int16(c))])

View File

@ -3152,6 +3152,46 @@ func rewriteValueRISCV64_OpRISCV64MOVBUload(v *Value) bool {
func rewriteValueRISCV64_OpRISCV64MOVBUreg(v *Value) bool {
v_0 := v.Args[0]
b := v.Block
// match: (MOVBUreg x:(SEQZ _))
// result: x
for {
x := v_0
if x.Op != OpRISCV64SEQZ {
break
}
v.copyOf(x)
return true
}
// match: (MOVBUreg x:(SNEZ _))
// result: x
for {
x := v_0
if x.Op != OpRISCV64SNEZ {
break
}
v.copyOf(x)
return true
}
// match: (MOVBUreg x:(SLT _ _))
// result: x
for {
x := v_0
if x.Op != OpRISCV64SLT {
break
}
v.copyOf(x)
return true
}
// match: (MOVBUreg x:(SLTU _ _))
// result: x
for {
x := v_0
if x.Op != OpRISCV64SLTU {
break
}
v.copyOf(x)
return true
}
// match: (MOVBUreg (MOVDconst [c]))
// result: (MOVDconst [int64(uint8(c))])
for {
@ -6483,6 +6523,7 @@ func rewriteValueRISCV64_OpZero(v *Value) bool {
}
}
func rewriteBlockRISCV64(b *Block) bool {
typ := &b.Func.Config.Types
switch b.Kind {
case BlockRISCV64BEQ:
// match: (BEQ (MOVDconst [0]) cond yes no)
@ -6690,10 +6731,12 @@ func rewriteBlockRISCV64(b *Block) bool {
}
case BlockIf:
// match: (If cond yes no)
// result: (BNEZ cond yes no)
// result: (BNEZ (MOVBUreg <typ.UInt64> cond) yes no)
for {
cond := b.Controls[0]
b.resetWithControl(BlockRISCV64BNEZ, cond)
v0 := b.NewValue0(cond.Pos, OpRISCV64MOVBUreg, typ.UInt64)
v0.AddArg(cond)
b.resetWithControl(BlockRISCV64BNEZ, v0)
return true
}
}