1 /* { dg-do run } */
2 /* { dg-options "-O2 -fno-reorder-blocks" } */
3 /* { dg-skip-if "limited code space" { pdp11-*-* } } */
4
5 void abort ();
6
7 __attribute__((noinline, noclone)) int
restore(int a,int b)8 restore (int a, int b)
9 {
10 return a * b;
11 }
12
13 __attribute__((noinline, noclone)) void
do_nothing(int * input)14 do_nothing (int *input)
15 {
16 *input = restore (*input, 1);
17 return;
18 }
19
20 #define CASE_ENTRY(n) \
21 case n: \
22 sum = sum / (n + 1); \
23 sum = restore (sum, n + 1); \
24 if (sum == (n + addend)) \
25 break;\
26 sum = sum / (n + 2); \
27 sum = restore (sum, n + 2); \
28 sum = sum / (n + 3); \
29 sum = restore (sum, n + 3); \
30 sum = sum / (n + 4); \
31 sum = restore (sum, n + 4); \
32 sum = sum / (n + 5); \
33 sum = restore (sum, n + 5); \
34 sum = sum / (n + 6); \
35 sum = restore (sum, n + 6); \
36 sum = sum / (n + 7); \
37 sum = restore (sum, n + 7); \
38 sum = sum / (n + 8); \
39 sum = restore (sum, n + 8); \
40 sum = sum / (n + 9); \
41 sum = restore (sum, n + 9); \
42 sum = sum / (n + 10); \
43 sum = restore (sum, n + 10); \
44 sum = sum / (n + 11); \
45 sum = restore (sum, n + 11); \
46 sum = sum / (n + 12); \
47 sum = restore (sum, n + 12); \
48 sum = sum / (n + 13); \
49 sum = restore (sum, n + 13); \
50 sum = sum / (n + 14); \
51 sum = restore (sum, n + 14); \
52 sum = sum / (n + 15); \
53 sum = restore (sum, n + 15); \
54 sum = sum / (n + 16); \
55 sum = restore (sum, n + 16); \
56 sum = sum / (n + 17); \
57 sum = restore (sum, n + 17); \
58 sum = sum / (n + 18); \
59 sum = restore (sum, n + 18); \
60 sum = sum / (n + 19); \
61 sum = restore (sum, n + 19); \
62 sum = sum / (n + 20); \
63 sum = restore (sum, n + 20); \
64 sum = sum / (n + 21); \
65 sum = restore (sum, n + 21); \
66 sum = sum / (n + 22); \
67 sum = restore (sum, n + 22); \
68 sum = sum / (n + 23); \
69 sum = restore (sum, n + 23); \
70 sum = sum / (n + 24); \
71 sum = restore (sum, n + 24); \
72 sum = sum / (n + 25); \
73 sum = restore (sum, n + 25); \
74 sum = sum / (n + 26); \
75 sum = restore (sum, n + 26); \
76 sum = sum / (n + 27); \
77 sum = restore (sum, n + 27); \
78 sum = sum / (n + 28); \
79 sum = restore (sum, n + 28); \
80 sum = sum / (n + 29); \
81 sum = restore (sum, n + 29); \
82 sum = sum / (n + 30); \
83 sum = restore (sum, n + 30); \
84 sum = sum / (n + 31); \
85 sum = restore (sum, n + 31); \
86 sum = sum / (n + 32); \
87 sum = restore (sum, n + 32); \
88 sum = sum / (n + 33); \
89 sum = restore (sum, n + 33); \
90 sum = sum / (n + 34); \
91 sum = restore (sum, n + 34); \
92 sum = sum / (n + 35); \
93 sum = restore (sum, n + 35); \
94 sum = sum / (n + 36); \
95 sum = restore (sum, n + 36); \
96 break;
97
98 __attribute__((noinline, noclone)) long long
test_and_branch(int selector,int addend)99 test_and_branch (int selector, int addend)
100 {
101 long long sum = selector + 1;
102
103 if (selector > 64)
104 {
105 start:
106 return sum - 1;
107 }
108 else
109 {
110 switch (selector)
111 {
112 CASE_ENTRY (1)
113 CASE_ENTRY (2)
114 CASE_ENTRY (3)
115 CASE_ENTRY (4)
116 CASE_ENTRY (5)
117 CASE_ENTRY (6)
118 CASE_ENTRY (7)
119 CASE_ENTRY (8)
120 CASE_ENTRY (9)
121 CASE_ENTRY (10)
122 CASE_ENTRY (11)
123 CASE_ENTRY (12)
124 CASE_ENTRY (13)
125 CASE_ENTRY (14)
126 CASE_ENTRY (15)
127 CASE_ENTRY (16)
128 CASE_ENTRY (17)
129 CASE_ENTRY (18)
130 CASE_ENTRY (19)
131 CASE_ENTRY (20)
132 CASE_ENTRY (21)
133 CASE_ENTRY (22)
134 CASE_ENTRY (23)
135 CASE_ENTRY (24)
136 CASE_ENTRY (25)
137 CASE_ENTRY (26)
138 CASE_ENTRY (27)
139 CASE_ENTRY (28)
140 CASE_ENTRY (29)
141 CASE_ENTRY (30)
142 CASE_ENTRY (31)
143 CASE_ENTRY (32)
144 CASE_ENTRY (33)
145 CASE_ENTRY (34)
146 CASE_ENTRY (35)
147 CASE_ENTRY (36)
148 CASE_ENTRY (37)
149 CASE_ENTRY (38)
150 CASE_ENTRY (39)
151 CASE_ENTRY (40)
152 CASE_ENTRY (41)
153 CASE_ENTRY (42)
154 CASE_ENTRY (43)
155 CASE_ENTRY (44)
156 CASE_ENTRY (45)
157 CASE_ENTRY (46)
158 CASE_ENTRY (47)
159 CASE_ENTRY (48)
160 CASE_ENTRY (49)
161 CASE_ENTRY (50)
162 CASE_ENTRY (51)
163 CASE_ENTRY (52)
164 CASE_ENTRY (53)
165 CASE_ENTRY (54)
166 CASE_ENTRY (55)
167 CASE_ENTRY (56)
168 CASE_ENTRY (57)
169 CASE_ENTRY (58)
170 CASE_ENTRY (59)
171 CASE_ENTRY (60)
172 CASE_ENTRY (61)
173 CASE_ENTRY (62)
174 CASE_ENTRY (63)
175 CASE_ENTRY (64)
176 }
177
178 do_nothing ((int *)&sum);
179
180 if (sum & 0x40)
181 goto start;
182 }
183
184 return -1;
185 }
186
187 int
main(int argc,char ** argv)188 main (int argc, char **argv)
189 {
190 long long ret = test_and_branch (64, 1);
191 if (ret != 64)
192 abort ();
193
194 ret = test_and_branch (7, 1);
195 if (ret != -1)
196 abort ();
197
198 return 0;
199 }
200