]> Cypherpunks repositories - gostls13.git/commitdiff
[dev.simd] cmd/compile: mark SIMD types non-fat
authorJunyang Shao <shaojunyang@google.com>
Sat, 12 Jul 2025 08:13:04 +0000 (08:13 +0000)
committerJunyang Shao <shaojunyang@google.com>
Mon, 14 Jul 2025 16:35:17 +0000 (09:35 -0700)
This CL fixes the merge locals error.
The culprit is that liveness analysis wrongly mark SIMD structs fat,
hence making `StoreReg` of SIMD vectors not a varkill effect, making the
liveness range of SIMD vectors not closed correctly, further making
mergelocals merged 2 concurrently-live SIMD vectors.

Is looks like mergelocals will treat the live range as one instruction
if it's not closed: [st, st+1). Should we make it [st, +inf) instead? So
that we won't have similar errors in the future.

Also, I feel we really need to examine every "case types.TSTRUCT" or "if
t.Kind() == types.TSTRUCT" in the codebase correctly for SIMD types...

Change-Id: I2f4f4f36a890bd317d582cfa73a8f6a789382d91
Reviewed-on: https://go-review.googlesource.com/c/go/+/687775
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
Reviewed-by: David Chase <drchase@google.com>
src/cmd/compile/internal/liveness/plive.go
src/cmd/compile/internal/ssa/func.go

index 5a2a22ee8f5c82fe8a12d013ae5f0657a4bc83d7..b9d3030e96ab7753889e05111021929dc8f4c1db 100644 (file)
@@ -1534,6 +1534,9 @@ func isfat(t *types.Type) bool {
                        }
                        return true
                case types.TSTRUCT:
+                       if t.IsSIMD() {
+                               return false
+                       }
                        // Struct with 1 field, check if field is fat
                        if t.NumFields() == 1 {
                                return isfat(t.Field(0).Type)
index 01ce89cf47e3155892f81e3571451e3a12b76918..5736f0b8126484bdc0150cef7373b55ac081eb71 100644 (file)
@@ -850,13 +850,6 @@ func (f *Func) NewLocal(pos src.XPos, typ *types.Type) *ir.Name {
 // items larger than what CanSSA would allow (approximateky, we disallow things
 // marked as open defer slots so as to avoid complicating liveness
 // analysis.
-//
-// TODO: make SIMD variables mergible.
-//
-//             Right now this check excludes SIMD vars because sometimes two live SIMD
-//             vectors will be put into the same partition by mergelocals, we need to figure
-//             out why because these vectors are big and should be merged when possible.
-//      Details in CL 687375.
 func IsMergeCandidate(n *ir.Name) bool {
        if base.Debug.MergeLocals == 0 ||
                base.Flag.N != 0 ||
@@ -864,7 +857,6 @@ func IsMergeCandidate(n *ir.Name) bool {
                n.Type().Size() <= int64(3*types.PtrSize) ||
                n.Addrtaken() ||
                n.NonMergeable() ||
-               n.Type().IsSIMD() ||
                n.OpenDeferSlot() {
                return false
        }