mirror of
https://github.com/golang/go.git
synced 2025-12-08 06:10:04 +00:00
cmd/compile: remove NEG when used with SEQZ/SNEZ on riscv64
The negation does not change the comparison to zero. Also remove unnecessary x.Uses == 1 condition from equivalent BEQZ/BNEZ rules. Change-Id: I62dd8e383e42bfe5c46d11bbf78d8e5ff862a1d5 Reviewed-on: https://go-review.googlesource.com/c/go/+/426262 Reviewed-by: Cherry Mui <cherryyz@google.com> TryBot-Result: Gopher Robot <gobot@golang.org> Run-TryBot: Cherry Mui <cherryyz@google.com> Reviewed-by: Heschi Kreinick <heschi@google.com>
This commit is contained in:
parent
239115c3ef
commit
971373f56a
2 changed files with 51 additions and 21 deletions
|
|
@ -505,6 +505,8 @@ func rewriteValueRISCV64(v *Value) bool {
|
|||
return rewriteValueRISCV64_OpRISCV64OR(v)
|
||||
case OpRISCV64ORI:
|
||||
return rewriteValueRISCV64_OpRISCV64ORI(v)
|
||||
case OpRISCV64SEQZ:
|
||||
return rewriteValueRISCV64_OpRISCV64SEQZ(v)
|
||||
case OpRISCV64SLL:
|
||||
return rewriteValueRISCV64_OpRISCV64SLL(v)
|
||||
case OpRISCV64SLLI:
|
||||
|
|
@ -517,6 +519,8 @@ func rewriteValueRISCV64(v *Value) bool {
|
|||
return rewriteValueRISCV64_OpRISCV64SLTIU(v)
|
||||
case OpRISCV64SLTU:
|
||||
return rewriteValueRISCV64_OpRISCV64SLTU(v)
|
||||
case OpRISCV64SNEZ:
|
||||
return rewriteValueRISCV64_OpRISCV64SNEZ(v)
|
||||
case OpRISCV64SRA:
|
||||
return rewriteValueRISCV64_OpRISCV64SRA(v)
|
||||
case OpRISCV64SRAI:
|
||||
|
|
@ -5000,6 +5004,21 @@ func rewriteValueRISCV64_OpRISCV64ORI(v *Value) bool {
|
|||
}
|
||||
return false
|
||||
}
|
||||
func rewriteValueRISCV64_OpRISCV64SEQZ(v *Value) bool {
|
||||
v_0 := v.Args[0]
|
||||
// match: (SEQZ (NEG x))
|
||||
// result: (SEQZ x)
|
||||
for {
|
||||
if v_0.Op != OpRISCV64NEG {
|
||||
break
|
||||
}
|
||||
x := v_0.Args[0]
|
||||
v.reset(OpRISCV64SEQZ)
|
||||
v.AddArg(x)
|
||||
return true
|
||||
}
|
||||
return false
|
||||
}
|
||||
func rewriteValueRISCV64_OpRISCV64SLL(v *Value) bool {
|
||||
v_1 := v.Args[1]
|
||||
v_0 := v.Args[0]
|
||||
|
|
@ -5102,6 +5121,21 @@ func rewriteValueRISCV64_OpRISCV64SLTU(v *Value) bool {
|
|||
}
|
||||
return false
|
||||
}
|
||||
func rewriteValueRISCV64_OpRISCV64SNEZ(v *Value) bool {
|
||||
v_0 := v.Args[0]
|
||||
// match: (SNEZ (NEG x))
|
||||
// result: (SNEZ x)
|
||||
for {
|
||||
if v_0.Op != OpRISCV64NEG {
|
||||
break
|
||||
}
|
||||
x := v_0.Args[0]
|
||||
v.reset(OpRISCV64SNEZ)
|
||||
v.AddArg(x)
|
||||
return true
|
||||
}
|
||||
return false
|
||||
}
|
||||
func rewriteValueRISCV64_OpRISCV64SRA(v *Value) bool {
|
||||
v_1 := v.Args[1]
|
||||
v_0 := v.Args[0]
|
||||
|
|
@ -6893,16 +6927,12 @@ func rewriteBlockRISCV64(b *Block) bool {
|
|||
b.resetWithControl(BlockRISCV64BEQZ, x)
|
||||
return true
|
||||
}
|
||||
// match: (BEQZ x:(NEG y) yes no)
|
||||
// cond: x.Uses == 1
|
||||
// result: (BEQZ y yes no)
|
||||
// match: (BEQZ (NEG x) yes no)
|
||||
// result: (BEQZ x yes no)
|
||||
for b.Controls[0].Op == OpRISCV64NEG {
|
||||
x := b.Controls[0]
|
||||
y := x.Args[0]
|
||||
if !(x.Uses == 1) {
|
||||
break
|
||||
}
|
||||
b.resetWithControl(BlockRISCV64BEQZ, y)
|
||||
v_0 := b.Controls[0]
|
||||
x := v_0.Args[0]
|
||||
b.resetWithControl(BlockRISCV64BEQZ, x)
|
||||
return true
|
||||
}
|
||||
// match: (BEQZ (SUB x y) yes no)
|
||||
|
|
@ -7018,16 +7048,12 @@ func rewriteBlockRISCV64(b *Block) bool {
|
|||
b.resetWithControl(BlockRISCV64BNEZ, x)
|
||||
return true
|
||||
}
|
||||
// match: (BNEZ x:(NEG y) yes no)
|
||||
// cond: x.Uses == 1
|
||||
// result: (BNEZ y yes no)
|
||||
// match: (BNEZ (NEG x) yes no)
|
||||
// result: (BNEZ x yes no)
|
||||
for b.Controls[0].Op == OpRISCV64NEG {
|
||||
x := b.Controls[0]
|
||||
y := x.Args[0]
|
||||
if !(x.Uses == 1) {
|
||||
break
|
||||
}
|
||||
b.resetWithControl(BlockRISCV64BNEZ, y)
|
||||
v_0 := b.Controls[0]
|
||||
x := v_0.Args[0]
|
||||
b.resetWithControl(BlockRISCV64BNEZ, x)
|
||||
return true
|
||||
}
|
||||
// match: (BNEZ (SUB x y) yes no)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue