diff options
| author | Jake Bailey <jacob.b.bailey@gmail.com> | 2025-09-05 14:47:31 -0700 |
|---|---|---|
| committer | Gopher Robot <gobot@golang.org> | 2025-09-12 09:39:29 -0700 |
| commit | f1fd13016ab51b93f5d39b0c46aa8c2b42e8f761 (patch) | |
| tree | ee8bc50292fffedc66a894160fb23574fd3c304d /src/cmd | |
| parent | dc960d0bfeb6ce6abd0cfa2c096476d98e9ec7cd (diff) | |
| download | go-f1fd13016ab51b93f5d39b0c46aa8c2b42e8f761.tar.xz | |
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 <khr@golang.org>
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
Reviewed-by: Keith Randall <khr@google.com>
Reviewed-by: Mark Freeman <markfreeman@google.com>
Auto-Submit: Michael Pratt <mpratt@google.com>
Diffstat (limited to 'src/cmd')
| -rw-r--r-- | src/cmd/compile/internal/liveness/plive.go | 2 | ||||
| -rw-r--r-- | src/cmd/compile/internal/reflectdata/reflect.go | 4 | ||||
| -rw-r--r-- | 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) } |
