cmd/compile: fold constant in ADDshift op on loong64

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>
This commit is contained in:
Xiaolin Zhao 2025-09-08 18:00:52 +08:00 committed by Gopher Robot
parent 5b218461f9
commit 6447ff409a
2 changed files with 28 additions and 0 deletions

View file

@ -730,6 +730,9 @@
(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)

View 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]