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