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