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