1// RUN: %clang_cc1 -Wno-gcc-compat -emit-llvm -o - %s | FileCheck %s 2 3void 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 33void 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 63void 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 94void 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 125void 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 150void 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