1*60e51c48SAlexey Bataev // RUN: %clang_cc1 -verify -triple x86_64-apple-darwin10 -fopenmp -x c++ -emit-llvm %s -o - -femit-all-decls | FileCheck %s 2*60e51c48SAlexey Bataev // RUN: %clang_cc1 -fopenmp -x c++ -triple x86_64-apple-darwin10 -emit-pch -o %t %s 3*60e51c48SAlexey Bataev // RUN: %clang_cc1 -fopenmp -x c++ -triple x86_64-apple-darwin10 -include-pch %t -verify %s -emit-llvm -o - -femit-all-decls | FileCheck %s 4*60e51c48SAlexey Bataev 5*60e51c48SAlexey Bataev // RUN: %clang_cc1 -verify -triple x86_64-apple-darwin10 -fopenmp-simd -x c++ -emit-llvm %s -o - -femit-all-decls | FileCheck --check-prefix SIMD-ONLY0 %s 6*60e51c48SAlexey Bataev // RUN: %clang_cc1 -fopenmp-simd -x c++ -triple x86_64-apple-darwin10 -emit-pch -o %t %s 7*60e51c48SAlexey Bataev // RUN: %clang_cc1 -fopenmp-simd -x c++ -triple x86_64-apple-darwin10 -include-pch %t -verify %s -emit-llvm -o - -femit-all-decls | FileCheck --check-prefix SIMD-ONLY0 %s 8*60e51c48SAlexey Bataev // SIMD-ONLY0-NOT: {{__kmpc|__tgt}} 9*60e51c48SAlexey Bataev // expected-no-diagnostics 10*60e51c48SAlexey Bataev #ifndef HEADER 11*60e51c48SAlexey Bataev #define HEADER 12*60e51c48SAlexey Bataev 13*60e51c48SAlexey Bataev // CHECK-LABEL: @main 14*60e51c48SAlexey Bataev int main(int argc, char **argv) { 15*60e51c48SAlexey Bataev // CHECK: [[GTID:%.+]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* [[DEFLOC:@.+]]) 16*60e51c48SAlexey Bataev // CHECK: call i8* @__kmpc_omp_task_alloc(%struct.ident_t* [[DEFLOC]], i32 [[GTID]], 17*60e51c48SAlexey Bataev // CHECK: call i32 @__kmpc_omp_task(%struct.ident_t* [[DEFLOC]], i32 [[GTID]], 18*60e51c48SAlexey Bataev #pragma omp task 19*60e51c48SAlexey Bataev ; 20*60e51c48SAlexey Bataev // CHECK: [[RES:%.+]] = call {{.*}}i32 @__kmpc_master(%struct.ident_t* [[DEFLOC]], i32 [[GTID]]) 21*60e51c48SAlexey Bataev // CHECK-NEXT: [[IS_MASTER:%.+]] = icmp ne i32 [[RES]], 0 22*60e51c48SAlexey Bataev // CHECK-NEXT: br i1 [[IS_MASTER]], label {{%?}}[[THEN:.+]], label {{%?}}[[EXIT:.+]] 23*60e51c48SAlexey Bataev // CHECK: [[THEN]] 24*60e51c48SAlexey Bataev // CHECK: call void @__kmpc_taskgroup(%struct.ident_t* [[DEFLOC]], i32 [[GTID]]) 25*60e51c48SAlexey Bataev // CHECK: [[TASKV:%.+]] = call i8* @__kmpc_omp_task_alloc(%struct.ident_t* [[DEFLOC]], i32 [[GTID]], i32 33, i64 80, i64 1, i32 (i32, i8*)* bitcast (i32 (i32, [[TDP_TY:%.+]]*)* [[TASK1:@.+]] to i32 (i32, i8*)*)) 26*60e51c48SAlexey Bataev // CHECK: [[TASK:%.+]] = bitcast i8* [[TASKV]] to [[TDP_TY]]* 27*60e51c48SAlexey Bataev // CHECK: [[TASK_DATA:%.+]] = getelementptr inbounds [[TDP_TY]], [[TDP_TY]]* [[TASK]], i32 0, i32 0 28*60e51c48SAlexey Bataev // CHECK: [[DOWN:%.+]] = getelementptr inbounds [[TD_TY:%.+]], [[TD_TY]]* [[TASK_DATA]], i32 0, i32 5 29*60e51c48SAlexey Bataev // CHECK: store i64 0, i64* [[DOWN]], 30*60e51c48SAlexey Bataev // CHECK: [[UP:%.+]] = getelementptr inbounds [[TD_TY]], [[TD_TY]]* [[TASK_DATA]], i32 0, i32 6 31*60e51c48SAlexey Bataev // CHECK: store i64 9, i64* [[UP]], 32*60e51c48SAlexey Bataev // CHECK: [[ST:%.+]] = getelementptr inbounds [[TD_TY]], [[TD_TY]]* [[TASK_DATA]], i32 0, i32 7 33*60e51c48SAlexey Bataev // CHECK: store i64 1, i64* [[ST]], 34*60e51c48SAlexey Bataev // CHECK: [[ST_VAL:%.+]] = load i64, i64* [[ST]], 35*60e51c48SAlexey Bataev // CHECK: call void @__kmpc_taskloop(%struct.ident_t* [[DEFLOC]], i32 [[GTID]], i8* [[TASKV]], i32 1, i64* [[DOWN]], i64* [[UP]], i64 [[ST_VAL]], i32 1, i32 0, i64 0, i8* null) 36*60e51c48SAlexey Bataev // CHECK: call void @__kmpc_end_taskgroup(%struct.ident_t* [[DEFLOC]], i32 [[GTID]]) 37*60e51c48SAlexey Bataev // CHECK-NEXT: call {{.*}}void @__kmpc_end_master(%struct.ident_t* [[DEFLOC]], i32 [[GTID]]) 38*60e51c48SAlexey Bataev // CHECK-NEXT: br label {{%?}}[[EXIT]] 39*60e51c48SAlexey Bataev // CHECK: [[EXIT]] 40*60e51c48SAlexey Bataev #pragma omp master taskloop priority(argc) 41*60e51c48SAlexey Bataev for (int i = 0; i < 10; ++i) 42*60e51c48SAlexey Bataev ; 43*60e51c48SAlexey Bataev // CHECK: [[RES:%.+]] = call {{.*}}i32 @__kmpc_master(%struct.ident_t* [[DEFLOC]], i32 [[GTID]]) 44*60e51c48SAlexey Bataev // CHECK-NEXT: [[IS_MASTER:%.+]] = icmp ne i32 [[RES]], 0 45*60e51c48SAlexey Bataev // CHECK-NEXT: br i1 [[IS_MASTER]], label {{%?}}[[THEN:.+]], label {{%?}}[[EXIT:.+]] 46*60e51c48SAlexey Bataev // CHECK: [[THEN]] 47*60e51c48SAlexey Bataev // CHECK: [[TASKV:%.+]] = call i8* @__kmpc_omp_task_alloc(%struct.ident_t* [[DEFLOC]], i32 [[GTID]], i32 1, i64 80, i64 1, i32 (i32, i8*)* bitcast (i32 (i32, [[TDP_TY:%.+]]*)* [[TASK2:@.+]] to i32 (i32, i8*)*)) 48*60e51c48SAlexey Bataev // CHECK: [[TASK:%.+]] = bitcast i8* [[TASKV]] to [[TDP_TY]]* 49*60e51c48SAlexey Bataev // CHECK: [[TASK_DATA:%.+]] = getelementptr inbounds [[TDP_TY]], [[TDP_TY]]* [[TASK]], i32 0, i32 0 50*60e51c48SAlexey Bataev // CHECK: [[DOWN:%.+]] = getelementptr inbounds [[TD_TY:%.+]], [[TD_TY]]* [[TASK_DATA]], i32 0, i32 5 51*60e51c48SAlexey Bataev // CHECK: store i64 0, i64* [[DOWN]], 52*60e51c48SAlexey Bataev // CHECK: [[UP:%.+]] = getelementptr inbounds [[TD_TY]], [[TD_TY]]* [[TASK_DATA]], i32 0, i32 6 53*60e51c48SAlexey Bataev // CHECK: store i64 9, i64* [[UP]], 54*60e51c48SAlexey Bataev // CHECK: [[ST:%.+]] = getelementptr inbounds [[TD_TY]], [[TD_TY]]* [[TASK_DATA]], i32 0, i32 7 55*60e51c48SAlexey Bataev // CHECK: store i64 1, i64* [[ST]], 56*60e51c48SAlexey Bataev // CHECK: [[ST_VAL:%.+]] = load i64, i64* [[ST]], 57*60e51c48SAlexey Bataev // CHECK: [[GRAINSIZE:%.+]] = zext i32 %{{.+}} to i64 58*60e51c48SAlexey Bataev // CHECK: call void @__kmpc_taskloop(%struct.ident_t* [[DEFLOC]], i32 [[GTID]], i8* [[TASKV]], i32 1, i64* [[DOWN]], i64* [[UP]], i64 [[ST_VAL]], i32 1, i32 1, i64 [[GRAINSIZE]], i8* null) 59*60e51c48SAlexey Bataev // CHECK-NEXT: call {{.*}}void @__kmpc_end_master(%struct.ident_t* [[DEFLOC]], i32 [[GTID]]) 60*60e51c48SAlexey Bataev // CHECK-NEXT: br label {{%?}}[[EXIT]] 61*60e51c48SAlexey Bataev // CHECK: [[EXIT]] 62*60e51c48SAlexey Bataev #pragma omp master taskloop nogroup grainsize(argc) 63*60e51c48SAlexey Bataev for (int i = 0; i < 10; ++i) 64*60e51c48SAlexey Bataev ; 65*60e51c48SAlexey Bataev // CHECK: [[RES:%.+]] = call {{.*}}i32 @__kmpc_master(%struct.ident_t* [[DEFLOC]], i32 [[GTID]]) 66*60e51c48SAlexey Bataev // CHECK-NEXT: [[IS_MASTER:%.+]] = icmp ne i32 [[RES]], 0 67*60e51c48SAlexey Bataev // CHECK-NEXT: br i1 [[IS_MASTER]], label {{%?}}[[THEN:.+]], label {{%?}}[[EXIT:.+]] 68*60e51c48SAlexey Bataev // CHECK: [[THEN]] 69*60e51c48SAlexey Bataev // CHECK: call void @__kmpc_taskgroup(%struct.ident_t* [[DEFLOC]], i32 [[GTID]]) 70*60e51c48SAlexey Bataev // CHECK: [[TASKV:%.+]] = call i8* @__kmpc_omp_task_alloc(%struct.ident_t* [[DEFLOC]], i32 [[GTID]], i32 1, i64 80, i64 16, i32 (i32, i8*)* bitcast (i32 (i32, [[TDP_TY:%.+]]*)* [[TASK3:@.+]] to i32 (i32, i8*)*)) 71*60e51c48SAlexey Bataev // CHECK: [[TASK:%.+]] = bitcast i8* [[TASKV]] to [[TDP_TY]]* 72*60e51c48SAlexey Bataev // CHECK: [[TASK_DATA:%.+]] = getelementptr inbounds [[TDP_TY]], [[TDP_TY]]* [[TASK]], i32 0, i32 0 73*60e51c48SAlexey Bataev // CHECK: [[IF:%.+]] = icmp ne i32 %{{.+}}, 0 74*60e51c48SAlexey Bataev // CHECK: [[IF_INT:%.+]] = sext i1 [[IF]] to i32 75*60e51c48SAlexey Bataev // CHECK: [[DOWN:%.+]] = getelementptr inbounds [[TD_TY:%.+]], [[TD_TY]]* [[TASK_DATA]], i32 0, i32 5 76*60e51c48SAlexey Bataev // CHECK: store i64 0, i64* [[DOWN]], 77*60e51c48SAlexey Bataev // CHECK: [[UP:%.+]] = getelementptr inbounds [[TD_TY]], [[TD_TY]]* [[TASK_DATA]], i32 0, i32 6 78*60e51c48SAlexey Bataev // CHECK: store i64 %{{.+}}, i64* [[UP]], 79*60e51c48SAlexey Bataev // CHECK: [[ST:%.+]] = getelementptr inbounds [[TD_TY]], [[TD_TY]]* [[TASK_DATA]], i32 0, i32 7 80*60e51c48SAlexey Bataev // CHECK: store i64 1, i64* [[ST]], 81*60e51c48SAlexey Bataev // CHECK: [[ST_VAL:%.+]] = load i64, i64* [[ST]], 82*60e51c48SAlexey Bataev // CHECK: call void @__kmpc_taskloop(%struct.ident_t* [[DEFLOC]], i32 [[GTID]], i8* [[TASKV]], i32 [[IF_INT]], i64* [[DOWN]], i64* [[UP]], i64 [[ST_VAL]], i32 1, i32 2, i64 4, i8* null) 83*60e51c48SAlexey Bataev // CHECK: call void @__kmpc_end_taskgroup(%struct.ident_t* [[DEFLOC]], i32 [[GTID]]) 84*60e51c48SAlexey Bataev // CHECK-NEXT: call {{.*}}void @__kmpc_end_master(%struct.ident_t* [[DEFLOC]], i32 [[GTID]]) 85*60e51c48SAlexey Bataev // CHECK-NEXT: br label {{%?}}[[EXIT]] 86*60e51c48SAlexey Bataev // CHECK: [[EXIT]] 87*60e51c48SAlexey Bataev int i; 88*60e51c48SAlexey Bataev #pragma omp master taskloop if(argc) shared(argc, argv) collapse(2) num_tasks(4) 89*60e51c48SAlexey Bataev for (i = 0; i < argc; ++i) 90*60e51c48SAlexey Bataev for (int j = argc; j < argv[argc][argc]; ++j) 91*60e51c48SAlexey Bataev ; 92*60e51c48SAlexey Bataev } 93*60e51c48SAlexey Bataev 94*60e51c48SAlexey Bataev // CHECK: define internal i32 [[TASK1]]( 95*60e51c48SAlexey Bataev // CHECK: [[DOWN:%.+]] = getelementptr inbounds [[TD_TY:%.+]], [[TD_TY]]* %{{.+}}, i32 0, i32 5 96*60e51c48SAlexey Bataev // CHECK: [[DOWN_VAL:%.+]] = load i64, i64* [[DOWN]], 97*60e51c48SAlexey Bataev // CHECK: [[UP:%.+]] = getelementptr inbounds [[TD_TY]], [[TD_TY]]* %{{.+}}, i32 0, i32 6 98*60e51c48SAlexey Bataev // CHECK: [[UP_VAL:%.+]] = load i64, i64* [[UP]], 99*60e51c48SAlexey Bataev // CHECK: [[ST:%.+]] = getelementptr inbounds [[TD_TY]], [[TD_TY]]* %{{.+}}, i32 0, i32 7 100*60e51c48SAlexey Bataev // CHECK: [[ST_VAL:%.+]] = load i64, i64* [[ST]], 101*60e51c48SAlexey Bataev // CHECK: [[LITER:%.+]] = getelementptr inbounds [[TD_TY]], [[TD_TY]]* %{{.+}}, i32 0, i32 8 102*60e51c48SAlexey Bataev // CHECK: [[LITER_VAL:%.+]] = load i32, i32* [[LITER]], 103*60e51c48SAlexey Bataev // CHECK: store i64 [[DOWN_VAL]], i64* [[LB:%[^,]+]], 104*60e51c48SAlexey Bataev // CHECK: store i64 [[UP_VAL]], i64* [[UB:%[^,]+]], 105*60e51c48SAlexey Bataev // CHECK: store i64 [[ST_VAL]], i64* [[ST:%[^,]+]], 106*60e51c48SAlexey Bataev // CHECK: store i32 [[LITER_VAL]], i32* [[LITER:%[^,]+]], 107*60e51c48SAlexey Bataev // CHECK: [[LB_VAL:%.+]] = load i64, i64* [[LB]], 108*60e51c48SAlexey Bataev // CHECK: [[LB_I32:%.+]] = trunc i64 [[LB_VAL]] to i32 109*60e51c48SAlexey Bataev // CHECK: store i32 [[LB_I32]], i32* [[CNT:%.+]], 110*60e51c48SAlexey Bataev // CHECK: br label 111*60e51c48SAlexey Bataev // CHECK: [[VAL:%.+]] = load i32, i32* [[CNT]], 112*60e51c48SAlexey Bataev // CHECK: [[VAL_I64:%.+]] = sext i32 [[VAL]] to i64 113*60e51c48SAlexey Bataev // CHECK: [[UB_VAL:%.+]] = load i64, i64* [[UB]], 114*60e51c48SAlexey Bataev // CHECK: [[CMP:%.+]] = icmp ule i64 [[VAL_I64]], [[UB_VAL]] 115*60e51c48SAlexey Bataev // CHECK: br i1 [[CMP]], label %{{.+}}, label %{{.+}} 116*60e51c48SAlexey Bataev // CHECK: load i32, i32* % 117*60e51c48SAlexey Bataev // CHECK: store i32 % 118*60e51c48SAlexey Bataev // CHECK: load i32, i32* % 119*60e51c48SAlexey Bataev // CHECK: add nsw i32 %{{.+}}, 1 120*60e51c48SAlexey Bataev // CHECK: store i32 %{{.+}}, i32* % 121*60e51c48SAlexey Bataev // CHECK: br label % 122*60e51c48SAlexey Bataev // CHECK: ret i32 0 123*60e51c48SAlexey Bataev 124*60e51c48SAlexey Bataev // CHECK: define internal i32 [[TASK2]]( 125*60e51c48SAlexey Bataev // CHECK: [[DOWN:%.+]] = getelementptr inbounds [[TD_TY:%.+]], [[TD_TY]]* %{{.+}}, i32 0, i32 5 126*60e51c48SAlexey Bataev // CHECK: [[DOWN_VAL:%.+]] = load i64, i64* [[DOWN]], 127*60e51c48SAlexey Bataev // CHECK: [[UP:%.+]] = getelementptr inbounds [[TD_TY]], [[TD_TY]]* %{{.+}}, i32 0, i32 6 128*60e51c48SAlexey Bataev // CHECK: [[UP_VAL:%.+]] = load i64, i64* [[UP]], 129*60e51c48SAlexey Bataev // CHECK: [[ST:%.+]] = getelementptr inbounds [[TD_TY]], [[TD_TY]]* %{{.+}}, i32 0, i32 7 130*60e51c48SAlexey Bataev // CHECK: [[ST_VAL:%.+]] = load i64, i64* [[ST]], 131*60e51c48SAlexey Bataev // CHECK: [[LITER:%.+]] = getelementptr inbounds [[TD_TY]], [[TD_TY]]* %{{.+}}, i32 0, i32 8 132*60e51c48SAlexey Bataev // CHECK: [[LITER_VAL:%.+]] = load i32, i32* [[LITER]], 133*60e51c48SAlexey Bataev // CHECK: store i64 [[DOWN_VAL]], i64* [[LB:%[^,]+]], 134*60e51c48SAlexey Bataev // CHECK: store i64 [[UP_VAL]], i64* [[UB:%[^,]+]], 135*60e51c48SAlexey Bataev // CHECK: store i64 [[ST_VAL]], i64* [[ST:%[^,]+]], 136*60e51c48SAlexey Bataev // CHECK: store i32 [[LITER_VAL]], i32* [[LITER:%[^,]+]], 137*60e51c48SAlexey Bataev // CHECK: [[LB_VAL:%.+]] = load i64, i64* [[LB]], 138*60e51c48SAlexey Bataev // CHECK: [[LB_I32:%.+]] = trunc i64 [[LB_VAL]] to i32 139*60e51c48SAlexey Bataev // CHECK: store i32 [[LB_I32]], i32* [[CNT:%.+]], 140*60e51c48SAlexey Bataev // CHECK: br label 141*60e51c48SAlexey Bataev // CHECK: [[VAL:%.+]] = load i32, i32* [[CNT]], 142*60e51c48SAlexey Bataev // CHECK: [[VAL_I64:%.+]] = sext i32 [[VAL]] to i64 143*60e51c48SAlexey Bataev // CHECK: [[UB_VAL:%.+]] = load i64, i64* [[UB]], 144*60e51c48SAlexey Bataev // CHECK: [[CMP:%.+]] = icmp ule i64 [[VAL_I64]], [[UB_VAL]] 145*60e51c48SAlexey Bataev // CHECK: br i1 [[CMP]], label %{{.+}}, label %{{.+}} 146*60e51c48SAlexey Bataev // CHECK: load i32, i32* % 147*60e51c48SAlexey Bataev // CHECK: store i32 % 148*60e51c48SAlexey Bataev // CHECK: load i32, i32* % 149*60e51c48SAlexey Bataev // CHECK: add nsw i32 %{{.+}}, 1 150*60e51c48SAlexey Bataev // CHECK: store i32 %{{.+}}, i32* % 151*60e51c48SAlexey Bataev // CHECK: br label % 152*60e51c48SAlexey Bataev // CHECK: ret i32 0 153*60e51c48SAlexey Bataev 154*60e51c48SAlexey Bataev // CHECK: define internal i32 [[TASK3]]( 155*60e51c48SAlexey Bataev // CHECK: [[DOWN:%.+]] = getelementptr inbounds [[TD_TY:%.+]], [[TD_TY]]* %{{.+}}, i32 0, i32 5 156*60e51c48SAlexey Bataev // CHECK: [[DOWN_VAL:%.+]] = load i64, i64* [[DOWN]], 157*60e51c48SAlexey Bataev // CHECK: [[UP:%.+]] = getelementptr inbounds [[TD_TY]], [[TD_TY]]* %{{.+}}, i32 0, i32 6 158*60e51c48SAlexey Bataev // CHECK: [[UP_VAL:%.+]] = load i64, i64* [[UP]], 159*60e51c48SAlexey Bataev // CHECK: [[ST:%.+]] = getelementptr inbounds [[TD_TY]], [[TD_TY]]* %{{.+}}, i32 0, i32 7 160*60e51c48SAlexey Bataev // CHECK: [[ST_VAL:%.+]] = load i64, i64* [[ST]], 161*60e51c48SAlexey Bataev // CHECK: [[LITER:%.+]] = getelementptr inbounds [[TD_TY]], [[TD_TY]]* %{{.+}}, i32 0, i32 8 162*60e51c48SAlexey Bataev // CHECK: [[LITER_VAL:%.+]] = load i32, i32* [[LITER]], 163*60e51c48SAlexey Bataev // CHECK: store i64 [[DOWN_VAL]], i64* [[LB:%[^,]+]], 164*60e51c48SAlexey Bataev // CHECK: store i64 [[UP_VAL]], i64* [[UB:%[^,]+]], 165*60e51c48SAlexey Bataev // CHECK: store i64 [[ST_VAL]], i64* [[ST:%[^,]+]], 166*60e51c48SAlexey Bataev // CHECK: store i32 [[LITER_VAL]], i32* [[LITER:%[^,]+]], 167*60e51c48SAlexey Bataev // CHECK: [[LB_VAL:%.+]] = load i64, i64* [[LB]], 168*60e51c48SAlexey Bataev // CHECK: store i64 [[LB_VAL]], i64* [[CNT:%.+]], 169*60e51c48SAlexey Bataev // CHECK: br label 170*60e51c48SAlexey Bataev // CHECK: ret i32 0 171*60e51c48SAlexey Bataev 172*60e51c48SAlexey Bataev // CHECK-LABEL: @_ZN1SC2Ei 173*60e51c48SAlexey Bataev struct S { 174*60e51c48SAlexey Bataev int a; 175*60e51c48SAlexey Bataev S(int c) { 176*60e51c48SAlexey Bataev // CHECK: [[GTID:%.+]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* [[DEFLOC:@.+]]) 177*60e51c48SAlexey Bataev // CHECK: [[TASKV:%.+]] = call i8* @__kmpc_omp_task_alloc(%struct.ident_t* [[DEFLOC]], i32 [[GTID]], i32 1, i64 80, i64 16, i32 (i32, i8*)* bitcast (i32 (i32, [[TDP_TY:%.+]]*)* [[TASK4:@.+]] to i32 (i32, i8*)*)) 178*60e51c48SAlexey Bataev // CHECK: [[TASK:%.+]] = bitcast i8* [[TASKV]] to [[TDP_TY]]* 179*60e51c48SAlexey Bataev // CHECK: [[TASK_DATA:%.+]] = getelementptr inbounds [[TDP_TY]], [[TDP_TY]]* [[TASK]], i32 0, i32 0 180*60e51c48SAlexey Bataev // CHECK: [[DOWN:%.+]] = getelementptr inbounds [[TD_TY:%.+]], [[TD_TY]]* [[TASK_DATA]], i32 0, i32 5 181*60e51c48SAlexey Bataev // CHECK: store i64 0, i64* [[DOWN]], 182*60e51c48SAlexey Bataev // CHECK: [[UP:%.+]] = getelementptr inbounds [[TD_TY]], [[TD_TY]]* [[TASK_DATA]], i32 0, i32 6 183*60e51c48SAlexey Bataev // CHECK: store i64 %{{.+}}, i64* [[UP]], 184*60e51c48SAlexey Bataev // CHECK: [[ST:%.+]] = getelementptr inbounds [[TD_TY]], [[TD_TY]]* [[TASK_DATA]], i32 0, i32 7 185*60e51c48SAlexey Bataev // CHECK: store i64 1, i64* [[ST]], 186*60e51c48SAlexey Bataev // CHECK: [[ST_VAL:%.+]] = load i64, i64* [[ST]], 187*60e51c48SAlexey Bataev // CHECK: [[NUM_TASKS:%.+]] = zext i32 %{{.+}} to i64 188*60e51c48SAlexey Bataev // CHECK: call void @__kmpc_taskloop(%struct.ident_t* [[DEFLOC]], i32 [[GTID]], i8* [[TASKV]], i32 1, i64* [[DOWN]], i64* [[UP]], i64 [[ST_VAL]], i32 1, i32 2, i64 [[NUM_TASKS]], i8* null) 189*60e51c48SAlexey Bataev #pragma omp master taskloop shared(c) num_tasks(a) 190*60e51c48SAlexey Bataev for (a = 0; a < c; ++a) 191*60e51c48SAlexey Bataev ; 192*60e51c48SAlexey Bataev } 193*60e51c48SAlexey Bataev } s(1); 194*60e51c48SAlexey Bataev 195*60e51c48SAlexey Bataev // CHECK: define internal i32 [[TASK4]]( 196*60e51c48SAlexey Bataev // CHECK: [[DOWN:%.+]] = getelementptr inbounds [[TD_TY:%.+]], [[TD_TY]]* %{{.+}}, i32 0, i32 5 197*60e51c48SAlexey Bataev // CHECK: [[DOWN_VAL:%.+]] = load i64, i64* [[DOWN]], 198*60e51c48SAlexey Bataev // CHECK: [[UP:%.+]] = getelementptr inbounds [[TD_TY]], [[TD_TY]]* %{{.+}}, i32 0, i32 6 199*60e51c48SAlexey Bataev // CHECK: [[UP_VAL:%.+]] = load i64, i64* [[UP]], 200*60e51c48SAlexey Bataev // CHECK: [[ST:%.+]] = getelementptr inbounds [[TD_TY]], [[TD_TY]]* %{{.+}}, i32 0, i32 7 201*60e51c48SAlexey Bataev // CHECK: [[ST_VAL:%.+]] = load i64, i64* [[ST]], 202*60e51c48SAlexey Bataev // CHECK: [[LITER:%.+]] = getelementptr inbounds [[TD_TY]], [[TD_TY]]* %{{.+}}, i32 0, i32 8 203*60e51c48SAlexey Bataev // CHECK: [[LITER_VAL:%.+]] = load i32, i32* [[LITER]], 204*60e51c48SAlexey Bataev // CHECK: store i64 [[DOWN_VAL]], i64* [[LB:%[^,]+]], 205*60e51c48SAlexey Bataev // CHECK: store i64 [[UP_VAL]], i64* [[UB:%[^,]+]], 206*60e51c48SAlexey Bataev // CHECK: store i64 [[ST_VAL]], i64* [[ST:%[^,]+]], 207*60e51c48SAlexey Bataev // CHECK: store i32 [[LITER_VAL]], i32* [[LITER:%[^,]+]], 208*60e51c48SAlexey Bataev // CHECK: [[LB_VAL:%.+]] = load i64, i64* [[LB]], 209*60e51c48SAlexey Bataev // CHECK: [[LB_I32:%.+]] = trunc i64 [[LB_VAL]] to i32 210*60e51c48SAlexey Bataev // CHECK: store i32 [[LB_I32]], i32* [[CNT:%.+]], 211*60e51c48SAlexey Bataev // CHECK: br label 212*60e51c48SAlexey Bataev // CHECK: [[VAL:%.+]] = load i32, i32* [[CNT]], 213*60e51c48SAlexey Bataev // CHECK: [[VAL_I64:%.+]] = sext i32 [[VAL]] to i64 214*60e51c48SAlexey Bataev // CHECK: [[UB_VAL:%.+]] = load i64, i64* [[UB]], 215*60e51c48SAlexey Bataev // CHECK: [[CMP:%.+]] = icmp ule i64 [[VAL_I64]], [[UB_VAL]] 216*60e51c48SAlexey Bataev // CHECK: br i1 [[CMP]], label %{{.+}}, label %{{.+}} 217*60e51c48SAlexey Bataev // CHECK: load i32, i32* % 218*60e51c48SAlexey Bataev // CHECK: store i32 % 219*60e51c48SAlexey Bataev // CHECK: load i32, i32* % 220*60e51c48SAlexey Bataev // CHECK: add nsw i32 %{{.+}}, 1 221*60e51c48SAlexey Bataev // CHECK: store i32 %{{.+}}, i32* % 222*60e51c48SAlexey Bataev // CHECK: br label % 223*60e51c48SAlexey Bataev // CHECK: ret i32 0 224*60e51c48SAlexey Bataev 225*60e51c48SAlexey Bataev #endif 226