Home | History | Annotate | Download | only in CodeGen
      1 // RUN: %clang_cc1 -Wno-gcc-compat -emit-llvm -o - %s | FileCheck %s
      2 
      3 void pr8880_cg_1(int *iptr) {
      4 // CHECK-LABEL: define void @pr8880_cg_1(
      5   int i, j;
      6 // CHECK: br label %[[OUTER_COND:[0-9A-Za-z$._]+]]
      7   for (i = 2; i != 10 ; i++ )
      8 // CHECK: [[OUTER_COND]]
      9 // CHECK: label %[[OUTER_BODY:[0-9A-Za-z$._]+]], label %[[OUTER_END:[0-9A-Za-z$._]+]]
     10 // CHECK: [[OUTER_BODY]]
     11 // CHECK: br label %[[INNER_COND:[0-9A-Za-z$._]+]]
     12     for (j = 3 ; j < 22; (void)({ ++j; break; j;})) {
     13 // CHECK: [[INNER_COND]]
     14 // CHECK: label %[[INNER_BODY:[0-9A-Za-z$._]+]], label %[[INNER_END:[0-9A-Za-z$._]+]]
     15 // CHECK: [[INNER_BODY]]
     16       *iptr = 7;
     17 // CHECK: store i32 7,
     18 // CHECK: br label %[[INNER_INC:[0-9A-Za-z$._]+]]
     19 // CHECK: [[INNER_INC]]
     20 
     21 // break in 3rd expression of inner loop causes branch to end of inner loop
     22 
     23 // CHECK: br label %[[INNER_END:[0-9A-Za-z$._]+]]
     24 // CHECK: [[INNER_END]]
     25     }
     26 // CHECK: br label %[[OUTER_INC:[0-9A-Za-z$._]+]]
     27 // CHECK: [[OUTER_INC]]
     28 // CHECK: br label %[[OUTER_COND]]
     29 // CHECK: [[OUTER_END]]
     30 // CHECK: ret
     31 }
     32 
     33 void pr8880_cg_2(int *iptr) {
     34 // CHECK-LABEL: define void @pr8880_cg_2(
     35   int i, j;
     36 // CHECK: br label %[[OUTER_COND:[0-9A-Za-z$._]+]]
     37   for (i = 2; i != 10 ; i++ )
     38 // CHECK: [[OUTER_COND]]
     39 // CHECK: label %[[OUTER_BODY:[0-9A-Za-z$._]+]], label %[[OUTER_END:[0-9A-Za-z$._]+]]
     40 // CHECK: [[OUTER_BODY]]
     41 // CHECK: br label %[[INNER_COND:[0-9A-Za-z$._]+]]
     42     for (j = 3 ; j < 22; (void)({ ++j; continue; j;})) {
     43 // CHECK: [[INNER_COND]]
     44 // CHECK: label %[[INNER_BODY:[0-9A-Za-z$._]+]], label %[[INNER_END:[0-9A-Za-z$._]+]]
     45 // CHECK: [[INNER_BODY]]
     46       *iptr = 7;
     47 // CHECK: store i32 7,
     48 // CHECK: br label %[[INNER_INC:[0-9A-Za-z$._]+]]
     49 // CHECK: [[INNER_INC]]
     50 
     51 // continue in 3rd expression of inner loop causes branch to inc of inner loop
     52 
     53 // CHECK: br label %[[INNER_INC]]
     54 // CHECK: [[INNER_END]]
     55     }
     56 // CHECK: br label %[[OUTER_INC:[0-9A-Za-z$._]+]]
     57 // CHECK: [[OUTER_INC]]
     58 // CHECK: br label %[[OUTER_COND]]
     59 // CHECK: [[OUTER_END]]
     60 // CHECK: ret
     61 }
     62 
     63 void pr8880_cg_3(int *iptr) {
     64 // CHECK-LABEL: define void @pr8880_cg_3(
     65   int i, j;
     66 // CHECK: br label %[[OUTER_COND:[0-9A-Za-z$._]+]]
     67   for (i = 2 ; i != 10 ; i++ )
     68 // CHECK: [[OUTER_COND]]
     69 // CHECK: label %[[OUTER_BODY:[0-9A-Za-z$._]+]], label %[[OUTER_END:[0-9A-Za-z$._]+]]
     70 // CHECK: [[OUTER_BODY]]
     71 // CHECK: br label %[[INNER_COND:[0-9A-Za-z$._]+]]
     72     for (j = 3 ; ({break; j;}); j++) {
     73 
     74 // break in 2nd expression of inner loop causes branch to end of inner loop
     75 
     76 // CHECK: [[INNER_COND]]
     77 // CHECK: br label %[[INNER_END:[0-9A-Za-z$._]+]]
     78 // CHECK: label %[[INNER_BODY:[0-9A-Za-z$._]+]], label %[[INNER_END:[0-9A-Za-z$._]+]]
     79 // CHECK: [[INNER_BODY]]
     80       *iptr = 7;
     81 // CHECK: store i32 7,
     82 // CHECK: br label %[[INNER_INC:[0-9A-Za-z$._]+]]
     83 // CHECK: [[INNER_INC]]
     84 // CHECK: br label %[[INNER_COND]]
     85     }
     86 // CHECK: [[INNER_END]]
     87 // CHECK: br label %[[OUTER_INC:[0-9A-Za-z$._]+]]
     88 // CHECK: [[OUTER_INC]]
     89 // CHECK: br label %[[OUTER_COND]]
     90 // CHECK: [[OUTER_END]]
     91 // CHECK: ret
     92 }
     93 
     94 void pr8880_cg_4(int *iptr) {
     95 // CHECK-LABEL: define void @pr8880_cg_4(
     96   int i, j;
     97 // CHECK: br label %[[OUTER_COND:[0-9A-Za-z$._]+]]
     98   for (i = 2 ; i != 10 ; i++ )
     99 // CHECK: [[OUTER_COND]]
    100 // CHECK: label %[[OUTER_BODY:[0-9A-Za-z$._]+]], label %[[OUTER_END:[0-9A-Za-z$._]+]]
    101 // CHECK: [[OUTER_BODY]]
    102 // CHECK: br label %[[INNER_COND:[0-9A-Za-z$._]+]]
    103     for (j = 3 ; ({continue; j;}); j++) {
    104 
    105 // continue in 2nd expression of inner loop causes branch to inc of inner loop
    106 
    107 // CHECK: [[INNER_COND]]
    108 // CHECK: br label %[[INNER_INC:[0-9A-Za-z$._]+]]
    109 // CHECK: label %[[INNER_BODY:[0-9A-Za-z$._]+]], label %[[INNER_END:[0-9A-Za-z$._]+]]
    110 // CHECK: [[INNER_BODY]]
    111       *iptr = 7;
    112 // CHECK: store i32 7,
    113 // CHECK: br label %[[INNER_INC]]
    114 // CHECK: [[INNER_INC]]
    115 // CHECK: br label %[[INNER_COND]]
    116     }
    117 // CHECK: [[INNER_END]]
    118 // CHECK: br label %[[OUTER_INC:[0-9A-Za-z$._]+]]
    119 // CHECK: [[OUTER_INC]]
    120 // CHECK: br label %[[OUTER_COND]]
    121 // CHECK: [[OUTER_END]]
    122 // CHECK: ret
    123 }
    124 
    125 void pr8880_cg_5(int x, int *iptr) {
    126 // CHECK-LABEL: define void @pr8880_cg_5(
    127   int y = 5;
    128 // CHECK: br label %[[OUTER_COND:[0-9A-Za-z$._]+]]
    129 // CHECK: [[OUTER_COND]]
    130   while(--x) {
    131 // CHECK: label %[[OUTER_BODY:[0-9A-Za-z$._]+]], label %[[OUTER_END:[0-9A-Za-z$._]+]]
    132 // CHECK: [[OUTER_BODY]]
    133 // CHECK: br label %[[INNER_COND:[0-9A-Za-z$._]+]]
    134     while(({ break; --y; })) {
    135 // CHECK: [[INNER_COND]]
    136 // CHECK: br label %[[INNER_END:[0-9A-Za-z$._]+]]
    137 // CHECK: label %[[INNER_BODY:[0-9A-Za-z$._]+]], label %[[INNER_END:[0-9A-Za-z$._]+]]
    138 // CHECK: [[INNER_BODY]]
    139       *iptr = 7;
    140 // CHECK: store i32 7,
    141     }
    142 // CHECK: br label %[[INNER_COND]]
    143   }
    144 // CHECK: [[INNER_END]]
    145 // CHECK: br label %[[OUTER_COND]]
    146 // CHECK: [[OUTER_END]]
    147 // CHECK: ret void
    148 }
    149 
    150 void pr8880_cg_6(int x, int *iptr) {
    151 // CHECK-LABEL: define void @pr8880_cg_6(
    152   int y = 5;
    153 // CHECK: br label %[[OUTER_COND:[0-9A-Za-z$._]+]]
    154 // CHECK: [[OUTER_COND]]
    155   while(--x) {
    156 // CHECK: label %[[OUTER_BODY:[0-9A-Za-z$._]+]], label %[[OUTER_END:[0-9A-Za-z$._]+]]
    157 // CHECK: [[OUTER_BODY]]
    158 // CHECK: br label %[[INNER_BODY:[0-9A-Za-z$._]+]]
    159 // CHECK: [[INNER_BODY]]
    160     do {
    161 // CHECK: store i32 7,
    162       *iptr = 7;
    163 // CHECK: br label %[[INNER_COND:[0-9A-Za-z$._]+]]
    164     } while(({ break; --y; }));
    165 // CHECK: [[INNER_COND]]
    166 // CHECK: br label %[[INNER_END:[0-9A-Za-z$._]+]]
    167 // CHECK: label %[[INNER_BODY:[0-9A-Za-z$._]+]], label %[[INNER_END]]
    168   }
    169 // CHECK: [[INNER_END]]
    170 // CHECK: br label %[[OUTER_COND]]
    171 // CHECK: [[OUTER_END]]
    172 // CHECK: ret void
    173 }
    174