| // run |
| |
| // Copyright 2026 The Go Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style |
| // license that can be found in the LICENSE file. |
| |
| // splitload rewrites must preserve pointer-typed loads so |
| // spilled values remain visible to stack maps across stack growth. |
| |
| package main |
| |
| type splitLoadObj struct{ x int } |
| |
| var sink byte |
| |
| //go:noinline |
| func splitLoadGrow(n int) { |
| var buf [2048]byte |
| buf[n&2047] = byte(n) |
| if n > 0 { |
| splitLoadGrow(n - 1) |
| } |
| sink = buf[n&2047] |
| } |
| |
| //go:noinline |
| func splitLoadPointerCompare(pp **splitLoadObj, q *splitLoadObj, a, b, m int) int { |
| cond := q == *pp |
| x := a |
| if cond { |
| x = b |
| } |
| z := x & m |
| splitLoadGrow(1000) |
| if cond { |
| return z |
| } |
| return x |
| } |
| |
| func main() { |
| var obj splitLoadObj |
| slot := &obj |
| if got := splitLoadPointerCompare(&slot, &obj, 10, 6, 1); got != 0 { |
| println("splitLoadPointerCompare(...) =", got, "want 0") |
| panic("FAIL") |
| } |
| } |