mirror of
https://github.com/golang/go.git
synced 2026-06-28 11:50:35 +00:00
49 lines
923 B
Go
49 lines
923 B
Go
|
|
// 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")
|
||
|
|
}
|
||
|
|
}
|