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