| // RUN: %clang_cc1 -Wno-gcc-compat -emit-llvm -o - %s | FileCheck %s |
| |
| void pr8880_cg_1(int *iptr) { |
| // CHECK-LABEL: define {{.*}}void @pr8880_cg_1( |
| int i, j; |
| // CHECK: br label %[[OUTER_COND:[0-9A-Za-z$._]+]] |
| for (i = 2; i != 10 ; i++ ) |
| // CHECK: [[OUTER_COND]] |
| // CHECK: label %[[OUTER_BODY:[0-9A-Za-z$._]+]], label %[[OUTER_END:[0-9A-Za-z$._]+]] |
| // CHECK: [[OUTER_BODY]] |
| // CHECK: br label %[[INNER_COND:[0-9A-Za-z$._]+]] |
| for (j = 3 ; j < 22; (void)({ ++j; break; j;})) { |
| // CHECK: [[INNER_COND]] |
| // CHECK: label %[[INNER_BODY:[0-9A-Za-z$._]+]], label %[[INNER_END:[0-9A-Za-z$._]+]] |
| // CHECK: [[INNER_BODY]] |
| *iptr = 7; |
| // CHECK: store i32 7, |
| // CHECK: br label %[[INNER_INC:[0-9A-Za-z$._]+]] |
| // CHECK: [[INNER_INC]] |
| |
| // break in 3rd expression of inner loop causes branch to end of inner loop |
| |
| // CHECK: br label %[[INNER_END:[0-9A-Za-z$._]+]] |
| // CHECK: [[INNER_END]] |
| } |
| // CHECK: br label %[[OUTER_INC:[0-9A-Za-z$._]+]] |
| // CHECK: [[OUTER_INC]] |
| // CHECK: br label %[[OUTER_COND]] |
| // CHECK: [[OUTER_END]] |
| // CHECK: ret |
| } |
| |
| void pr8880_cg_2(int *iptr) { |
| // CHECK-LABEL: define {{.*}}void @pr8880_cg_2( |
| int i, j; |
| // CHECK: br label %[[OUTER_COND:[0-9A-Za-z$._]+]] |
| for (i = 2; i != 10 ; i++ ) |
| // CHECK: [[OUTER_COND]] |
| // CHECK: label %[[OUTER_BODY:[0-9A-Za-z$._]+]], label %[[OUTER_END:[0-9A-Za-z$._]+]] |
| // CHECK: [[OUTER_BODY]] |
| // CHECK: br label %[[INNER_COND:[0-9A-Za-z$._]+]] |
| for (j = 3 ; j < 22; (void)({ ++j; continue; j;})) { |
| // CHECK: [[INNER_COND]] |
| // CHECK: label %[[INNER_BODY:[0-9A-Za-z$._]+]], label %[[INNER_END:[0-9A-Za-z$._]+]] |
| // CHECK: [[INNER_BODY]] |
| *iptr = 7; |
| // CHECK: store i32 7, |
| // CHECK: br label %[[INNER_INC:[0-9A-Za-z$._]+]] |
| // CHECK: [[INNER_INC]] |
| |
| // continue in 3rd expression of inner loop causes branch to inc of inner loop |
| |
| // CHECK: br label %[[INNER_INC]] |
| // CHECK: [[INNER_END]] |
| } |
| // CHECK: br label %[[OUTER_INC:[0-9A-Za-z$._]+]] |
| // CHECK: [[OUTER_INC]] |
| // CHECK: br label %[[OUTER_COND]] |
| // CHECK: [[OUTER_END]] |
| // CHECK: ret |
| } |
| |
| void pr8880_cg_3(int *iptr) { |
| // CHECK-LABEL: define {{.*}}void @pr8880_cg_3( |
| int i, j; |
| // CHECK: br label %[[OUTER_COND:[0-9A-Za-z$._]+]] |
| for (i = 2 ; i != 10 ; i++ ) |
| // CHECK: [[OUTER_COND]] |
| // CHECK: label %[[OUTER_BODY:[0-9A-Za-z$._]+]], label %[[OUTER_END:[0-9A-Za-z$._]+]] |
| // CHECK: [[OUTER_BODY]] |
| // CHECK: br label %[[INNER_COND:[0-9A-Za-z$._]+]] |
| for (j = 3 ; ({break; j;}); j++) { |
| |
| // break in 2nd expression of inner loop causes branch to end of inner loop |
| |
| // CHECK: [[INNER_COND]] |
| // CHECK: br label %[[INNER_END:[0-9A-Za-z$._]+]] |
| // CHECK: label %[[INNER_BODY:[0-9A-Za-z$._]+]], label %[[INNER_END:[0-9A-Za-z$._]+]] |
| // CHECK: [[INNER_BODY]] |
| *iptr = 7; |
| // CHECK: store i32 7, |
| // CHECK: br label %[[INNER_INC:[0-9A-Za-z$._]+]] |
| // CHECK: [[INNER_INC]] |
| // CHECK: br label %[[INNER_COND]] |
| } |
| // CHECK: [[INNER_END]] |
| // CHECK: br label %[[OUTER_INC:[0-9A-Za-z$._]+]] |
| // CHECK: [[OUTER_INC]] |
| // CHECK: br label %[[OUTER_COND]] |
| // CHECK: [[OUTER_END]] |
| // CHECK: ret |
| } |
| |
| void pr8880_cg_4(int *iptr) { |
| // CHECK-LABEL: define {{.*}}void @pr8880_cg_4( |
| int i, j; |
| // CHECK: br label %[[OUTER_COND:[0-9A-Za-z$._]+]] |
| for (i = 2 ; i != 10 ; i++ ) |
| // CHECK: [[OUTER_COND]] |
| // CHECK: label %[[OUTER_BODY:[0-9A-Za-z$._]+]], label %[[OUTER_END:[0-9A-Za-z$._]+]] |
| // CHECK: [[OUTER_BODY]] |
| // CHECK: br label %[[INNER_COND:[0-9A-Za-z$._]+]] |
| for (j = 3 ; ({continue; j;}); j++) { |
| |
| // continue in 2nd expression of inner loop causes branch to inc of inner loop |
| |
| // CHECK: [[INNER_COND]] |
| // CHECK: br label %[[INNER_INC:[0-9A-Za-z$._]+]] |
| // CHECK: label %[[INNER_BODY:[0-9A-Za-z$._]+]], label %[[INNER_END:[0-9A-Za-z$._]+]] |
| // CHECK: [[INNER_BODY]] |
| *iptr = 7; |
| // CHECK: store i32 7, |
| // CHECK: br label %[[INNER_INC]] |
| // CHECK: [[INNER_INC]] |
| // CHECK: br label %[[INNER_COND]] |
| } |
| // CHECK: [[INNER_END]] |
| // CHECK: br label %[[OUTER_INC:[0-9A-Za-z$._]+]] |
| // CHECK: [[OUTER_INC]] |
| // CHECK: br label %[[OUTER_COND]] |
| // CHECK: [[OUTER_END]] |
| // CHECK: ret |
| } |
| |
| void pr8880_cg_5(int x, int *iptr) { |
| // CHECK-LABEL: define {{.*}}void @pr8880_cg_5( |
| int y = 5; |
| // CHECK: br label %[[OUTER_COND:[0-9A-Za-z$._]+]] |
| // CHECK: [[OUTER_COND]] |
| while(--x) { |
| // CHECK: label %[[OUTER_BODY:[0-9A-Za-z$._]+]], label %[[OUTER_END:[0-9A-Za-z$._]+]] |
| // CHECK: [[OUTER_BODY]] |
| // CHECK: br label %[[INNER_COND:[0-9A-Za-z$._]+]] |
| while(({ break; --y; })) { |
| // CHECK: [[INNER_COND]] |
| // CHECK: br label %[[INNER_END:[0-9A-Za-z$._]+]] |
| // CHECK: label %[[INNER_BODY:[0-9A-Za-z$._]+]], label %[[INNER_END:[0-9A-Za-z$._]+]] |
| // CHECK: [[INNER_BODY]] |
| *iptr = 7; |
| // CHECK: store i32 7, |
| } |
| // CHECK: br label %[[INNER_COND]] |
| } |
| // CHECK: [[INNER_END]] |
| // CHECK: br label %[[OUTER_COND]] |
| // CHECK: [[OUTER_END]] |
| // CHECK: ret void |
| } |
| |
| void pr8880_cg_6(int x, int *iptr) { |
| // CHECK-LABEL: define {{.*}}void @pr8880_cg_6( |
| int y = 5; |
| // CHECK: br label %[[OUTER_COND:[0-9A-Za-z$._]+]] |
| // CHECK: [[OUTER_COND]] |
| while(--x) { |
| // CHECK: label %[[OUTER_BODY:[0-9A-Za-z$._]+]], label %[[OUTER_END:[0-9A-Za-z$._]+]] |
| // CHECK: [[OUTER_BODY]] |
| // CHECK: br label %[[INNER_BODY:[0-9A-Za-z$._]+]] |
| // CHECK: [[INNER_BODY]] |
| do { |
| // CHECK: store i32 7, |
| *iptr = 7; |
| // CHECK: br label %[[INNER_COND:[0-9A-Za-z$._]+]] |
| } while(({ break; --y; })); |
| // CHECK: [[INNER_COND]] |
| // CHECK: br label %[[INNER_END:[0-9A-Za-z$._]+]] |
| // CHECK: label %[[INNER_BODY:[0-9A-Za-z$._]+]], label %[[INNER_END]] |
| } |
| // CHECK: [[INNER_END]] |
| // CHECK: br label %[[OUTER_COND]] |
| // CHECK: [[OUTER_END]] |
| // CHECK: ret void |
| } |