1*e0ca4792SAlexey Bataev // RUN: %clang_cc1 -verify -triple x86_64-apple-darwin10 -fopenmp -fopenmp-version=50 -x c++ -emit-llvm %s -o - | FileCheck %s 2*e0ca4792SAlexey Bataev // RUN: %clang_cc1 -fopenmp -fopenmp-version=50 -x c++ -triple x86_64-apple-darwin10 -emit-pch -o %t %s 3*e0ca4792SAlexey Bataev // RUN: %clang_cc1 -fopenmp -fopenmp-version=50 -x c++ -triple x86_64-apple-darwin10 -include-pch %t -verify %s -emit-llvm -o - | FileCheck %s 460e51c48SAlexey Bataev 5*e0ca4792SAlexey Bataev // RUN: %clang_cc1 -verify -triple x86_64-apple-darwin10 -fopenmp-simd -fopenmp-version=50 -x c++ -emit-llvm %s -o - | FileCheck --check-prefix SIMD-ONLY0 %s 6*e0ca4792SAlexey Bataev // RUN: %clang_cc1 -fopenmp-simd -fopenmp-version=50 -x c++ -triple x86_64-apple-darwin10 -emit-pch -o %t %s 7*e0ca4792SAlexey Bataev // RUN: %clang_cc1 -fopenmp-simd -fopenmp-version=50 -x c++ -triple x86_64-apple-darwin10 -include-pch %t -verify %s -emit-llvm -o - | FileCheck --check-prefix SIMD-ONLY0 %s 860e51c48SAlexey Bataev // SIMD-ONLY0-NOT: {{__kmpc|__tgt}} 960e51c48SAlexey Bataev // expected-no-diagnostics 1060e51c48SAlexey Bataev #ifndef HEADER 1160e51c48SAlexey Bataev #define HEADER 1260e51c48SAlexey Bataev 1360e51c48SAlexey Bataev // CHECK-LABEL: @main 1460e51c48SAlexey Bataev int main(int argc, char **argv) { 1560e51c48SAlexey Bataev // CHECK: [[GTID:%.+]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* [[DEFLOC:@.+]]) 1660e51c48SAlexey Bataev // CHECK: call i8* @__kmpc_omp_task_alloc(%struct.ident_t* [[DEFLOC]], i32 [[GTID]], 1760e51c48SAlexey Bataev // CHECK: call i32 @__kmpc_omp_task(%struct.ident_t* [[DEFLOC]], i32 [[GTID]], 1860e51c48SAlexey Bataev #pragma omp task 1960e51c48SAlexey Bataev ; 2060e51c48SAlexey Bataev // CHECK: [[RES:%.+]] = call {{.*}}i32 @__kmpc_master(%struct.ident_t* [[DEFLOC]], i32 [[GTID]]) 2160e51c48SAlexey Bataev // CHECK-NEXT: [[IS_MASTER:%.+]] = icmp ne i32 [[RES]], 0 2260e51c48SAlexey Bataev // CHECK-NEXT: br i1 [[IS_MASTER]], label {{%?}}[[THEN:.+]], label {{%?}}[[EXIT:.+]] 2360e51c48SAlexey Bataev // CHECK: [[THEN]] 2460e51c48SAlexey Bataev // CHECK: call void @__kmpc_taskgroup(%struct.ident_t* [[DEFLOC]], i32 [[GTID]]) 2560e51c48SAlexey 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*)*)) 2660e51c48SAlexey Bataev // CHECK: [[TASK:%.+]] = bitcast i8* [[TASKV]] to [[TDP_TY]]* 2760e51c48SAlexey Bataev // CHECK: [[TASK_DATA:%.+]] = getelementptr inbounds [[TDP_TY]], [[TDP_TY]]* [[TASK]], i32 0, i32 0 2860e51c48SAlexey Bataev // CHECK: [[DOWN:%.+]] = getelementptr inbounds [[TD_TY:%.+]], [[TD_TY]]* [[TASK_DATA]], i32 0, i32 5 2960e51c48SAlexey Bataev // CHECK: store i64 0, i64* [[DOWN]], 3060e51c48SAlexey Bataev // CHECK: [[UP:%.+]] = getelementptr inbounds [[TD_TY]], [[TD_TY]]* [[TASK_DATA]], i32 0, i32 6 3160e51c48SAlexey Bataev // CHECK: store i64 9, i64* [[UP]], 3260e51c48SAlexey Bataev // CHECK: [[ST:%.+]] = getelementptr inbounds [[TD_TY]], [[TD_TY]]* [[TASK_DATA]], i32 0, i32 7 3360e51c48SAlexey Bataev // CHECK: store i64 1, i64* [[ST]], 3460e51c48SAlexey Bataev // CHECK: [[ST_VAL:%.+]] = load i64, i64* [[ST]], 3560e51c48SAlexey 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) 3660e51c48SAlexey Bataev // CHECK: call void @__kmpc_end_taskgroup(%struct.ident_t* [[DEFLOC]], i32 [[GTID]]) 3760e51c48SAlexey Bataev // CHECK-NEXT: call {{.*}}void @__kmpc_end_master(%struct.ident_t* [[DEFLOC]], i32 [[GTID]]) 3860e51c48SAlexey Bataev // CHECK-NEXT: br label {{%?}}[[EXIT]] 3960e51c48SAlexey Bataev // CHECK: [[EXIT]] 4060e51c48SAlexey Bataev #pragma omp master taskloop priority(argc) 4160e51c48SAlexey Bataev for (int i = 0; i < 10; ++i) 4260e51c48SAlexey Bataev ; 4360e51c48SAlexey Bataev // CHECK: [[RES:%.+]] = call {{.*}}i32 @__kmpc_master(%struct.ident_t* [[DEFLOC]], i32 [[GTID]]) 4460e51c48SAlexey Bataev // CHECK-NEXT: [[IS_MASTER:%.+]] = icmp ne i32 [[RES]], 0 4560e51c48SAlexey Bataev // CHECK-NEXT: br i1 [[IS_MASTER]], label {{%?}}[[THEN:.+]], label {{%?}}[[EXIT:.+]] 4660e51c48SAlexey Bataev // CHECK: [[THEN]] 4760e51c48SAlexey 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*)*)) 4860e51c48SAlexey Bataev // CHECK: [[TASK:%.+]] = bitcast i8* [[TASKV]] to [[TDP_TY]]* 4960e51c48SAlexey Bataev // CHECK: [[TASK_DATA:%.+]] = getelementptr inbounds [[TDP_TY]], [[TDP_TY]]* [[TASK]], i32 0, i32 0 5060e51c48SAlexey Bataev // CHECK: [[DOWN:%.+]] = getelementptr inbounds [[TD_TY:%.+]], [[TD_TY]]* [[TASK_DATA]], i32 0, i32 5 5160e51c48SAlexey Bataev // CHECK: store i64 0, i64* [[DOWN]], 5260e51c48SAlexey Bataev // CHECK: [[UP:%.+]] = getelementptr inbounds [[TD_TY]], [[TD_TY]]* [[TASK_DATA]], i32 0, i32 6 5360e51c48SAlexey Bataev // CHECK: store i64 9, i64* [[UP]], 5460e51c48SAlexey Bataev // CHECK: [[ST:%.+]] = getelementptr inbounds [[TD_TY]], [[TD_TY]]* [[TASK_DATA]], i32 0, i32 7 5560e51c48SAlexey Bataev // CHECK: store i64 1, i64* [[ST]], 5660e51c48SAlexey Bataev // CHECK: [[ST_VAL:%.+]] = load i64, i64* [[ST]], 5760e51c48SAlexey Bataev // CHECK: [[GRAINSIZE:%.+]] = zext i32 %{{.+}} to i64 5860e51c48SAlexey 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) 5960e51c48SAlexey Bataev // CHECK-NEXT: call {{.*}}void @__kmpc_end_master(%struct.ident_t* [[DEFLOC]], i32 [[GTID]]) 6060e51c48SAlexey Bataev // CHECK-NEXT: br label {{%?}}[[EXIT]] 6160e51c48SAlexey Bataev // CHECK: [[EXIT]] 6260e51c48SAlexey Bataev #pragma omp master taskloop nogroup grainsize(argc) 6360e51c48SAlexey Bataev for (int i = 0; i < 10; ++i) 6460e51c48SAlexey Bataev ; 6560e51c48SAlexey Bataev // CHECK: [[RES:%.+]] = call {{.*}}i32 @__kmpc_master(%struct.ident_t* [[DEFLOC]], i32 [[GTID]]) 6660e51c48SAlexey Bataev // CHECK-NEXT: [[IS_MASTER:%.+]] = icmp ne i32 [[RES]], 0 6760e51c48SAlexey Bataev // CHECK-NEXT: br i1 [[IS_MASTER]], label {{%?}}[[THEN:.+]], label {{%?}}[[EXIT:.+]] 6860e51c48SAlexey Bataev // CHECK: [[THEN]] 6960e51c48SAlexey Bataev // CHECK: call void @__kmpc_taskgroup(%struct.ident_t* [[DEFLOC]], i32 [[GTID]]) 7060e51c48SAlexey 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*)*)) 7160e51c48SAlexey Bataev // CHECK: [[TASK:%.+]] = bitcast i8* [[TASKV]] to [[TDP_TY]]* 7260e51c48SAlexey Bataev // CHECK: [[TASK_DATA:%.+]] = getelementptr inbounds [[TDP_TY]], [[TDP_TY]]* [[TASK]], i32 0, i32 0 7360e51c48SAlexey Bataev // CHECK: [[IF:%.+]] = icmp ne i32 %{{.+}}, 0 7460e51c48SAlexey Bataev // CHECK: [[IF_INT:%.+]] = sext i1 [[IF]] to i32 7560e51c48SAlexey Bataev // CHECK: [[DOWN:%.+]] = getelementptr inbounds [[TD_TY:%.+]], [[TD_TY]]* [[TASK_DATA]], i32 0, i32 5 7660e51c48SAlexey Bataev // CHECK: store i64 0, i64* [[DOWN]], 7760e51c48SAlexey Bataev // CHECK: [[UP:%.+]] = getelementptr inbounds [[TD_TY]], [[TD_TY]]* [[TASK_DATA]], i32 0, i32 6 7860e51c48SAlexey Bataev // CHECK: store i64 %{{.+}}, i64* [[UP]], 7960e51c48SAlexey Bataev // CHECK: [[ST:%.+]] = getelementptr inbounds [[TD_TY]], [[TD_TY]]* [[TASK_DATA]], i32 0, i32 7 8060e51c48SAlexey Bataev // CHECK: store i64 1, i64* [[ST]], 8160e51c48SAlexey Bataev // CHECK: [[ST_VAL:%.+]] = load i64, i64* [[ST]], 8260e51c48SAlexey 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) 8360e51c48SAlexey Bataev // CHECK: call void @__kmpc_end_taskgroup(%struct.ident_t* [[DEFLOC]], i32 [[GTID]]) 8460e51c48SAlexey Bataev // CHECK-NEXT: call {{.*}}void @__kmpc_end_master(%struct.ident_t* [[DEFLOC]], i32 [[GTID]]) 8560e51c48SAlexey Bataev // CHECK-NEXT: br label {{%?}}[[EXIT]] 8660e51c48SAlexey Bataev // CHECK: [[EXIT]] 8760e51c48SAlexey Bataev int i; 8860e51c48SAlexey Bataev #pragma omp master taskloop if(argc) shared(argc, argv) collapse(2) num_tasks(4) 8960e51c48SAlexey Bataev for (i = 0; i < argc; ++i) 9060e51c48SAlexey Bataev for (int j = argc; j < argv[argc][argc]; ++j) 9160e51c48SAlexey Bataev ; 92*e0ca4792SAlexey Bataev // CHECK: [[RES:%.+]] = call {{.*}}i32 @__kmpc_master(%struct.ident_t* [[DEFLOC]], i32 [[GTID]]) 93*e0ca4792SAlexey Bataev // CHECK-NEXT: [[IS_MASTER:%.+]] = icmp ne i32 [[RES]], 0 94*e0ca4792SAlexey Bataev // CHECK-NEXT: br i1 [[IS_MASTER]], label {{%?}}[[THEN:.+]], label {{%?}}[[EXIT:.+]] 95*e0ca4792SAlexey Bataev // CHECK: [[THEN]] 96*e0ca4792SAlexey Bataev // CHECK: call void @__kmpc_taskgroup( 97*e0ca4792SAlexey Bataev // CHECK: call i8* @__kmpc_omp_task_alloc(%struct.ident_t* @{{.+}}, i32 %{{.+}}, i32 1, i64 80, i64 1, i32 (i32, i8*)* bitcast (i32 (i32, %{{.+}}*)* [[TASK_CANCEL:@.+]] to i32 (i32, i8*)*)) 98*e0ca4792SAlexey Bataev // CHECK: call void @__kmpc_taskloop( 99*e0ca4792SAlexey Bataev // CHECK: call void @__kmpc_end_taskgroup( 100*e0ca4792SAlexey Bataev // CHECK-NEXT: call {{.*}}void @__kmpc_end_master(%struct.ident_t* [[DEFLOC]], i32 [[GTID]]) 101*e0ca4792SAlexey Bataev // CHECK-NEXT: br label {{%?}}[[EXIT]] 102*e0ca4792SAlexey Bataev // CHECK: [[EXIT]] 103*e0ca4792SAlexey Bataev #pragma omp master taskloop 104*e0ca4792SAlexey Bataev for (int i = 0; i < 10; ++i) { 105*e0ca4792SAlexey Bataev #pragma omp cancel taskgroup 106*e0ca4792SAlexey Bataev #pragma omp cancellation point taskgroup 107*e0ca4792SAlexey Bataev } 10860e51c48SAlexey Bataev } 10960e51c48SAlexey Bataev 11060e51c48SAlexey Bataev // CHECK: define internal i32 [[TASK1]]( 11160e51c48SAlexey Bataev // CHECK: [[DOWN:%.+]] = getelementptr inbounds [[TD_TY:%.+]], [[TD_TY]]* %{{.+}}, i32 0, i32 5 11260e51c48SAlexey Bataev // CHECK: [[DOWN_VAL:%.+]] = load i64, i64* [[DOWN]], 11360e51c48SAlexey Bataev // CHECK: [[UP:%.+]] = getelementptr inbounds [[TD_TY]], [[TD_TY]]* %{{.+}}, i32 0, i32 6 11460e51c48SAlexey Bataev // CHECK: [[UP_VAL:%.+]] = load i64, i64* [[UP]], 11560e51c48SAlexey Bataev // CHECK: [[ST:%.+]] = getelementptr inbounds [[TD_TY]], [[TD_TY]]* %{{.+}}, i32 0, i32 7 11660e51c48SAlexey Bataev // CHECK: [[ST_VAL:%.+]] = load i64, i64* [[ST]], 11760e51c48SAlexey Bataev // CHECK: [[LITER:%.+]] = getelementptr inbounds [[TD_TY]], [[TD_TY]]* %{{.+}}, i32 0, i32 8 11860e51c48SAlexey Bataev // CHECK: [[LITER_VAL:%.+]] = load i32, i32* [[LITER]], 11960e51c48SAlexey Bataev // CHECK: store i64 [[DOWN_VAL]], i64* [[LB:%[^,]+]], 12060e51c48SAlexey Bataev // CHECK: store i64 [[UP_VAL]], i64* [[UB:%[^,]+]], 12160e51c48SAlexey Bataev // CHECK: store i64 [[ST_VAL]], i64* [[ST:%[^,]+]], 12260e51c48SAlexey Bataev // CHECK: store i32 [[LITER_VAL]], i32* [[LITER:%[^,]+]], 12360e51c48SAlexey Bataev // CHECK: [[LB_VAL:%.+]] = load i64, i64* [[LB]], 12460e51c48SAlexey Bataev // CHECK: [[LB_I32:%.+]] = trunc i64 [[LB_VAL]] to i32 12560e51c48SAlexey Bataev // CHECK: store i32 [[LB_I32]], i32* [[CNT:%.+]], 12660e51c48SAlexey Bataev // CHECK: br label 12760e51c48SAlexey Bataev // CHECK: [[VAL:%.+]] = load i32, i32* [[CNT]], 12860e51c48SAlexey Bataev // CHECK: [[VAL_I64:%.+]] = sext i32 [[VAL]] to i64 12960e51c48SAlexey Bataev // CHECK: [[UB_VAL:%.+]] = load i64, i64* [[UB]], 13060e51c48SAlexey Bataev // CHECK: [[CMP:%.+]] = icmp ule i64 [[VAL_I64]], [[UB_VAL]] 13160e51c48SAlexey Bataev // CHECK: br i1 [[CMP]], label %{{.+}}, label %{{.+}} 13260e51c48SAlexey Bataev // CHECK: load i32, i32* % 13360e51c48SAlexey Bataev // CHECK: store i32 % 13460e51c48SAlexey Bataev // CHECK: load i32, i32* % 13560e51c48SAlexey Bataev // CHECK: add nsw i32 %{{.+}}, 1 13660e51c48SAlexey Bataev // CHECK: store i32 %{{.+}}, i32* % 13760e51c48SAlexey Bataev // CHECK: br label % 13860e51c48SAlexey Bataev // CHECK: ret i32 0 13960e51c48SAlexey Bataev 14060e51c48SAlexey Bataev // CHECK: define internal i32 [[TASK2]]( 14160e51c48SAlexey Bataev // CHECK: [[DOWN:%.+]] = getelementptr inbounds [[TD_TY:%.+]], [[TD_TY]]* %{{.+}}, i32 0, i32 5 14260e51c48SAlexey Bataev // CHECK: [[DOWN_VAL:%.+]] = load i64, i64* [[DOWN]], 14360e51c48SAlexey Bataev // CHECK: [[UP:%.+]] = getelementptr inbounds [[TD_TY]], [[TD_TY]]* %{{.+}}, i32 0, i32 6 14460e51c48SAlexey Bataev // CHECK: [[UP_VAL:%.+]] = load i64, i64* [[UP]], 14560e51c48SAlexey Bataev // CHECK: [[ST:%.+]] = getelementptr inbounds [[TD_TY]], [[TD_TY]]* %{{.+}}, i32 0, i32 7 14660e51c48SAlexey Bataev // CHECK: [[ST_VAL:%.+]] = load i64, i64* [[ST]], 14760e51c48SAlexey Bataev // CHECK: [[LITER:%.+]] = getelementptr inbounds [[TD_TY]], [[TD_TY]]* %{{.+}}, i32 0, i32 8 14860e51c48SAlexey Bataev // CHECK: [[LITER_VAL:%.+]] = load i32, i32* [[LITER]], 14960e51c48SAlexey Bataev // CHECK: store i64 [[DOWN_VAL]], i64* [[LB:%[^,]+]], 15060e51c48SAlexey Bataev // CHECK: store i64 [[UP_VAL]], i64* [[UB:%[^,]+]], 15160e51c48SAlexey Bataev // CHECK: store i64 [[ST_VAL]], i64* [[ST:%[^,]+]], 15260e51c48SAlexey Bataev // CHECK: store i32 [[LITER_VAL]], i32* [[LITER:%[^,]+]], 15360e51c48SAlexey Bataev // CHECK: [[LB_VAL:%.+]] = load i64, i64* [[LB]], 15460e51c48SAlexey Bataev // CHECK: [[LB_I32:%.+]] = trunc i64 [[LB_VAL]] to i32 15560e51c48SAlexey Bataev // CHECK: store i32 [[LB_I32]], i32* [[CNT:%.+]], 15660e51c48SAlexey Bataev // CHECK: br label 15760e51c48SAlexey Bataev // CHECK: [[VAL:%.+]] = load i32, i32* [[CNT]], 15860e51c48SAlexey Bataev // CHECK: [[VAL_I64:%.+]] = sext i32 [[VAL]] to i64 15960e51c48SAlexey Bataev // CHECK: [[UB_VAL:%.+]] = load i64, i64* [[UB]], 16060e51c48SAlexey Bataev // CHECK: [[CMP:%.+]] = icmp ule i64 [[VAL_I64]], [[UB_VAL]] 16160e51c48SAlexey Bataev // CHECK: br i1 [[CMP]], label %{{.+}}, label %{{.+}} 16260e51c48SAlexey Bataev // CHECK: load i32, i32* % 16360e51c48SAlexey Bataev // CHECK: store i32 % 16460e51c48SAlexey Bataev // CHECK: load i32, i32* % 16560e51c48SAlexey Bataev // CHECK: add nsw i32 %{{.+}}, 1 16660e51c48SAlexey Bataev // CHECK: store i32 %{{.+}}, i32* % 16760e51c48SAlexey Bataev // CHECK: br label % 16860e51c48SAlexey Bataev // CHECK: ret i32 0 16960e51c48SAlexey Bataev 17060e51c48SAlexey Bataev // CHECK: define internal i32 [[TASK3]]( 17160e51c48SAlexey Bataev // CHECK: [[DOWN:%.+]] = getelementptr inbounds [[TD_TY:%.+]], [[TD_TY]]* %{{.+}}, i32 0, i32 5 17260e51c48SAlexey Bataev // CHECK: [[DOWN_VAL:%.+]] = load i64, i64* [[DOWN]], 17360e51c48SAlexey Bataev // CHECK: [[UP:%.+]] = getelementptr inbounds [[TD_TY]], [[TD_TY]]* %{{.+}}, i32 0, i32 6 17460e51c48SAlexey Bataev // CHECK: [[UP_VAL:%.+]] = load i64, i64* [[UP]], 17560e51c48SAlexey Bataev // CHECK: [[ST:%.+]] = getelementptr inbounds [[TD_TY]], [[TD_TY]]* %{{.+}}, i32 0, i32 7 17660e51c48SAlexey Bataev // CHECK: [[ST_VAL:%.+]] = load i64, i64* [[ST]], 17760e51c48SAlexey Bataev // CHECK: [[LITER:%.+]] = getelementptr inbounds [[TD_TY]], [[TD_TY]]* %{{.+}}, i32 0, i32 8 17860e51c48SAlexey Bataev // CHECK: [[LITER_VAL:%.+]] = load i32, i32* [[LITER]], 17960e51c48SAlexey Bataev // CHECK: store i64 [[DOWN_VAL]], i64* [[LB:%[^,]+]], 18060e51c48SAlexey Bataev // CHECK: store i64 [[UP_VAL]], i64* [[UB:%[^,]+]], 18160e51c48SAlexey Bataev // CHECK: store i64 [[ST_VAL]], i64* [[ST:%[^,]+]], 18260e51c48SAlexey Bataev // CHECK: store i32 [[LITER_VAL]], i32* [[LITER:%[^,]+]], 18360e51c48SAlexey Bataev // CHECK: [[LB_VAL:%.+]] = load i64, i64* [[LB]], 18460e51c48SAlexey Bataev // CHECK: store i64 [[LB_VAL]], i64* [[CNT:%.+]], 18560e51c48SAlexey Bataev // CHECK: br label 18660e51c48SAlexey Bataev // CHECK: ret i32 0 18760e51c48SAlexey Bataev 188*e0ca4792SAlexey Bataev // CHECK: define internal i32 [[TASK_CANCEL]]( 189*e0ca4792SAlexey Bataev // CHECK: [[RES:%.+]] = call i32 @__kmpc_cancel(%struct.ident_t* @{{.+}}, i32 %{{.+}}, i32 4) 190*e0ca4792SAlexey Bataev // CHECK: [[IS_CANCEL:%.+]] = icmp ne i32 [[RES]], 0 191*e0ca4792SAlexey Bataev // CHECK: br i1 [[IS_CANCEL]], label %[[EXIT:.+]], label %[[CONTINUE:[^,]+]] 192*e0ca4792SAlexey Bataev // CHECK: [[EXIT]]: 193*e0ca4792SAlexey Bataev // CHECK: store i32 1, i32* [[CLEANUP_SLOT:%.+]], 194*e0ca4792SAlexey Bataev // CHECK: br label %[[DONE:[^,]+]] 195*e0ca4792SAlexey Bataev // CHECK: [[CONTINUE]]: 196*e0ca4792SAlexey Bataev // CHECK: [[RES:%.+]] = call i32 @__kmpc_cancellationpoint(%struct.ident_t* @{{.+}}, i32 %{{.+}}, i32 4) 197*e0ca4792SAlexey Bataev // CHECK: [[IS_CANCEL:%.+]] = icmp ne i32 [[RES]], 0 198*e0ca4792SAlexey Bataev // CHECK: br i1 [[IS_CANCEL]], label %[[EXIT2:.+]], label %[[CONTINUE2:[^,]+]] 199*e0ca4792SAlexey Bataev // CHECK: [[EXIT2]]: 200*e0ca4792SAlexey Bataev // CHECK: store i32 1, i32* [[CLEANUP_SLOT]], 201*e0ca4792SAlexey Bataev // CHECK: br label %[[DONE]] 202*e0ca4792SAlexey Bataev // CHECK: store i32 0, i32* [[CLEANUP_SLOT]], 203*e0ca4792SAlexey Bataev // CHECK: br label %[[DONE]] 204*e0ca4792SAlexey Bataev // CHECK: [[DONE]]: 205*e0ca4792SAlexey Bataev // CHECK: ret i32 0 206*e0ca4792SAlexey Bataev 20760e51c48SAlexey Bataev // CHECK-LABEL: @_ZN1SC2Ei 20860e51c48SAlexey Bataev struct S { 20960e51c48SAlexey Bataev int a; 21060e51c48SAlexey Bataev S(int c) { 21160e51c48SAlexey Bataev // CHECK: [[GTID:%.+]] = call i32 @__kmpc_global_thread_num(%struct.ident_t* [[DEFLOC:@.+]]) 21260e51c48SAlexey 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*)*)) 21360e51c48SAlexey Bataev // CHECK: [[TASK:%.+]] = bitcast i8* [[TASKV]] to [[TDP_TY]]* 21460e51c48SAlexey Bataev // CHECK: [[TASK_DATA:%.+]] = getelementptr inbounds [[TDP_TY]], [[TDP_TY]]* [[TASK]], i32 0, i32 0 21560e51c48SAlexey Bataev // CHECK: [[DOWN:%.+]] = getelementptr inbounds [[TD_TY:%.+]], [[TD_TY]]* [[TASK_DATA]], i32 0, i32 5 21660e51c48SAlexey Bataev // CHECK: store i64 0, i64* [[DOWN]], 21760e51c48SAlexey Bataev // CHECK: [[UP:%.+]] = getelementptr inbounds [[TD_TY]], [[TD_TY]]* [[TASK_DATA]], i32 0, i32 6 21860e51c48SAlexey Bataev // CHECK: store i64 %{{.+}}, i64* [[UP]], 21960e51c48SAlexey Bataev // CHECK: [[ST:%.+]] = getelementptr inbounds [[TD_TY]], [[TD_TY]]* [[TASK_DATA]], i32 0, i32 7 22060e51c48SAlexey Bataev // CHECK: store i64 1, i64* [[ST]], 22160e51c48SAlexey Bataev // CHECK: [[ST_VAL:%.+]] = load i64, i64* [[ST]], 22260e51c48SAlexey Bataev // CHECK: [[NUM_TASKS:%.+]] = zext i32 %{{.+}} to i64 22360e51c48SAlexey 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) 22460e51c48SAlexey Bataev #pragma omp master taskloop shared(c) num_tasks(a) 22560e51c48SAlexey Bataev for (a = 0; a < c; ++a) 22660e51c48SAlexey Bataev ; 22760e51c48SAlexey Bataev } 22860e51c48SAlexey Bataev } s(1); 22960e51c48SAlexey Bataev 23060e51c48SAlexey Bataev // CHECK: define internal i32 [[TASK4]]( 23160e51c48SAlexey Bataev // CHECK: [[DOWN:%.+]] = getelementptr inbounds [[TD_TY:%.+]], [[TD_TY]]* %{{.+}}, i32 0, i32 5 23260e51c48SAlexey Bataev // CHECK: [[DOWN_VAL:%.+]] = load i64, i64* [[DOWN]], 23360e51c48SAlexey Bataev // CHECK: [[UP:%.+]] = getelementptr inbounds [[TD_TY]], [[TD_TY]]* %{{.+}}, i32 0, i32 6 23460e51c48SAlexey Bataev // CHECK: [[UP_VAL:%.+]] = load i64, i64* [[UP]], 23560e51c48SAlexey Bataev // CHECK: [[ST:%.+]] = getelementptr inbounds [[TD_TY]], [[TD_TY]]* %{{.+}}, i32 0, i32 7 23660e51c48SAlexey Bataev // CHECK: [[ST_VAL:%.+]] = load i64, i64* [[ST]], 23760e51c48SAlexey Bataev // CHECK: [[LITER:%.+]] = getelementptr inbounds [[TD_TY]], [[TD_TY]]* %{{.+}}, i32 0, i32 8 23860e51c48SAlexey Bataev // CHECK: [[LITER_VAL:%.+]] = load i32, i32* [[LITER]], 23960e51c48SAlexey Bataev // CHECK: store i64 [[DOWN_VAL]], i64* [[LB:%[^,]+]], 24060e51c48SAlexey Bataev // CHECK: store i64 [[UP_VAL]], i64* [[UB:%[^,]+]], 24160e51c48SAlexey Bataev // CHECK: store i64 [[ST_VAL]], i64* [[ST:%[^,]+]], 24260e51c48SAlexey Bataev // CHECK: store i32 [[LITER_VAL]], i32* [[LITER:%[^,]+]], 24360e51c48SAlexey Bataev // CHECK: [[LB_VAL:%.+]] = load i64, i64* [[LB]], 24460e51c48SAlexey Bataev // CHECK: [[LB_I32:%.+]] = trunc i64 [[LB_VAL]] to i32 24560e51c48SAlexey Bataev // CHECK: store i32 [[LB_I32]], i32* [[CNT:%.+]], 24660e51c48SAlexey Bataev // CHECK: br label 24760e51c48SAlexey Bataev // CHECK: [[VAL:%.+]] = load i32, i32* [[CNT]], 24860e51c48SAlexey Bataev // CHECK: [[VAL_I64:%.+]] = sext i32 [[VAL]] to i64 24960e51c48SAlexey Bataev // CHECK: [[UB_VAL:%.+]] = load i64, i64* [[UB]], 25060e51c48SAlexey Bataev // CHECK: [[CMP:%.+]] = icmp ule i64 [[VAL_I64]], [[UB_VAL]] 25160e51c48SAlexey Bataev // CHECK: br i1 [[CMP]], label %{{.+}}, label %{{.+}} 25260e51c48SAlexey Bataev // CHECK: load i32, i32* % 25360e51c48SAlexey Bataev // CHECK: store i32 % 25460e51c48SAlexey Bataev // CHECK: load i32, i32* % 25560e51c48SAlexey Bataev // CHECK: add nsw i32 %{{.+}}, 1 25660e51c48SAlexey Bataev // CHECK: store i32 %{{.+}}, i32* % 25760e51c48SAlexey Bataev // CHECK: br label % 25860e51c48SAlexey Bataev // CHECK: ret i32 0 25960e51c48SAlexey Bataev 26060e51c48SAlexey Bataev #endif 261