cmd/compile: cleanup SelectN rules by indexing into args

Change-Id: I7b8e8cd88c4d6d562aa25df91593d35d331ef63c
Reviewed-on: https://go-review.googlesource.com/c/go/+/690595
Reviewed-by: Mark Freeman <mark@golang.org>
Reviewed-by: Keith Randall <khr@google.com>
Auto-Submit: Keith Randall <khr@golang.org>
Reviewed-by: Keith Randall <khr@golang.org>
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
This commit is contained in:
Jorropo 2025-07-26 04:04:05 +02:00 committed by Gopher Robot
parent 94645d2413
commit 4569255f8c
2 changed files with 7 additions and 28 deletions

View file

@ -2057,9 +2057,7 @@
(Select1 (MakeTuple x y)) => y (Select1 (MakeTuple x y)) => y
// for rewriting results of some late-expanded rewrites (below) // for rewriting results of some late-expanded rewrites (below)
(SelectN [0] (MakeResult x ___)) => x (SelectN [n] m:(MakeResult ___)) => m.Args[n]
(SelectN [1] (MakeResult x y ___)) => y
(SelectN [2] (MakeResult x y z ___)) => z
// for late-expanded calls, recognize newobject and remove zeroing and nilchecks // for late-expanded calls, recognize newobject and remove zeroing and nilchecks
(Zero (SelectN [0] call:(StaticLECall _ _)) mem:(SelectN [1] call)) (Zero (SelectN [0] call:(StaticLECall _ _)) mem:(SelectN [1] call))

View file

@ -29886,34 +29886,15 @@ func rewriteValuegeneric_OpSelectN(v *Value) bool {
b := v.Block b := v.Block
config := b.Func.Config config := b.Func.Config
typ := &b.Func.Config.Types typ := &b.Func.Config.Types
// match: (SelectN [0] (MakeResult x ___)) // match: (SelectN [n] m:(MakeResult ___))
// result: x // result: m.Args[n]
for { for {
if auxIntToInt64(v.AuxInt) != 0 || v_0.Op != OpMakeResult || len(v_0.Args) < 1 { n := auxIntToInt64(v.AuxInt)
m := v_0
if m.Op != OpMakeResult {
break break
} }
x := v_0.Args[0] v.copyOf(m.Args[n])
v.copyOf(x)
return true
}
// match: (SelectN [1] (MakeResult x y ___))
// result: y
for {
if auxIntToInt64(v.AuxInt) != 1 || v_0.Op != OpMakeResult || len(v_0.Args) < 2 {
break
}
y := v_0.Args[1]
v.copyOf(y)
return true
}
// match: (SelectN [2] (MakeResult x y z ___))
// result: z
for {
if auxIntToInt64(v.AuxInt) != 2 || v_0.Op != OpMakeResult || len(v_0.Args) < 3 {
break
}
z := v_0.Args[2]
v.copyOf(z)
return true return true
} }
// match: (SelectN [0] call:(StaticCall {sym} sptr (Const64 [c]) mem)) // match: (SelectN [0] call:(StaticCall {sym} sptr (Const64 [c]) mem))