1 | //===----------------------------------------------------------------------===// |
---|---|
2 | // |
3 | // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
4 | // See https://llvm.org/LICENSE.txt for license information. |
5 | // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
6 | // |
7 | //===----------------------------------------------------------------------===// |
8 | |
9 | // UNSUPPORTED: no-exceptions |
10 | |
11 | #include <exception> |
12 | #include <stdlib.h> |
13 | #include <assert.h> |
14 | #include <stdio.h> |
15 | |
16 | // Suppress diagnostics about deprecated volatile operations |
17 | #if defined(__GNUC__) && !defined(__clang__) |
18 | # pragma GCC diagnostic ignored "-Wvolatile" |
19 | #endif |
20 | |
21 | // Compile with -Os to get compiler uses float registers to hold float variables |
22 | |
23 | double get_(int x) { return (double)x; } |
24 | |
25 | double (* volatile get)(int) = get_; |
26 | |
27 | volatile int counter; |
28 | |
29 | double try1(bool v) { |
30 | double a = get(0); |
31 | double b = get(1); |
32 | for (counter = 100; counter; counter = counter - 1) |
33 | a += get(1) + b; |
34 | if (v) throw 10; |
35 | return get(0)+a+b; |
36 | } |
37 | |
38 | double try2(bool v) { |
39 | double a = get(0); |
40 | double b = get(1); |
41 | double c = get(2); |
42 | for (counter = 100; counter; counter = counter - 1) |
43 | a += get(1) + b + c; |
44 | if (v) throw 10; |
45 | return get(0)+a+b+c; |
46 | } |
47 | |
48 | double try3(bool v) { |
49 | double a = get(0); |
50 | double b = get(1); |
51 | double c = get(2); |
52 | double d = get(3); |
53 | for (counter = 100; counter; counter = counter - 1) |
54 | a += get(1) + b + c + d; |
55 | if (v) throw 10; |
56 | return get(0)+a+b+c+d; |
57 | } |
58 | |
59 | double try4(bool v) { |
60 | double a = get(0); |
61 | double b = get(0); |
62 | double c = get(0); |
63 | double d = get(0); |
64 | double e = get(0); |
65 | for (counter = 100; counter; counter = counter - 1) |
66 | a += get(1) + b+c+d+e; |
67 | if (v) throw 10; |
68 | return get(0)+a+b+c+d+e; |
69 | } |
70 | |
71 | double try5(bool v) { |
72 | double a = get(0); |
73 | double b = get(0); |
74 | double c = get(0); |
75 | double d = get(0); |
76 | double e = get(0); |
77 | double f = get(0); |
78 | for (counter = 100; counter; counter = counter - 1) |
79 | a += get(1) + b+c+d+e+f; |
80 | if (v) throw 10; |
81 | return get(0)+a+b+c+d+e+f; |
82 | } |
83 | |
84 | double try6(bool v) { |
85 | double a = get(0); |
86 | double b = get(0); |
87 | double c = get(0); |
88 | double d = get(0); |
89 | double e = get(0); |
90 | double f = get(0); |
91 | double g = get(0); |
92 | for (counter = 100; counter; counter = counter - 1) |
93 | a += get(1) + b+c+d+e+f+g; |
94 | if (v) throw 10; |
95 | return get(0)+a+b+c+d+e+f+g; |
96 | } |
97 | |
98 | double try7(bool v) { |
99 | double a = get(0); |
100 | double b = get(0); |
101 | double c = get(0); |
102 | double d = get(0); |
103 | double e = get(0); |
104 | double f = get(0); |
105 | double g = get(0); |
106 | double h = get(0); |
107 | for (counter = 100; counter; counter = counter - 1) |
108 | a += get(1) + b+c+d+e+f+g+h; |
109 | if (v) throw 10; |
110 | return get(0)+a+b+c+d+e+f+g+h; |
111 | } |
112 | |
113 | double try8(bool v) { |
114 | double a = get(0); |
115 | double b = get(0); |
116 | double c = get(0); |
117 | double d = get(0); |
118 | double e = get(0); |
119 | double f = get(0); |
120 | double g = get(0); |
121 | double h = get(0); |
122 | double i = get(0); |
123 | for (counter = 100; counter; counter = counter - 1) |
124 | a += get(1) + b+c+d+e+f+g+h+i; |
125 | if (v) throw 10; |
126 | return get(0)+a+b+c+d+e+f+g+h+i; |
127 | } |
128 | |
129 | |
130 | |
131 | |
132 | |
133 | double foo() |
134 | { |
135 | double a = get(1); |
136 | double b = get(2); |
137 | double c = get(3); |
138 | double d = get(4); |
139 | double e = get(5); |
140 | double f = get(6); |
141 | double g = get(7); |
142 | double h = get(8); |
143 | try { |
144 | try1(v: true); |
145 | } |
146 | catch (int) { |
147 | } |
148 | assert(a == get(1)); |
149 | assert(b == get(2)); |
150 | assert(c == get(3)); |
151 | assert(d == get(4)); |
152 | assert(e == get(5)); |
153 | assert(f == get(6)); |
154 | assert(g == get(7)); |
155 | assert(h == get(8)); |
156 | |
157 | try { |
158 | try2(v: true); |
159 | } |
160 | catch (int) { |
161 | } |
162 | assert(a == get(1)); |
163 | assert(b == get(2)); |
164 | assert(c == get(3)); |
165 | assert(d == get(4)); |
166 | assert(e == get(5)); |
167 | assert(f == get(6)); |
168 | assert(g == get(7)); |
169 | assert(h == get(8)); |
170 | |
171 | try { |
172 | try3(v: true); |
173 | } |
174 | catch (int) { |
175 | } |
176 | assert(a == get(1)); |
177 | assert(b == get(2)); |
178 | assert(c == get(3)); |
179 | assert(d == get(4)); |
180 | assert(e == get(5)); |
181 | assert(f == get(6)); |
182 | assert(g == get(7)); |
183 | assert(h == get(8)); |
184 | |
185 | try { |
186 | try4(v: true); |
187 | } |
188 | catch (int) { |
189 | } |
190 | assert(a == get(1)); |
191 | assert(b == get(2)); |
192 | assert(c == get(3)); |
193 | assert(d == get(4)); |
194 | assert(e == get(5)); |
195 | assert(f == get(6)); |
196 | assert(g == get(7)); |
197 | assert(h == get(8)); |
198 | |
199 | try { |
200 | try5(v: true); |
201 | } |
202 | catch (int) { |
203 | } |
204 | assert(a == get(1)); |
205 | assert(b == get(2)); |
206 | assert(c == get(3)); |
207 | assert(d == get(4)); |
208 | assert(e == get(5)); |
209 | assert(f == get(6)); |
210 | assert(g == get(7)); |
211 | assert(h == get(8)); |
212 | |
213 | try { |
214 | try6(v: true); |
215 | } |
216 | catch (int) { |
217 | } |
218 | assert(a == get(1)); |
219 | assert(b == get(2)); |
220 | assert(c == get(3)); |
221 | assert(d == get(4)); |
222 | assert(e == get(5)); |
223 | assert(f == get(6)); |
224 | assert(g == get(7)); |
225 | assert(h == get(8)); |
226 | |
227 | try { |
228 | try7(v: true); |
229 | } |
230 | catch (int) { |
231 | } |
232 | assert(a == get(1)); |
233 | assert(b == get(2)); |
234 | assert(c == get(3)); |
235 | assert(d == get(4)); |
236 | assert(e == get(5)); |
237 | assert(f == get(6)); |
238 | assert(g == get(7)); |
239 | assert(h == get(8)); |
240 | |
241 | try { |
242 | try8(v: true); |
243 | } |
244 | catch (int) { |
245 | } |
246 | assert(a == get(1)); |
247 | assert(b == get(2)); |
248 | assert(c == get(3)); |
249 | assert(d == get(4)); |
250 | assert(e == get(5)); |
251 | assert(f == get(6)); |
252 | assert(g == get(7)); |
253 | assert(h == get(8)); |
254 | |
255 | return a+b+c+d+e+f+g+h; |
256 | } |
257 | |
258 | |
259 | |
260 | int main(int, char**) { |
261 | foo(); |
262 | return 0; |
263 | } |
264 |