From b1e933d95518a7978efb29772bd6129acf0af452 Mon Sep 17 00:00:00 2001 From: Xiaolin Zhao Date: Mon, 23 Jun 2025 17:45:26 +0800 Subject: [PATCH] cmd/compile: avoid extending when already sufficiently masked on loong64 MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Reduce the number of go toolchain instructions on loong64 as follows. file before after Δ % asm 562400 561348 -1052 -0.1871% cgo 488268 487932 -336 -0.0688% compile 2505750 2503710 -2040 -0.0814% cover 525874 525506 -368 -0.0700% link 714162 713562 -600 -0.0840% preprofile 240250 240054 -196 -0.0816% vet 794074 793742 -332 -0.0418% go 1598284 1597680 -604 -0.0378% gofmt 324126 323926 -200 -0.0617% total 7753188 7747460 -5728 -0.0739% Change-Id: I3406113553b0fc4947d763ab66e57e69aa98c020 Reviewed-on: https://go-review.googlesource.com/c/go/+/683615 Reviewed-by: Keith Randall LUCI-TryBot-Result: Go LUCI Reviewed-by: Keith Randall Reviewed-by: Mark Freeman --- .../compile/internal/ssa/_gen/LOONG64.rules | 8 ++ .../compile/internal/ssa/rewriteLOONG64.go | 90 +++++++++++++++++++ 2 files changed, 98 insertions(+) diff --git a/src/cmd/compile/internal/ssa/_gen/LOONG64.rules b/src/cmd/compile/internal/ssa/_gen/LOONG64.rules index cab63a503f..e81377d87d 100644 --- a/src/cmd/compile/internal/ssa/_gen/LOONG64.rules +++ b/src/cmd/compile/internal/ssa/_gen/LOONG64.rules @@ -843,6 +843,14 @@ (MOVBUreg (ANDconst [c] x)) => (ANDconst [c&0xff] x) +// Avoid extending when already sufficiently masked. +(MOVBreg x:(ANDconst [c] y)) && c >= 0 && int64(int8(c)) == c => x +(MOVHreg x:(ANDconst [c] y)) && c >= 0 && int64(int16(c)) == c => x +(MOVWreg x:(ANDconst [c] y)) && c >= 0 && int64(int32(c)) == c => x +(MOVBUreg x:(ANDconst [c] y)) && c >= 0 && int64(uint8(c)) == c => x +(MOVHUreg x:(ANDconst [c] y)) && c >= 0 && int64(uint16(c)) == c => x +(MOVWUreg x:(ANDconst [c] y)) && c >= 0 && int64(uint32(c)) == c => x + // Prefetch instructions (hint specified using aux field) // For PRELD{,X} A value of hint indicates: // hint=0 is defined as load prefetch to L1-cache diff --git a/src/cmd/compile/internal/ssa/rewriteLOONG64.go b/src/cmd/compile/internal/ssa/rewriteLOONG64.go index 7c46ed7727..8599725b90 100644 --- a/src/cmd/compile/internal/ssa/rewriteLOONG64.go +++ b/src/cmd/compile/internal/ssa/rewriteLOONG64.go @@ -2378,6 +2378,21 @@ func rewriteValueLOONG64_OpLOONG64MOVBUreg(v *Value) bool { v.AddArg(x) return true } + // match: (MOVBUreg x:(ANDconst [c] y)) + // cond: c >= 0 && int64(uint8(c)) == c + // result: x + for { + x := v_0 + if x.Op != OpLOONG64ANDconst { + break + } + c := auxIntToInt64(x.AuxInt) + if !(c >= 0 && int64(uint8(c)) == c) { + break + } + v.copyOf(x) + return true + } return false } func rewriteValueLOONG64_OpLOONG64MOVBload(v *Value) bool { @@ -2526,6 +2541,21 @@ func rewriteValueLOONG64_OpLOONG64MOVBreg(v *Value) bool { v.AuxInt = int64ToAuxInt(int64(int8(c))) return true } + // match: (MOVBreg x:(ANDconst [c] y)) + // cond: c >= 0 && int64(int8(c)) == c + // result: x + for { + x := v_0 + if x.Op != OpLOONG64ANDconst { + break + } + c := auxIntToInt64(x.AuxInt) + if !(c >= 0 && int64(int8(c)) == c) { + break + } + v.copyOf(x) + return true + } return false } func rewriteValueLOONG64_OpLOONG64MOVBstore(v *Value) bool { @@ -3614,6 +3644,21 @@ func rewriteValueLOONG64_OpLOONG64MOVHUreg(v *Value) bool { v.AuxInt = int64ToAuxInt(int64(uint16(c))) return true } + // match: (MOVHUreg x:(ANDconst [c] y)) + // cond: c >= 0 && int64(uint16(c)) == c + // result: x + for { + x := v_0 + if x.Op != OpLOONG64ANDconst { + break + } + c := auxIntToInt64(x.AuxInt) + if !(c >= 0 && int64(uint16(c)) == c) { + break + } + v.copyOf(x) + return true + } return false } func rewriteValueLOONG64_OpLOONG64MOVHload(v *Value) bool { @@ -3806,6 +3851,21 @@ func rewriteValueLOONG64_OpLOONG64MOVHreg(v *Value) bool { v.AuxInt = int64ToAuxInt(int64(int16(c))) return true } + // match: (MOVHreg x:(ANDconst [c] y)) + // cond: c >= 0 && int64(int16(c)) == c + // result: x + for { + x := v_0 + if x.Op != OpLOONG64ANDconst { + break + } + c := auxIntToInt64(x.AuxInt) + if !(c >= 0 && int64(int16(c)) == c) { + break + } + v.copyOf(x) + return true + } return false } func rewriteValueLOONG64_OpLOONG64MOVHstore(v *Value) bool { @@ -4821,6 +4881,21 @@ func rewriteValueLOONG64_OpLOONG64MOVWUreg(v *Value) bool { v.AuxInt = int64ToAuxInt(int64(uint32(c))) return true } + // match: (MOVWUreg x:(ANDconst [c] y)) + // cond: c >= 0 && int64(uint32(c)) == c + // result: x + for { + x := v_0 + if x.Op != OpLOONG64ANDconst { + break + } + c := auxIntToInt64(x.AuxInt) + if !(c >= 0 && int64(uint32(c)) == c) { + break + } + v.copyOf(x) + return true + } return false } func rewriteValueLOONG64_OpLOONG64MOVWload(v *Value) bool { @@ -5046,6 +5121,21 @@ func rewriteValueLOONG64_OpLOONG64MOVWreg(v *Value) bool { v.AuxInt = int64ToAuxInt(int64(int32(c))) return true } + // match: (MOVWreg x:(ANDconst [c] y)) + // cond: c >= 0 && int64(int32(c)) == c + // result: x + for { + x := v_0 + if x.Op != OpLOONG64ANDconst { + break + } + c := auxIntToInt64(x.AuxInt) + if !(c >= 0 && int64(int32(c)) == c) { + break + } + v.copyOf(x) + return true + } return false } func rewriteValueLOONG64_OpLOONG64MOVWstore(v *Value) bool { -- 2.51.0