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