diff options
| author | Xiaolin Zhao <zhaoxiaolin@loongson.cn> | 2025-09-08 18:00:52 +0800 |
|---|---|---|
| committer | Gopher Robot <gobot@golang.org> | 2025-09-08 13:34:13 -0700 |
| commit | 6447ff409ac7e2a621bc8ca5c44b2eaed751fbaa (patch) | |
| tree | a4f32a23af578be1a9f7708c25ca451e230e9bfc /src/cmd/compile/internal | |
| parent | 5b218461f98b354ac9bde4fdd4f7046fdf2d2029 (diff) | |
| download | go-6447ff409ac7e2a621bc8ca5c44b2eaed751fbaa.tar.xz | |
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>
Diffstat (limited to 'src/cmd/compile/internal')
| -rw-r--r-- | src/cmd/compile/internal/ssa/_gen/LOONG64.rules | 3 | ||||
| -rw-r--r-- | src/cmd/compile/internal/ssa/rewriteLOONG64.go | 25 |
2 files changed, 28 insertions, 0 deletions
diff --git a/src/cmd/compile/internal/ssa/_gen/LOONG64.rules b/src/cmd/compile/internal/ssa/_gen/LOONG64.rules index a3dd050d14..d0a64364d6 100644 --- a/src/cmd/compile/internal/ssa/_gen/LOONG64.rules +++ b/src/cmd/compile/internal/ssa/_gen/LOONG64.rules @@ -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) diff --git a/src/cmd/compile/internal/ssa/rewriteLOONG64.go b/src/cmd/compile/internal/ssa/rewriteLOONG64.go index 036d70a15f..6a9b723c8c 100644 --- a/src/cmd/compile/internal/ssa/rewriteLOONG64.go +++ b/src/cmd/compile/internal/ssa/rewriteLOONG64.go @@ -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] |
