]> Cypherpunks repositories - gostls13.git/commitdiff
runtime: use memclrNoHeapPointers to clear inline mark bits
authorMichael Anthony Knyszek <mknyszek@google.com>
Mon, 14 Jul 2025 19:33:13 +0000 (19:33 +0000)
committerGopher Robot <gobot@golang.org>
Tue, 15 Jul 2025 19:24:37 +0000 (12:24 -0700)
Clearing the inline mark bits with memclrNoHeapPointers is slightly
better than having the compiler insert, e.g. duffzero, since it can take
advantage of wider SIMD instructions. duffzero is likely going away, but
we know things the compiler doesn't, such as the fact that this memory
is nicely aligned. In this particular case, memclrNoHeapPointers does a
better job.

For #73581.

Change-Id: I3918096929acfe6efe6f469fb089ebe04b4acff5
Reviewed-on: https://go-review.googlesource.com/c/go/+/687938
Reviewed-by: Michael Pratt <mpratt@google.com>
Reviewed-by: Cherry Mui <cherryyz@google.com>
LUCI-TryBot-Result: Go LUCI <golang-scoped@luci-project-accounts.iam.gserviceaccount.com>
Auto-Submit: Michael Knyszek <mknyszek@google.com>

src/runtime/mgcmark_greenteagc.go

index 6af711108fc1109c60ee11d80d3b8b1182e57dbd..a2f28e95d24eadd7dd58c07af5dac5e906b71e2f 100644 (file)
@@ -132,7 +132,11 @@ func (imb *spanInlineMarkBits) init(class spanClass, needzero bool) {
                throw("runtime: span inline mark bits nil?")
        }
        if needzero {
-               *imb = spanInlineMarkBits{}
+               // Use memclrNoHeapPointers to avoid having the compiler make a worse
+               // decision. We know that imb is both aligned and a nice power-of-two
+               // size that works well for wider SIMD instructions. The compiler likely
+               // has no idea that imb is aligned to 128 bytes.
+               memclrNoHeapPointers(unsafe.Pointer(imb), unsafe.Sizeof(spanInlineMarkBits{}))
        }
        imb.class = class
 }