aboutsummaryrefslogtreecommitdiff
path: root/src/cmd/compile
diff options
context:
space:
mode:
authorlimeidan <limeidan@loongson.cn>2025-07-28 14:46:45 +0800
committerabner chenc <chenguoqi@loongson.cn>2025-08-12 18:02:02 -0700
commitb266318cf714ab34be01e32d7338053ca6dcb294 (patch)
tree4cd833634eab39265237a3f0dc564d5f31841df8 /src/cmd/compile
parentadbf59525c06ae7e037ad0e9a7709ebed2528d66 (diff)
downloadgo-b266318cf714ab34be01e32d7338053ca6dcb294.tar.xz
cmd/compile/internal/ssa: use BEQ/BNE to optimize the combination of XOR and EQ/NE on loong64
Reduce the number of go toolchain instructions on loong64 as follows: file before after Δ % go 1599056 1590560 -8496 -0.5313% gofmt 326188 326104 -84 -0.0258% asm 563482 561250 -2232 -0.3961% cgo 488644 485252 -3392 -0.6942% compile 2504614 2486388 -18226 -0.7277% cover 526322 523270 -3052 -0.5799% link 714532 711124 -3408 -0.4770% preprofile 242316 241112 -1204 -0.4969% vet 794446 786118 -8328 -1.0483% Change-Id: I0914889119a28ea672b694529ef54513fbb3f3b5 Reviewed-on: https://go-review.googlesource.com/c/go/+/693875 LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com> Reviewed-by: abner chenc <chenguoqi@loongson.cn> Reviewed-by: Dmitri Shuralyov <dmitshur@google.com> Reviewed-by: Keith Randall <khr@google.com>
Diffstat (limited to 'src/cmd/compile')
-rw-r--r--src/cmd/compile/internal/ssa/_gen/LOONG64latelower.rules3
-rw-r--r--src/cmd/compile/internal/ssa/rewriteLOONG64latelower.go32
2 files changed, 35 insertions, 0 deletions
diff --git a/src/cmd/compile/internal/ssa/_gen/LOONG64latelower.rules b/src/cmd/compile/internal/ssa/_gen/LOONG64latelower.rules
index 95844381c2..44583e8e34 100644
--- a/src/cmd/compile/internal/ssa/_gen/LOONG64latelower.rules
+++ b/src/cmd/compile/internal/ssa/_gen/LOONG64latelower.rules
@@ -4,3 +4,6 @@
// Prefer addition when shifting left by one.
(SLLVconst [1] x) => (ADDV x x)
+
+(EQZ (XOR x y) yes no) => (BEQ x y yes no)
+(NEZ (XOR x y) yes no) => (BNE x y yes no)
diff --git a/src/cmd/compile/internal/ssa/rewriteLOONG64latelower.go b/src/cmd/compile/internal/ssa/rewriteLOONG64latelower.go
index ef9b83192c..60ba120e48 100644
--- a/src/cmd/compile/internal/ssa/rewriteLOONG64latelower.go
+++ b/src/cmd/compile/internal/ssa/rewriteLOONG64latelower.go
@@ -25,5 +25,37 @@ func rewriteValueLOONG64latelower_OpLOONG64SLLVconst(v *Value) bool {
return false
}
func rewriteBlockLOONG64latelower(b *Block) bool {
+ switch b.Kind {
+ case BlockLOONG64EQZ:
+ // match: (EQZ (XOR x y) yes no)
+ // result: (BEQ x y yes no)
+ for b.Controls[0].Op == OpLOONG64XOR {
+ v_0 := b.Controls[0]
+ _ = v_0.Args[1]
+ v_0_0 := v_0.Args[0]
+ v_0_1 := v_0.Args[1]
+ for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
+ x := v_0_0
+ y := v_0_1
+ b.resetWithControl2(BlockLOONG64BEQ, x, y)
+ return true
+ }
+ }
+ case BlockLOONG64NEZ:
+ // match: (NEZ (XOR x y) yes no)
+ // result: (BNE x y yes no)
+ for b.Controls[0].Op == OpLOONG64XOR {
+ v_0 := b.Controls[0]
+ _ = v_0.Args[1]
+ v_0_0 := v_0.Args[0]
+ v_0_1 := v_0.Args[1]
+ for _i0 := 0; _i0 <= 1; _i0, v_0_0, v_0_1 = _i0+1, v_0_1, v_0_0 {
+ x := v_0_0
+ y := v_0_1
+ b.resetWithControl2(BlockLOONG64BNE, x, y)
+ return true
+ }
+ }
+ }
return false
}