diff options
| author | Keith Randall <khr@golang.org> | 2026-02-10 17:44:08 -0800 |
|---|---|---|
| committer | Keith Randall <khr@golang.org> | 2026-02-21 10:38:20 -0800 |
| commit | 6435bf46c17dccb2eb5f7bab7dd8aa4972252b21 (patch) | |
| tree | 374595e0e716236dee08f4f34e0d23c71cb0d16f /src | |
| parent | 439a82ad25e9549d0cc330075ae160f7a9ba69f8 (diff) | |
| download | go-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')
| -rw-r--r-- | src/cmd/compile/internal/ssa/decompose.go | 8 | ||||
| -rw-r--r-- | src/cmd/compile/internal/ssa/expand_calls.go | 2 | ||||
| -rw-r--r-- | src/cmd/compile/internal/ssa/value.go | 4 |
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 } |
