From f1fd13016ab51b93f5d39b0c46aa8c2b42e8f761 Mon Sep 17 00:00:00 2001 From: Jake Bailey Date: Fri, 5 Sep 2025 14:47:31 -0700 Subject: [PATCH] cmd/compile: optimize abi.Type.GCData loads This fires in just one place; stkframe.go's stkobjinit. But, it does make the struct literal entirely constants. Change-Id: Ice76cb3cddd97adee011fdaab40597839da2e89f Reviewed-on: https://go-review.googlesource.com/c/go/+/701300 Reviewed-by: Keith Randall LUCI-TryBot-Result: Go LUCI Reviewed-by: Keith Randall Reviewed-by: Mark Freeman Auto-Submit: Michael Pratt --- src/cmd/compile/internal/liveness/plive.go | 2 +- src/cmd/compile/internal/reflectdata/reflect.go | 4 ++-- src/cmd/compile/internal/ssa/rewrite.go | 8 +++++++- 3 files changed, 10 insertions(+), 4 deletions(-) diff --git a/src/cmd/compile/internal/liveness/plive.go b/src/cmd/compile/internal/liveness/plive.go index 7e724397dc..9b8f15e9c2 100644 --- a/src/cmd/compile/internal/liveness/plive.go +++ b/src/cmd/compile/internal/liveness/plive.go @@ -1493,7 +1493,7 @@ func (lv *Liveness) emitStackObjects() *obj.LSym { if sz != int64(int32(sz)) { base.Fatalf("stack object too big: %v of type %v, size %d", v, t, sz) } - lsym, ptrBytes := reflectdata.GCSym(t) + lsym, ptrBytes := reflectdata.GCSym(t, false) off = objw.Uint32(x, off, uint32(sz)) off = objw.Uint32(x, off, uint32(ptrBytes)) off = objw.SymPtrOff(x, off, lsym) diff --git a/src/cmd/compile/internal/reflectdata/reflect.go b/src/cmd/compile/internal/reflectdata/reflect.go index 15173c54dc..38b9391c5f 100644 --- a/src/cmd/compile/internal/reflectdata/reflect.go +++ b/src/cmd/compile/internal/reflectdata/reflect.go @@ -1229,7 +1229,7 @@ func typesStrCmp(a, b typeAndStr) int { // GC information is always a bitmask, never a gc program. // GCSym may be called in concurrent backend, so it does not emit the symbol // content. -func GCSym(t *types.Type) (lsym *obj.LSym, ptrdata int64) { +func GCSym(t *types.Type, onDemandAllowed bool) (lsym *obj.LSym, ptrdata int64) { // Record that we need to emit the GC symbol. gcsymmu.Lock() if _, ok := gcsymset[t]; !ok { @@ -1237,7 +1237,7 @@ func GCSym(t *types.Type) (lsym *obj.LSym, ptrdata int64) { } gcsymmu.Unlock() - lsym, _, ptrdata = dgcsym(t, false, false) + lsym, _, ptrdata = dgcsym(t, false, onDemandAllowed) return } diff --git a/src/cmd/compile/internal/ssa/rewrite.go b/src/cmd/compile/internal/ssa/rewrite.go index 6fb2689d18..6d83ba5653 100644 --- a/src/cmd/compile/internal/ssa/rewrite.go +++ b/src/cmd/compile/internal/ssa/rewrite.go @@ -2067,7 +2067,7 @@ func isFixedLoad(v *Value, sym Sym, off int64) bool { for _, f := range rttype.Type.Fields() { if f.Offset == off && copyCompatibleType(v.Type, f.Type) { switch f.Sym.Name { - case "Size_", "PtrBytes", "Hash", "Kind_": + case "Size_", "PtrBytes", "Hash", "Kind_", "GCData": return true default: // fmt.Println("unknown field", f.Sym.Name) @@ -2147,6 +2147,12 @@ func rewriteFixedLoad(v *Value, sym Sym, sb *Value, off int64) *Value { v.reset(OpConst8) v.AuxInt = int64(reflectdata.ABIKindOfType(t)) return v + case "GCData": + gcdata, _ := reflectdata.GCSym(t, true) + v.reset(OpAddr) + v.Aux = symToAux(gcdata) + v.AddArg(sb) + return v default: base.Fatalf("unknown field %s for fixedLoad of %s at offset %d", f.Sym.Name, lsym.Name, off) } -- 2.52.0