264 lines · cpp
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-exception6//7//===----------------------------------------------------------------------===//8 9// UNSUPPORTED: no-exceptions10 11#include <exception>12#include <stdlib.h>13#include <assert.h>14#include <stdio.h>15 16// Suppress diagnostics about deprecated volatile operations17#if defined(__GNUC__) && !defined(__clang__)18# pragma GCC diagnostic ignored "-Wvolatile"19#endif20 21// Compile with -Os to get compiler uses float registers to hold float variables22 23double get_(int x) { return (double)x; }24 25double (* volatile get)(int) = get_;26 27volatile int counter;28 29double 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 38double 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 48double 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 59double 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 71double 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 84double 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 98double 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 113double 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 133double 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(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(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(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(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(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(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(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(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 260int main(int, char**) {261 foo();262 return 0;263}264