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