1// Copyright 2024 The Go Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style
3// license that can be found in the LICENSE file.
4
5package p
6
7// This type and the following one will share the same GC shape and size.
8type Pointery struct {
9	p *Pointery
10	x [1024]int
11}
12
13type Pointery2 struct {
14	p *Pointery2
15	x [1024]int
16}
17
18// This type and the following one will have the same size.
19type Vanilla struct {
20	np uintptr
21	x  [1024]int
22}
23
24type Vanilla2 struct {
25	np uintptr
26	x  [1023]int
27	y  int
28}
29
30type Single struct {
31	np uintptr
32	x  [1023]int
33}
34
35var G int
36
37//go:noinline
38func clobber() {
39	G++
40}
41
42func ABC(i, j int) int {
43	r := 0
44
45	// here v2 and v3 can be overlapped.
46	clobber()
47	if i < 101 {
48		var v2 Vanilla
49		v2.x[i] = j
50		r += v2.x[j]
51	}
52	if j != 303 {
53		var v3 Vanilla2
54		v3.x[i] = j
55		r += v3.x[j]
56	}
57	clobber()
58
59	// not an overlap candidate (only one var of this size).
60	var s Single
61	s.x[i] = j
62	r += s.x[j]
63
64	// Here p1 and p2 interfere, but p1 could be overlapped with xp3 + xp4.
65	var p1, p2 Pointery
66	p1.x[i] = j
67	r += p1.x[j]
68	p2.x[i] = j
69	r += p2.x[j]
70	if j != 505 {
71		var xp3 Pointery2
72		xp3.x[i] = j
73		r += xp3.x[j]
74	}
75
76	if i == j*2 {
77		// p2 live on this path
78		p2.x[i] += j
79		r += p2.x[j]
80	} else {
81		// p2 not live on this path
82		var xp4 Pointery2
83		xp4.x[i] = j
84		r += xp4.x[j]
85	}
86
87	return r + G
88}
89