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