|
| 1 | +// NOTE: Assertions have been autogenerated by utils/update_cc_test_checks.py UTC_ARGS: --include-generated-funcs --prefix-filecheck-ir-name _ --version 5 |
| 2 | +// RUN: %clang_cc1 -fopenmp -O1 -x c++ -triple x86_64-apple-darwin10 -emit-llvm %s -o - | FileCheck %s --check-prefix=CHECK |
| 3 | +// expected-no-diagnostics |
| 4 | +#ifndef HEADER |
| 5 | +#define HEADER |
| 6 | + |
| 7 | +int main(int argc, char **argv) { |
| 8 | +#pragma omp task |
| 9 | +#pragma omp master taskloop priority(argc) |
| 10 | + for (int i = 0; i < 10; ++i) |
| 11 | + ; |
| 12 | +#pragma omp master taskloop nogroup grainsize(strict:argc) |
| 13 | + for (int i = 0; i < 10; ++i) |
| 14 | + ; |
| 15 | + int i; |
| 16 | +#pragma omp master taskloop if(argc) shared(argc, argv) collapse(2) num_tasks(strict: 4) |
| 17 | + for (i = 0; i < argc; ++i) |
| 18 | + for (int j = argc; j < argv[argc][argc]; ++j) |
| 19 | + ; |
| 20 | +#pragma omp master taskloop |
| 21 | + for (int i = 0; i < 10; ++i) { |
| 22 | +#pragma omp cancel taskgroup |
| 23 | +#pragma omp cancellation point taskgroup |
| 24 | + } |
| 25 | +} |
| 26 | +struct S { |
| 27 | + int a; |
| 28 | + S(int c) { |
| 29 | +#pragma omp master taskloop shared(c) num_tasks(strict:a) |
| 30 | + for (a = 0; a < c; ++a) |
| 31 | + ; |
| 32 | + } |
| 33 | +} s(1); |
| 34 | + |
| 35 | +#endif |
| 36 | + |
| 37 | +// CHECK-LABEL: define noundef i32 @main( |
| 38 | +// CHECK-SAME: i32 noundef [[ARGC:%.*]], ptr noundef [[ARGV:%.*]]) local_unnamed_addr #[[ATTR0:[0-9]+]] { |
| 39 | +// CHECK-NEXT: [[ENTRY:.*:]] |
| 40 | +// CHECK-NEXT: [[ARGC_ADDR:%.*]] = alloca i32, align 4 |
| 41 | +// CHECK-NEXT: [[ARGV_ADDR:%.*]] = alloca ptr, align 8 |
| 42 | +// CHECK-NEXT: [[TMP0:%.*]] = tail call i32 @__kmpc_global_thread_num(ptr nonnull @[[GLOB1:[0-9]+]]) |
| 43 | +// CHECK-NEXT: store i32 [[ARGC]], ptr [[ARGC_ADDR]], align 4, !tbaa [[TBAA3:![0-9]+]] |
| 44 | +// CHECK-NEXT: store ptr [[ARGV]], ptr [[ARGV_ADDR]], align 8, !tbaa [[TBAA7:![0-9]+]] |
| 45 | +// CHECK-NEXT: [[TMP1:%.*]] = tail call ptr @__kmpc_omp_task_alloc(ptr nonnull @[[GLOB1]], i32 [[TMP0]], i32 1, i64 48, i64 1, ptr nonnull @.omp_task_entry..2) |
| 46 | +// CHECK-NEXT: [[TMP2:%.*]] = getelementptr inbounds nuw i8, ptr [[TMP1]], i64 40 |
| 47 | +// CHECK-NEXT: [[TMP3:%.*]] = load i32, ptr [[ARGC_ADDR]], align 4, !tbaa [[TBAA3]] |
| 48 | +// CHECK-NEXT: store i32 [[TMP3]], ptr [[TMP2]], align 8, !tbaa [[TBAA9:![0-9]+]] |
| 49 | +// CHECK-NEXT: [[TMP4:%.*]] = tail call i32 @__kmpc_omp_task(ptr nonnull @[[GLOB1]], i32 [[TMP0]], ptr [[TMP1]]) |
| 50 | +// CHECK-NEXT: [[TMP5:%.*]] = tail call i32 @__kmpc_master(ptr nonnull @[[GLOB1]], i32 [[TMP0]]) |
| 51 | +// CHECK-NEXT: [[DOTNOT:%.*]] = icmp eq i32 [[TMP5]], 0 |
| 52 | +// CHECK-NEXT: br i1 [[DOTNOT]], label %[[OMP_IF_END:.*]], label %[[OMP_IF_THEN:.*]] |
| 53 | +// CHECK: [[OMP_IF_THEN]]: |
| 54 | +// CHECK-NEXT: [[TMP6:%.*]] = load i32, ptr [[ARGC_ADDR]], align 4, !tbaa [[TBAA3]] |
| 55 | +// CHECK-NEXT: [[TMP7:%.*]] = tail call ptr @__kmpc_omp_task_alloc(ptr nonnull @[[GLOB1]], i32 [[TMP0]], i32 1, i64 80, i64 1, ptr nonnull @.omp_task_entry..4) |
| 56 | +// CHECK-NEXT: [[TMP8:%.*]] = getelementptr inbounds nuw i8, ptr [[TMP7]], i64 40 |
| 57 | +// CHECK-NEXT: store i64 0, ptr [[TMP8]], align 8, !tbaa [[TBAA13:![0-9]+]] |
| 58 | +// CHECK-NEXT: [[TMP9:%.*]] = getelementptr inbounds nuw i8, ptr [[TMP7]], i64 48 |
| 59 | +// CHECK-NEXT: store i64 9, ptr [[TMP9]], align 8, !tbaa [[TBAA13]] |
| 60 | +// CHECK-NEXT: [[TMP10:%.*]] = getelementptr inbounds nuw i8, ptr [[TMP7]], i64 56 |
| 61 | +// CHECK-NEXT: store i64 1, ptr [[TMP10]], align 8, !tbaa [[TBAA13]] |
| 62 | +// CHECK-NEXT: [[TMP11:%.*]] = getelementptr inbounds nuw i8, ptr [[TMP7]], i64 72 |
| 63 | +// CHECK-NEXT: store i64 0, ptr [[TMP11]], align 8 |
| 64 | +// CHECK-NEXT: [[TMP12:%.*]] = zext i32 [[TMP6]] to i64 |
| 65 | +// CHECK-NEXT: tail call void @__kmpc_taskloop_5(ptr nonnull @[[GLOB1]], i32 [[TMP0]], ptr [[TMP7]], i32 1, ptr nonnull [[TMP8]], ptr nonnull [[TMP9]], i64 1, i32 1, i32 1, i64 [[TMP12]], i32 1, ptr null) #[[ATTR1:[0-9]+]] |
| 66 | +// CHECK-NEXT: tail call void @__kmpc_end_master(ptr nonnull @[[GLOB1]], i32 [[TMP0]]) |
| 67 | +// CHECK-NEXT: br label %[[OMP_IF_END]] |
| 68 | +// CHECK: [[OMP_IF_END]]: |
| 69 | +// CHECK-NEXT: [[TMP13:%.*]] = tail call i32 @__kmpc_master(ptr nonnull @[[GLOB1]], i32 [[TMP0]]) |
| 70 | +// CHECK-NEXT: [[DOTNOT22:%.*]] = icmp eq i32 [[TMP13]], 0 |
| 71 | +// CHECK-NEXT: br i1 [[DOTNOT22]], label %[[OMP_IF_END17:.*]], label %[[OMP_IF_THEN2:.*]] |
| 72 | +// CHECK: [[OMP_IF_THEN2]]: |
| 73 | +// CHECK-NEXT: tail call void @__kmpc_taskgroup(ptr nonnull @[[GLOB1]], i32 [[TMP0]]) |
| 74 | +// CHECK-NEXT: [[TMP14:%.*]] = load i32, ptr [[ARGC_ADDR]], align 4, !tbaa [[TBAA3]] |
| 75 | +// CHECK-NEXT: [[TMP15:%.*]] = load ptr, ptr [[ARGV_ADDR]], align 8, !tbaa [[TBAA7]] |
| 76 | +// CHECK-NEXT: [[IDXPROM:%.*]] = sext i32 [[TMP14]] to i64 |
| 77 | +// CHECK-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds ptr, ptr [[TMP15]], i64 [[IDXPROM]] |
| 78 | +// CHECK-NEXT: [[TMP16:%.*]] = load ptr, ptr [[ARRAYIDX]], align 8, !tbaa [[TBAA7]] |
| 79 | +// CHECK-NEXT: [[ARRAYIDX9:%.*]] = getelementptr inbounds i8, ptr [[TMP16]], i64 [[IDXPROM]] |
| 80 | +// CHECK-NEXT: [[TMP17:%.*]] = load i8, ptr [[ARRAYIDX9]], align 1, !tbaa [[TBAA15:![0-9]+]] |
| 81 | +// CHECK-NEXT: [[CONV:%.*]] = sext i8 [[TMP17]] to i32 |
| 82 | +// CHECK-NEXT: [[SUB12:%.*]] = sub i32 [[CONV]], [[TMP14]] |
| 83 | +// CHECK-NEXT: [[CONV15:%.*]] = zext i32 [[SUB12]] to i64 |
| 84 | +// CHECK-NEXT: [[MUL:%.*]] = mul nsw i64 [[CONV15]], [[IDXPROM]] |
| 85 | +// CHECK-NEXT: [[SUB16:%.*]] = add nsw i64 [[MUL]], -1 |
| 86 | +// CHECK-NEXT: [[TMP18:%.*]] = tail call ptr @__kmpc_omp_task_alloc(ptr nonnull @[[GLOB1]], i32 [[TMP0]], i32 1, i64 80, i64 16, ptr nonnull @.omp_task_entry..6) |
| 87 | +// CHECK-NEXT: [[TMP19:%.*]] = load ptr, ptr [[TMP18]], align 8, !tbaa [[TBAA16:![0-9]+]] |
| 88 | +// CHECK-NEXT: store ptr [[ARGC_ADDR]], ptr [[TMP19]], align 8, !tbaa [[TBAA7]] |
| 89 | +// CHECK-NEXT: [[AGG_CAPTURED3_SROA_2_0__SROA_IDX:%.*]] = getelementptr inbounds i8, ptr [[TMP19]], i64 8 |
| 90 | +// CHECK-NEXT: store ptr [[ARGV_ADDR]], ptr [[AGG_CAPTURED3_SROA_2_0__SROA_IDX]], align 8, !tbaa [[TBAA7]] |
| 91 | +// CHECK-NEXT: [[TMP20:%.*]] = load i32, ptr [[ARGC_ADDR]], align 4, !tbaa [[TBAA3]] |
| 92 | +// CHECK-NEXT: [[TOBOOL:%.*]] = icmp ne i32 [[TMP20]], 0 |
| 93 | +// CHECK-NEXT: [[TMP21:%.*]] = sext i1 [[TOBOOL]] to i32 |
| 94 | +// CHECK-NEXT: [[TMP22:%.*]] = getelementptr inbounds nuw i8, ptr [[TMP18]], i64 40 |
| 95 | +// CHECK-NEXT: store i64 0, ptr [[TMP22]], align 8, !tbaa [[TBAA13]] |
| 96 | +// CHECK-NEXT: [[TMP23:%.*]] = getelementptr inbounds nuw i8, ptr [[TMP18]], i64 48 |
| 97 | +// CHECK-NEXT: store i64 [[SUB16]], ptr [[TMP23]], align 8, !tbaa [[TBAA13]] |
| 98 | +// CHECK-NEXT: [[TMP24:%.*]] = getelementptr inbounds nuw i8, ptr [[TMP18]], i64 56 |
| 99 | +// CHECK-NEXT: store i64 1, ptr [[TMP24]], align 8, !tbaa [[TBAA13]] |
| 100 | +// CHECK-NEXT: [[TMP25:%.*]] = getelementptr inbounds nuw i8, ptr [[TMP18]], i64 72 |
| 101 | +// CHECK-NEXT: store i64 0, ptr [[TMP25]], align 8 |
| 102 | +// CHECK-NEXT: call void @__kmpc_taskloop_5(ptr nonnull @[[GLOB1]], i32 [[TMP0]], ptr nonnull [[TMP18]], i32 [[TMP21]], ptr nonnull [[TMP22]], ptr nonnull [[TMP23]], i64 1, i32 1, i32 2, i64 4, i32 1, ptr null) #[[ATTR1]] |
| 103 | +// CHECK-NEXT: call void @__kmpc_end_taskgroup(ptr nonnull @[[GLOB1]], i32 [[TMP0]]) |
| 104 | +// CHECK-NEXT: call void @__kmpc_end_master(ptr nonnull @[[GLOB1]], i32 [[TMP0]]) |
| 105 | +// CHECK-NEXT: br label %[[OMP_IF_END17]] |
| 106 | +// CHECK: [[OMP_IF_END17]]: |
| 107 | +// CHECK-NEXT: [[TMP26:%.*]] = call i32 @__kmpc_master(ptr nonnull @[[GLOB1]], i32 [[TMP0]]) |
| 108 | +// CHECK-NEXT: [[DOTNOT23:%.*]] = icmp eq i32 [[TMP26]], 0 |
| 109 | +// CHECK-NEXT: br i1 [[DOTNOT23]], label %[[OMP_IF_END21:.*]], label %[[OMP_IF_THEN18:.*]] |
| 110 | +// CHECK: [[OMP_IF_THEN18]]: |
| 111 | +// CHECK-NEXT: call void @__kmpc_taskgroup(ptr nonnull @[[GLOB1]], i32 [[TMP0]]) |
| 112 | +// CHECK-NEXT: [[TMP27:%.*]] = call ptr @__kmpc_omp_task_alloc(ptr nonnull @[[GLOB1]], i32 [[TMP0]], i32 1, i64 80, i64 1, ptr nonnull @.omp_task_entry..8) |
| 113 | +// CHECK-NEXT: [[TMP28:%.*]] = getelementptr inbounds nuw i8, ptr [[TMP27]], i64 40 |
| 114 | +// CHECK-NEXT: store i64 0, ptr [[TMP28]], align 8, !tbaa [[TBAA13]] |
| 115 | +// CHECK-NEXT: [[TMP29:%.*]] = getelementptr inbounds nuw i8, ptr [[TMP27]], i64 48 |
| 116 | +// CHECK-NEXT: store i64 9, ptr [[TMP29]], align 8, !tbaa [[TBAA13]] |
| 117 | +// CHECK-NEXT: [[TMP30:%.*]] = getelementptr inbounds nuw i8, ptr [[TMP27]], i64 56 |
| 118 | +// CHECK-NEXT: store i64 1, ptr [[TMP30]], align 8, !tbaa [[TBAA13]] |
| 119 | +// CHECK-NEXT: [[TMP31:%.*]] = getelementptr inbounds nuw i8, ptr [[TMP27]], i64 72 |
| 120 | +// CHECK-NEXT: store i64 0, ptr [[TMP31]], align 8 |
| 121 | +// CHECK-NEXT: call void @__kmpc_taskloop(ptr nonnull @[[GLOB1]], i32 [[TMP0]], ptr [[TMP27]], i32 1, ptr nonnull [[TMP28]], ptr nonnull [[TMP29]], i64 1, i32 1, i32 0, i64 0, ptr null) |
| 122 | +// CHECK-NEXT: call void @__kmpc_end_taskgroup(ptr nonnull @[[GLOB1]], i32 [[TMP0]]) |
| 123 | +// CHECK-NEXT: call void @__kmpc_end_master(ptr nonnull @[[GLOB1]], i32 [[TMP0]]) |
| 124 | +// CHECK-NEXT: br label %[[OMP_IF_END21]] |
| 125 | +// CHECK: [[OMP_IF_END21]]: |
| 126 | +// CHECK-NEXT: ret i32 0 |
| 127 | +// |
| 128 | +// |
| 129 | +// |
| 130 | +// CHECK-LABEL: define linkonce_odr void @_ZN1SC2Ei( |
| 131 | +// CHECK-SAME: ptr noundef nonnull align 4 dereferenceable(4) [[THIS:%.*]], i32 noundef [[C:%.*]]) unnamed_addr #[[ATTR6:[0-9]+]] align 2 { |
| 132 | +// CHECK-NEXT: [[ENTRY:.*:]] |
| 133 | +// CHECK-NEXT: [[C_ADDR:%.*]] = alloca i32, align 4 |
| 134 | +// CHECK-NEXT: [[TMP0:%.*]] = tail call i32 @__kmpc_global_thread_num(ptr nonnull @[[GLOB1]]) |
| 135 | +// CHECK-NEXT: store i32 [[C]], ptr [[C_ADDR]], align 4, !tbaa [[TBAA3]] |
| 136 | +// CHECK-NEXT: [[TMP1:%.*]] = tail call i32 @__kmpc_master(ptr nonnull @[[GLOB1]], i32 [[TMP0]]) |
| 137 | +// CHECK-NEXT: [[DOTNOT:%.*]] = icmp eq i32 [[TMP1]], 0 |
| 138 | +// CHECK-NEXT: br i1 [[DOTNOT]], label %[[OMP_IF_END:.*]], label %[[OMP_IF_THEN:.*]] |
| 139 | +// CHECK: [[OMP_IF_THEN]]: |
| 140 | +// CHECK-NEXT: [[TMP2:%.*]] = load i32, ptr [[THIS]], align 4, !tbaa [[TBAA27:![0-9]+]] |
| 141 | +// CHECK-NEXT: tail call void @__kmpc_taskgroup(ptr nonnull @[[GLOB1]], i32 [[TMP0]]) |
| 142 | +// CHECK-NEXT: [[TMP3:%.*]] = load i32, ptr [[C_ADDR]], align 4, !tbaa [[TBAA3]] |
| 143 | +// CHECK-NEXT: [[SUB4:%.*]] = add nsw i32 [[TMP3]], -1 |
| 144 | +// CHECK-NEXT: [[TMP4:%.*]] = tail call ptr @__kmpc_omp_task_alloc(ptr nonnull @[[GLOB1]], i32 [[TMP0]], i32 1, i64 80, i64 16, ptr nonnull @.omp_task_entry..10) |
| 145 | +// CHECK-NEXT: [[TMP5:%.*]] = load ptr, ptr [[TMP4]], align 8, !tbaa [[TBAA16]] |
| 146 | +// CHECK-NEXT: store ptr [[THIS]], ptr [[TMP5]], align 8, !tbaa [[TBAA7]] |
| 147 | +// CHECK-NEXT: [[AGG_CAPTURED_SROA_2_0__SROA_IDX:%.*]] = getelementptr inbounds i8, ptr [[TMP5]], i64 8 |
| 148 | +// CHECK-NEXT: store ptr [[C_ADDR]], ptr [[AGG_CAPTURED_SROA_2_0__SROA_IDX]], align 8, !tbaa [[TBAA7]] |
| 149 | +// CHECK-NEXT: [[TMP6:%.*]] = getelementptr inbounds nuw i8, ptr [[TMP4]], i64 40 |
| 150 | +// CHECK-NEXT: store i64 0, ptr [[TMP6]], align 8, !tbaa [[TBAA13]] |
| 151 | +// CHECK-NEXT: [[TMP7:%.*]] = getelementptr inbounds nuw i8, ptr [[TMP4]], i64 48 |
| 152 | +// CHECK-NEXT: [[CONV:%.*]] = sext i32 [[SUB4]] to i64 |
| 153 | +// CHECK-NEXT: store i64 [[CONV]], ptr [[TMP7]], align 8, !tbaa [[TBAA13]] |
| 154 | +// CHECK-NEXT: [[TMP8:%.*]] = getelementptr inbounds nuw i8, ptr [[TMP4]], i64 56 |
| 155 | +// CHECK-NEXT: store i64 1, ptr [[TMP8]], align 8, !tbaa [[TBAA13]] |
| 156 | +// CHECK-NEXT: [[TMP9:%.*]] = getelementptr inbounds nuw i8, ptr [[TMP4]], i64 72 |
| 157 | +// CHECK-NEXT: store i64 0, ptr [[TMP9]], align 8 |
| 158 | +// CHECK-NEXT: [[TMP10:%.*]] = zext i32 [[TMP2]] to i64 |
| 159 | +// CHECK-NEXT: call void @__kmpc_taskloop_5(ptr nonnull @[[GLOB1]], i32 [[TMP0]], ptr nonnull [[TMP4]], i32 1, ptr nonnull [[TMP6]], ptr nonnull [[TMP7]], i64 1, i32 1, i32 2, i64 [[TMP10]], i32 1, ptr null) #[[ATTR1]] |
| 160 | +// CHECK-NEXT: call void @__kmpc_end_taskgroup(ptr nonnull @[[GLOB1]], i32 [[TMP0]]) |
| 161 | +// CHECK-NEXT: call void @__kmpc_end_master(ptr nonnull @[[GLOB1]], i32 [[TMP0]]) |
| 162 | +// CHECK-NEXT: br label %[[OMP_IF_END]] |
| 163 | +// CHECK: [[OMP_IF_END]]: |
| 164 | +// CHECK-NEXT: ret void |
| 165 | + |
0 commit comments