aboutsummaryrefslogtreecommitdiff
path: root/src/cmd
diff options
context:
space:
mode:
authorKeith Randall <khr@golang.org>2026-02-10 17:44:08 -0800
committerKeith Randall <khr@golang.org>2026-02-21 10:38:20 -0800
commit6435bf46c17dccb2eb5f7bab7dd8aa4972252b21 (patch)
tree374595e0e716236dee08f4f34e0d23c71cb0d16f /src/cmd
parent439a82ad25e9549d0cc330075ae160f7a9ba69f8 (diff)
downloadgo-6435bf46c17dccb2eb5f7bab7dd8aa4972252b21.tar.xz
cmd/compile: pointer-shaped types are SSAable even if lots of 0-sized fields
Normally we don't SSA-ify variables with types that have more than 4 fields. But we really do want to SSA-ify them if they are pointer shaped. An odd case, but the compiler shouldn't barf on them. Failure probably started with CL 714421. Fixes #77534 Change-Id: I51ef87676cc31df1e51e164bbd58d58c0ab72436 Reviewed-on: https://go-review.googlesource.com/c/go/+/744280 Reviewed-by: Junyang Shao <shaojunyang@google.com> LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com> Reviewed-by: David Chase <drchase@google.com>
Diffstat (limited to 'src/cmd')
-rw-r--r--src/cmd/compile/internal/ssa/decompose.go8
-rw-r--r--src/cmd/compile/internal/ssa/expand_calls.go2
-rw-r--r--src/cmd/compile/internal/ssa/value.go4
3 files changed, 9 insertions, 5 deletions
diff --git a/src/cmd/compile/internal/ssa/decompose.go b/src/cmd/compile/internal/ssa/decompose.go
index d2f715a453..a3d0fbd406 100644
--- a/src/cmd/compile/internal/ssa/decompose.go
+++ b/src/cmd/compile/internal/ssa/decompose.go
@@ -363,9 +363,9 @@ func decomposeUserPhi(v *Value) {
func decomposeStructPhi(v *Value) {
t := v.Type
n := t.NumFields()
- var fields [MaxStruct]*Value
+ fields := make([]*Value, 0, MaxStruct)
for i := 0; i < n; i++ {
- fields[i] = v.Block.NewValue0(v.Pos, OpPhi, t.FieldType(i))
+ fields = append(fields, v.Block.NewValue0(v.Pos, OpPhi, t.FieldType(i)))
}
for _, a := range v.Args {
for i := 0; i < n; i++ {
@@ -373,10 +373,10 @@ func decomposeStructPhi(v *Value) {
}
}
v.reset(OpStructMake)
- v.AddArgs(fields[:n]...)
+ v.AddArgs(fields...)
// Recursively decompose phis for each field.
- for _, f := range fields[:n] {
+ for _, f := range fields {
decomposeUserPhi(f)
}
}
diff --git a/src/cmd/compile/internal/ssa/expand_calls.go b/src/cmd/compile/internal/ssa/expand_calls.go
index 1a2985d5af..ba2bedc65f 100644
--- a/src/cmd/compile/internal/ssa/expand_calls.go
+++ b/src/cmd/compile/internal/ssa/expand_calls.go
@@ -566,7 +566,7 @@ func (x *expandState) rewriteSelectOrArg(pos src.XPos, b *Block, container, a, m
addArg(e)
pos = pos.WithNotStmt()
}
- if at.NumFields() > 4 {
+ if at.NumFields() > MaxStruct && !types.IsDirectIface(at) {
panic(fmt.Errorf("Too many fields (%d, %d bytes), container=%s", at.NumFields(), at.Size(), container.LongString()))
}
a = makeOf(a, OpStructMake, args)
diff --git a/src/cmd/compile/internal/ssa/value.go b/src/cmd/compile/internal/ssa/value.go
index 5f60409901..dba73de771 100644
--- a/src/cmd/compile/internal/ssa/value.go
+++ b/src/cmd/compile/internal/ssa/value.go
@@ -635,6 +635,10 @@ func CanSSA(t *types.Type) bool {
}
return false
case types.TSTRUCT:
+ if types.IsDirectIface(t) {
+ // Note: even if t.NumFields()>MaxStruct! See issue 77534.
+ return true
+ }
if t.NumFields() > MaxStruct {
return false
}