]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/compile: improve IsNonNil rule on riscv64
authorJoel Sing <joel@sing.id.au>
Fri, 5 Mar 2021 17:46:07 +0000 (04:46 +1100)
committerJoel Sing <joel@sing.id.au>
Mon, 8 Mar 2021 03:23:21 +0000 (03:23 +0000)
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>

src/cmd/compile/internal/ssa/gen/RISCV64.rules
src/cmd/compile/internal/ssa/rewriteRISCV64.go

index d7efef039e9e806bd1637c2e1e782ffbee8343c5..dbe04f1d588875c82f668fe75ff3011731ba1fe1 100644 (file)
 (Convert ...) => (MOVconvert ...)
 
 // Checks
-(IsNonNil p) => (NeqPtr (MOVDconst [0]) p)
+(IsNonNil ...) => (SNEZ ...)
 (IsInBounds ...) => (Less64U ...)
 (IsSliceInBounds ...) => (Leq64U ...)
 
index 7f77477da74c2e9da9cc31ea237954873b98cef4..895f380d338ddcaeb1d765236d0c87b925bd4a50 100644 (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]