]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/compile: fold constant in ADDshift op on loong64
authorXiaolin Zhao <zhaoxiaolin@loongson.cn>
Mon, 8 Sep 2025 10:00:52 +0000 (18:00 +0800)
committerGopher Robot <gobot@golang.org>
Mon, 8 Sep 2025 20:34:13 +0000 (13:34 -0700)
Removes 918 instructions from the go binary on loong64.

        file        before      after       Δ
        go          1633120     1632948    -172
        gofmt       323470      323334     -136
        asm         568024      568024     -0
        cgo         488030      487890     -140
        compile     2501050     2500728    -322
        cover       530124      530124     -0
        link        723532      723520     -12
        preprofile  240568      240568     -0
        vet         819392      819256     -136

Change-Id: Id4015c66b2073323b7ad257b3ed05bb99f81e9a1
Reviewed-on: https://go-review.googlesource.com/c/go/+/701655
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
Reviewed-by: Keith Randall <khr@google.com>
Reviewed-by: Keith Randall <khr@golang.org>
Auto-Submit: Keith Randall <khr@golang.org>
Reviewed-by: Mark Freeman <markfreeman@google.com>
src/cmd/compile/internal/ssa/_gen/LOONG64.rules
src/cmd/compile/internal/ssa/rewriteLOONG64.go

index a3dd050d14b84387c172b73d1260254b35ae706b..d0a64364d68852fa037ce6da580a69d9fb09ab60 100644 (file)
 
 (ADDV x0 x1:(SLLVconst [c] y)) && x1.Uses == 1 && c > 0 && c <= 4 => (ADDshiftLLV x0 y [c])
 
+// fold constant in ADDshift op
+(ADDshiftLLV x (MOVVconst [c]) [d]) && is12Bit(c<<d) => (ADDVconst x [c<<d])
+
 // div by constant
 (DIVVU x (MOVVconst [1])) => x
 (DIVVU x (MOVVconst [c])) && isPowerOfTwo(c) => (SRLVconst [log64(c)] x)
index 036d70a15fbc53d6bfc88aab13cb47351d67fd5e..6a9b723c8c0d4d32a26c9eea4d222e016fa51f88 100644 (file)
@@ -324,6 +324,8 @@ func rewriteValueLOONG64(v *Value) bool {
                return rewriteValueLOONG64_OpLOONG64ADDV(v)
        case OpLOONG64ADDVconst:
                return rewriteValueLOONG64_OpLOONG64ADDVconst(v)
+       case OpLOONG64ADDshiftLLV:
+               return rewriteValueLOONG64_OpLOONG64ADDshiftLLV(v)
        case OpLOONG64AND:
                return rewriteValueLOONG64_OpLOONG64AND(v)
        case OpLOONG64ANDconst:
@@ -2024,6 +2026,29 @@ func rewriteValueLOONG64_OpLOONG64ADDVconst(v *Value) bool {
        }
        return false
 }
+func rewriteValueLOONG64_OpLOONG64ADDshiftLLV(v *Value) bool {
+       v_1 := v.Args[1]
+       v_0 := v.Args[0]
+       // match: (ADDshiftLLV x (MOVVconst [c]) [d])
+       // cond: is12Bit(c<<d)
+       // result: (ADDVconst x [c<<d])
+       for {
+               d := auxIntToInt64(v.AuxInt)
+               x := v_0
+               if v_1.Op != OpLOONG64MOVVconst {
+                       break
+               }
+               c := auxIntToInt64(v_1.AuxInt)
+               if !(is12Bit(c << d)) {
+                       break
+               }
+               v.reset(OpLOONG64ADDVconst)
+               v.AuxInt = int64ToAuxInt(c << d)
+               v.AddArg(x)
+               return true
+       }
+       return false
+}
 func rewriteValueLOONG64_OpLOONG64AND(v *Value) bool {
        v_1 := v.Args[1]
        v_0 := v.Args[0]