Source file
test/fixedbugs/spillreload_arm64_pair.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21 package main
22
23 import "fmt"
24
25
26 func sink(int) {}
27
28
29 func sink2(int, int) {}
30
31 func callTwoVars(p, q *int) (int, int) {
32 a := *p
33 b := *q
34 sink(0)
35 return a, b
36 }
37
38 func condCallTwoVars(c bool, p, q *int) (int, int) {
39 a := *p
40 b := *q
41 if c {
42 sink(0)
43 }
44 return a, b
45 }
46
47
48
49
50
51 func condCallThreeVars(c bool, p, q, r *int) (int, int, int) {
52 a := *p
53 b := *q
54 d := *r
55 if c {
56 sink2(a, b)
57 }
58 return a, b, d
59 }
60
61 func loopReload(p []int) int {
62 s := 0
63 for _, v := range p {
64 sink(v)
65 s += v
66 }
67 return s
68 }
69
70 func nestedConds(c1, c2 bool, p, q, r *int) (int, int, int) {
71 a := *p
72 b := *q
73 d := *r
74 if c1 {
75 sink(a)
76 if c2 {
77 sink(b)
78 }
79 }
80 return a, b, d
81 }
82
83 func main() {
84 x, y, z := 7, 11, 13
85 if a, b := callTwoVars(&x, &y); a != 7 || b != 11 {
86 panic(fmt.Sprintf("callTwoVars = %d, %d", a, b))
87 }
88 for _, c := range []bool{false, true} {
89 if a, b := condCallTwoVars(c, &x, &y); a != 7 || b != 11 {
90 panic(fmt.Sprintf("condCallTwoVars(%v) = %d, %d", c, a, b))
91 }
92 if a, b, d := condCallThreeVars(c, &x, &y, &z); a != 7 || b != 11 || d != 13 {
93 panic(fmt.Sprintf("condCallThreeVars(%v) = %d, %d, %d", c, a, b, d))
94 }
95 }
96 for _, c1 := range []bool{false, true} {
97 for _, c2 := range []bool{false, true} {
98 if a, b, d := nestedConds(c1, c2, &x, &y, &z); a != 7 || b != 11 || d != 13 {
99 panic(fmt.Sprintf("nestedConds(%v,%v) = %d, %d, %d", c1, c2, a, b, d))
100 }
101 }
102 }
103 if s := loopReload([]int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}); s != 55 {
104 panic(fmt.Sprintf("loopReload = %d", s))
105 }
106 }
107
View as plain text