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>
This commit is contained in:
limeidan 2025-07-28 14:46:45 +08:00 committed by abner chenc
parent adbf59525c
commit b266318cf7
2 changed files with 35 additions and 0 deletions

View file

@ -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)

View file

@ -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
}