cmd/compile: improve IsNonNil rule on riscv64

IsNonNil is readily implemented using SNEZ on riscv64, removing over 8,000
instructions from the go binary. Other rules will improve on this sequence,
however in this case it makes sense to use a direct simplification.

Change-Id: Ib4068599532398afcd05f51d160673ef5fb5e5a0
Reviewed-on: https://go-review.googlesource.com/c/go/+/299230
Trust: Joel Sing <joel@sing.id.au>
Reviewed-by: Michael Munday <mike.munday@lowrisc.org>
Reviewed-by: Cherry Zhang <cherryyz@google.com>
Run-TryBot: Cherry Zhang <cherryyz@google.com>
TryBot-Result: Go Bot <gobot@golang.org>
This commit is contained in:
Joel Sing 2021-03-06 04:46:07 +11:00
parent 597b5d192e
commit 125eca0f72
2 changed files with 3 additions and 17 deletions

View File

@ -423,7 +423,7 @@
(Convert ...) => (MOVconvert ...)
// Checks
(IsNonNil p) => (NeqPtr (MOVDconst [0]) p)
(IsNonNil ...) => (SNEZ ...)
(IsInBounds ...) => (Less64U ...)
(IsSliceInBounds ...) => (Leq64U ...)

View File

@ -239,7 +239,8 @@ func rewriteValueRISCV64(v *Value) bool {
v.Op = OpLess64U
return true
case OpIsNonNil:
return rewriteValueRISCV64_OpIsNonNil(v)
v.Op = OpRISCV64SNEZ
return true
case OpIsSliceInBounds:
v.Op = OpLeq64U
return true
@ -1101,21 +1102,6 @@ func rewriteValueRISCV64_OpHmul32u(v *Value) bool {
return true
}
}
func rewriteValueRISCV64_OpIsNonNil(v *Value) bool {
v_0 := v.Args[0]
b := v.Block
typ := &b.Func.Config.Types
// match: (IsNonNil p)
// result: (NeqPtr (MOVDconst [0]) p)
for {
p := v_0
v.reset(OpNeqPtr)
v0 := b.NewValue0(v.Pos, OpRISCV64MOVDconst, typ.UInt64)
v0.AuxInt = int64ToAuxInt(0)
v.AddArg2(v0, p)
return true
}
}
func rewriteValueRISCV64_OpLeq16(v *Value) bool {
v_1 := v.Args[1]
v_0 := v.Args[0]