aboutsummaryrefslogtreecommitdiff
path: root/src/cmd
diff options
context:
space:
mode:
authorJake Bailey <jacob.b.bailey@gmail.com>2025-09-05 14:47:31 -0700
committerGopher Robot <gobot@golang.org>2025-09-12 09:39:29 -0700
commitf1fd13016ab51b93f5d39b0c46aa8c2b42e8f761 (patch)
treeee8bc50292fffedc66a894160fb23574fd3c304d /src/cmd
parentdc960d0bfeb6ce6abd0cfa2c096476d98e9ec7cd (diff)
downloadgo-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.go2
-rw-r--r--src/cmd/compile/internal/reflectdata/reflect.go4
-rw-r--r--src/cmd/compile/internal/ssa/rewrite.go8
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)
}