| // 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") | |
| } | |
| } |