Home | History | Annotate | Download | only in OpenMP
      1 // RUN: %clang_cc1 -verify -fopenmp -x c++ -triple x86_64-apple-darwin10 -emit-llvm %s -o - | FileCheck %s
      2 // RUN: %clang_cc1 -fopenmp -x c++ -std=c++11 -triple x86_64-apple-darwin10 -emit-pch -o %t %s
      3 // RUN: %clang_cc1 -fopenmp -x c++ -triple x86_64-apple-darwin10 -std=c++11 -include-pch %t -verify %s -emit-llvm -o - | FileCheck %s
      4 // REQUIRES: x86-registered-target
      5 // expected-no-diagnostics
      6 #ifndef HEADER
      7 #define HEADER
      8 
      9 void fn1();
     10 void fn2();
     11 void fn3();
     12 void fn4();
     13 void fn5();
     14 void fn6();
     15 void fn7();
     16 void fn8();
     17 void fn9();
     18 void fn10();
     19 
     20 int Arg;
     21 
     22 // CHECK-LABEL: define void @{{.+}}gtid_test
     23 void gtid_test() {
     24 // CHECK:  call void {{.+}} @__kmpc_fork_call(%{{.+}}* @{{.+}}, i{{.+}} 0, {{.+}}* [[GTID_TEST_REGION1:@.+]] to void
     25 #pragma omp parallel
     26 #pragma omp task if (task: false)
     27   gtid_test();
     28 // CHECK: ret void
     29 }
     30 
     31 // CHECK: define internal void [[GTID_TEST_REGION1]](i32* noalias [[GTID_PARAM:%.+]], i
     32 // CHECK: store i32* [[GTID_PARAM]], i32** [[GTID_ADDR_REF:%.+]],
     33 // CHECK: [[GTID_ADDR:%.+]] = load i32*, i32** [[GTID_ADDR_REF]]
     34 // CHECK: [[GTID:%.+]] = load i32, i32* [[GTID_ADDR]]
     35 // CHECK: [[ORIG_TASK_PTR:%.+]] = call i8* @__kmpc_omp_task_alloc(
     36 // CHECK: [[TASK_PTR:%.+]] = bitcast i8* [[ORIG_TASK_PTR]] to
     37 // CHECK: call void @__kmpc_omp_task_begin_if0(%{{.+}}* @{{.+}}, i{{.+}} [[GTID]], i8* [[ORIG_TASK_PTR]])
     38 // CHECK: call i32 [[GTID_TEST_REGION2:@.+]](i32 [[GTID]], %{{.+}}* [[TASK_PTR]])
     39 // CHECK: call void @__kmpc_omp_task_complete_if0(%{{.+}}* @{{.+}}, i{{.+}} [[GTID]], i8* [[ORIG_TASK_PTR]])
     40 // CHECK: ret void
     41 
     42 // CHECK: define internal i32 [[GTID_TEST_REGION2]](
     43 // CHECK: call void @{{.+}}gtid_test
     44 // CHECK: ret i32
     45 
     46 template <typename T>
     47 int tmain(T Arg) {
     48 #pragma omp task if (task: true)
     49   fn1();
     50 #pragma omp task if (false)
     51   fn2();
     52 #pragma omp task if (Arg)
     53   fn3();
     54 #pragma omp task if (task: Arg) depend(in : Arg)
     55   fn4();
     56 #pragma omp task if (Arg) depend(out : Arg)
     57   fn5();
     58 #pragma omp task if (Arg) depend(inout : Arg)
     59   fn6();
     60   return 0;
     61 }
     62 
     63 // CHECK-LABEL: @main
     64 int main() {
     65 // CHECK: [[GTID:%.+]] = call i32 @__kmpc_global_thread_num(
     66 // CHECK: [[ORIG_TASK_PTR:%.+]] = call i8* @__kmpc_omp_task_alloc({{[^,]+}}, i32 [[GTID]], i32 1, i64 40, i64 1, i32 (i32, i8*)* bitcast (i32 (i32, %{{[^*]+}}*)* [[CAP_FN7:[^ ]+]] to i32 (i32, i8*)*))
     67 // CHECK: call i32 @__kmpc_omp_task(%{{.+}}* @{{.+}}, i32 [[GTID]], i8* [[ORIG_TASK_PTR]])
     68 #pragma omp task if (true)
     69   fn7();
     70 // CHECK: [[ORIG_TASK_PTR:%.+]] = call i8* @__kmpc_omp_task_alloc({{[^,]+}}, i32 [[GTID]], i32 1, i64 40, i64 1, i32 (i32, i8*)* bitcast (i32 (i32, %{{[^*]+}}*)* [[CAP_FN8:[^ ]+]] to i32 (i32, i8*)*))
     71 // CHECK: [[TASK_PTR:%.+]] = bitcast i8* [[ORIG_TASK_PTR]] to
     72 // CHECK: call void @__kmpc_omp_task_begin_if0(%{{.+}}* @{{.+}}, i{{.+}} [[GTID]], i8* [[ORIG_TASK_PTR]])
     73 // CHECK: call i32 [[CAP_FN8]](i32 [[GTID]], %{{.+}}* [[TASK_PTR]])
     74 // CHECK: call void @__kmpc_omp_task_complete_if0(%{{.+}}* @{{.+}}, i{{.+}} [[GTID]], i8* [[ORIG_TASK_PTR]])
     75 #pragma omp task if (false)
     76   fn8();
     77 
     78 // CHECK: [[ORIG_TASK_PTR:%.+]] = call i8* @__kmpc_omp_task_alloc({{[^,]+}}, i32 [[GTID]], i32 1, i64 40, i64 1, i32 (i32, i8*)* bitcast (i32 (i32, %{{[^*]+}}*)* [[CAP_FN9:[^ ]+]] to i32 (i32, i8*)*))
     79 // CHECK: [[TASK_PTR:%.+]] = bitcast i8* [[ORIG_TASK_PTR]] to
     80 // CHECK: br i1 %{{.+}}, label %[[OMP_THEN:.+]], label %[[OMP_ELSE:.+]]
     81 // CHECK: [[OMP_THEN]]
     82 // CHECK: call i32 @__kmpc_omp_task(%{{.+}}* @{{.+}}, i32 [[GTID]], i8* [[ORIG_TASK_PTR]])
     83 // CHECK: br label %[[OMP_END:.+]]
     84 // CHECK: [[OMP_ELSE]]
     85 // CHECK: call void @__kmpc_omp_task_begin_if0(%{{.+}}* @{{.+}}, i{{.+}} [[GTID]], i8* [[ORIG_TASK_PTR]])
     86 // CHECK: call i32 [[CAP_FN9]](i32 [[GTID]], %{{.+}}* [[TASK_PTR]])
     87 // CHECK: call void @__kmpc_omp_task_complete_if0(%{{.+}}* @{{.+}}, i{{.+}} [[GTID]], i8* [[ORIG_TASK_PTR]])
     88 // CHECK: br label %[[OMP_END]]
     89 // CHECK: [[OMP_END]]
     90 #pragma omp task if (Arg)
     91   fn9();
     92 // CHECK: [[ORIG_TASK_PTR:%.+]] = call i8* @__kmpc_omp_task_alloc({{[^,]+}}, i32 [[GTID]], i32 1, i64 40, i64 1, i32 (i32, i8*)* bitcast (i32 (i32, %{{[^*]+}}*)* [[CAP_FN10:[^ ]+]] to i32 (i32, i8*)*))
     93 // CHECK: [[TASK_PTR:%.+]] = bitcast i8* [[ORIG_TASK_PTR]] to
     94 // CHECK: br i1 %{{.+}}, label %[[OMP_THEN:.+]], label %[[OMP_ELSE:.+]]
     95 // CHECK: [[OMP_THEN]]
     96 // CHECK: call i32 @__kmpc_omp_task_with_deps(%{{.+}}* @{{.+}}, i32 [[GTID]], i8* [[ORIG_TASK_PTR]], i32 1, i8* [[LIST:%[^,]+]], i32 0, i8* null)
     97 // CHECK: br label %[[OMP_END:.+]]
     98 // CHECK: [[OMP_ELSE]]
     99 // CHECK: call void @__kmpc_omp_wait_deps(%{{.+}}* @{{.+}}, i32 [[GTID]], i32 1, i8* [[LIST]], i32 0, i8* null)
    100 // CHECK: call void @__kmpc_omp_task_begin_if0(%{{.+}}* @{{.+}}, i{{.+}} [[GTID]], i8* [[ORIG_TASK_PTR]])
    101 // CHECK: call i32 [[CAP_FN10]](i32 [[GTID]], %{{.+}}* [[TASK_PTR]])
    102 // CHECK: call void @__kmpc_omp_task_complete_if0(%{{.+}}* @{{.+}}, i{{.+}} [[GTID]], i8* [[ORIG_TASK_PTR]])
    103 // CHECK: br label %[[OMP_END]]
    104 // CHECK: [[OMP_END]]
    105 #pragma omp task if (Arg) depend(inout : Arg)
    106   fn10();
    107   // CHECK: = call {{.*}}i{{.+}} @{{.+}}tmain
    108   return tmain(Arg);
    109 }
    110 
    111 // CHECK: define internal i32 [[CAP_FN7]]
    112 // CHECK: call void @{{.+}}fn7
    113 // CHECK: ret i32
    114 
    115 // CHECK: define internal i32 [[CAP_FN8]]
    116 // CHECK: call void @{{.+}}fn8
    117 // CHECK: ret i32
    118 
    119 // CHECK: define internal i32 [[CAP_FN9]]
    120 // CHECK: call void @{{.+}}fn9
    121 // CHECK: ret i32
    122 
    123 // CHECK: define internal i32 [[CAP_FN10]]
    124 // CHECK: call void @{{.+}}fn10
    125 // CHECK: ret i32
    126 
    127 // CHECK-LABEL: define {{.+}} @{{.+}}tmain
    128 // CHECK: [[GTID:%.+]] = call i32 @__kmpc_global_thread_num(
    129 // CHECK: [[ORIG_TASK_PTR:%.+]] = call i8* @__kmpc_omp_task_alloc(%{{[^,]+}}, i32 [[GTID]], i32 1, i64 40, i64 1, i32 (i32, i8*)* bitcast (i32 (i32,  %{{[^*]+}}*)* [[CAP_FN1:[^ ]+]] to i32 (i32, i8*)*))
    130 // CHECK: call i32 @__kmpc_omp_task(%{{.+}}* @{{.+}}, i32 [[GTID]], i8* [[ORIG_TASK_PTR]])
    131 
    132 // CHECK: [[ORIG_TASK_PTR:%.+]] = call i8* @__kmpc_omp_task_alloc(
    133 // CHECK: [[TASK_PTR:%.+]] = bitcast i8* [[ORIG_TASK_PTR]] to
    134 // CHECK: call void @__kmpc_omp_task_begin_if0(%{{.+}}* @{{.+}}, i{{.+}} [[GTID]], i8* [[ORIG_TASK_PTR]])
    135 // CHECK: call i32 [[CAP_FN2:@.+]](i32 [[GTID]], %{{.+}}* [[TASK_PTR]])
    136 // CHECK: call void @__kmpc_omp_task_complete_if0(%{{.+}}* @{{.+}}, i{{.+}} [[GTID]], i8* [[ORIG_TASK_PTR]])
    137 
    138 // CHECK: [[ORIG_TASK_PTR:%.+]] = call i8* @__kmpc_omp_task_alloc(%{{[^,]+}}, i32 [[GTID]], i32 1, i64 40, i64 1, i32 (i32, i8*)* bitcast (i32 (i32, %{{[^*]+}}*)* [[CAP_FN3:[^ ]+]] to i32 (i32, i8*)*))
    139 // CHECK: [[TASK_PTR:%.+]] = bitcast i8* [[ORIG_TASK_PTR]] to
    140 // CHECK: br i1 %{{.+}}, label %[[OMP_THEN:.+]], label %[[OMP_ELSE:.+]]
    141 // CHECK: [[OMP_THEN]]
    142 // CHECK: call i32 @__kmpc_omp_task(%{{.+}}* @{{.+}}, i32 [[GTID]], i8* [[ORIG_TASK_PTR]])
    143 // CHECK: br label %[[OMP_END:.+]]
    144 // CHECK: [[OMP_ELSE]]
    145 // CHECK: call void @__kmpc_omp_task_begin_if0(%{{.+}}* @{{.+}}, i{{.+}} [[GTID]], i8* [[ORIG_TASK_PTR]])
    146 // CHECK: call i32 [[CAP_FN3]](i32 [[GTID]], %{{.+}}* [[TASK_PTR]])
    147 // CHECK: call void @__kmpc_omp_task_complete_if0(%{{.+}}* @{{.+}}, i{{.+}} [[GTID]], i8* [[ORIG_TASK_PTR]])
    148 // CHECK: br label %[[OMP_END]]
    149 // CHECK: [[OMP_END]]
    150 
    151 // CHECK: [[ORIG_TASK_PTR:%.+]] = call i8* @__kmpc_omp_task_alloc(%{{[^,]+}}, i32 [[GTID]], i32 1, i64 40, i64 1, i32 (i32, i8*)* bitcast (i32 (i32, %{{[^*]+}}*)* [[CAP_FN4:[^ ]+]] to i32 (i32, i8*)*))
    152 // CHECK: [[TASK_PTR:%.+]] = bitcast i8* [[ORIG_TASK_PTR]] to
    153 // CHECK: br i1 %{{.+}}, label %[[OMP_THEN:.+]], label %[[OMP_ELSE:.+]]
    154 // CHECK: [[OMP_THEN]]
    155 // CHECK: call i32 @__kmpc_omp_task_with_deps(%{{.+}}* @{{.+}}, i32 [[GTID]], i8* [[ORIG_TASK_PTR]], i32 1, i8* [[LIST:%.+]], i32 0, i8* null)
    156 // CHECK: br label %[[OMP_END:.+]]
    157 // CHECK: [[OMP_ELSE]]
    158 // CHECK: call void @__kmpc_omp_wait_deps(%{{.+}}* @{{.+}}, i32 [[GTID]], i32 1, i8* [[LIST]], i32 0, i8* null)
    159 // CHECK: call void @__kmpc_omp_task_begin_if0(%{{.+}}* @{{.+}}, i{{.+}} [[GTID]], i8* [[ORIG_TASK_PTR]])
    160 // CHECK: call i32 [[CAP_FN4]](i32 [[GTID]], %{{.+}}* [[TASK_PTR]])
    161 // CHECK: call void @__kmpc_omp_task_complete_if0(%{{.+}}* @{{.+}}, i{{.+}} [[GTID]], i8* [[ORIG_TASK_PTR]])
    162 // CHECK: br label %[[OMP_END]]
    163 // CHECK: [[OMP_END]]
    164 
    165 // CHECK: [[ORIG_TASK_PTR:%.+]] = call i8* @__kmpc_omp_task_alloc(%{{[^,]+}}, i32 [[GTID]], i32 1, i64 40, i64 1, i32 (i32, i8*)* bitcast (i32 (i32, %{{[^*]+}}*)* [[CAP_FN5:[^ ]+]] to i32 (i32, i8*)*))
    166 // CHECK: [[TASK_PTR:%.+]] = bitcast i8* [[ORIG_TASK_PTR]] to
    167 // CHECK: br i1 %{{.+}}, label %[[OMP_THEN:.+]], label %[[OMP_ELSE:.+]]
    168 // CHECK: [[OMP_THEN]]
    169 // CHECK: call i32 @__kmpc_omp_task_with_deps(%{{.+}}* @{{.+}}, i32 [[GTID]], i8* [[ORIG_TASK_PTR]], i32 1, i8* [[LIST:%.+]], i32 0, i8* null)
    170 // CHECK: br label %[[OMP_END:.+]]
    171 // CHECK: [[OMP_ELSE]]
    172 // CHECK: call void @__kmpc_omp_wait_deps(%{{.+}}* @{{.+}}, i32 [[GTID]], i32 1, i8* [[LIST]], i32 0, i8* null)
    173 // CHECK: call void @__kmpc_omp_task_begin_if0(%{{.+}}* @{{.+}}, i{{.+}} [[GTID]], i8* [[ORIG_TASK_PTR]])
    174 // CHECK: call i32 [[CAP_FN5]](i32 [[GTID]], %{{.+}}* [[TASK_PTR]])
    175 // CHECK: call void @__kmpc_omp_task_complete_if0(%{{.+}}* @{{.+}}, i{{.+}} [[GTID]], i8* [[ORIG_TASK_PTR]])
    176 // CHECK: br label %[[OMP_END]]
    177 // CHECK: [[OMP_END]]
    178 
    179 // CHECK: [[ORIG_TASK_PTR:%.+]] = call i8* @__kmpc_omp_task_alloc(%{{[^,]+}}, i32 [[GTID]], i32 1, i64 40, i64 1, i32 (i32, i8*)* bitcast (i32 (i32, %{{[^*]+}}*)* [[CAP_FN6:[^ ]+]] to i32 (i32, i8*)*))
    180 // CHECK: [[TASK_PTR:%.+]] = bitcast i8* [[ORIG_TASK_PTR]] to
    181 // CHECK: br i1 %{{.+}}, label %[[OMP_THEN:.+]], label %[[OMP_ELSE:.+]]
    182 // CHECK: [[OMP_THEN]]
    183 // CHECK: call i32 @__kmpc_omp_task_with_deps(%{{.+}}* @{{.+}}, i32 [[GTID]], i8* [[ORIG_TASK_PTR]], i32 1, i8* [[LIST:%.+]], i32 0, i8* null)
    184 // CHECK: br label %[[OMP_END:.+]]
    185 // CHECK: [[OMP_ELSE]]
    186 // CHECK: call void @__kmpc_omp_wait_deps(%{{.+}}* @{{.+}}, i32 [[GTID]], i32 1, i8* [[LIST]], i32 0, i8* null)
    187 // CHECK: call void @__kmpc_omp_task_begin_if0(%{{.+}}* @{{.+}}, i{{.+}} [[GTID]], i8* [[ORIG_TASK_PTR]])
    188 // CHECK: call i32 [[CAP_FN6]](i32 [[GTID]], %{{.+}}* [[TASK_PTR]])
    189 // CHECK: call void @__kmpc_omp_task_complete_if0(%{{.+}}* @{{.+}}, i{{.+}} [[GTID]], i8* [[ORIG_TASK_PTR]])
    190 // CHECK: br label %[[OMP_END]]
    191 // CHECK: [[OMP_END]]
    192 
    193 // CHECK: define internal i32 [[CAP_FN1]]
    194 // CHECK: call void @{{.+}}fn1
    195 // CHECK: ret i32
    196 
    197 // CHECK: define internal i32 [[CAP_FN2]]
    198 // CHECK: call void @{{.+}}fn2
    199 // CHECK: ret i32
    200 
    201 // CHECK: define internal i32 [[CAP_FN3]]
    202 // CHECK: call void @{{.+}}fn3
    203 // CHECK: ret i32
    204 
    205 // CHECK: define internal i32 [[CAP_FN4]]
    206 // CHECK: call void @{{.+}}fn4
    207 // CHECK: ret i32
    208 
    209 // CHECK: define internal i32 [[CAP_FN5]]
    210 // CHECK: call void @{{.+}}fn5
    211 // CHECK: ret i32
    212 
    213 // CHECK: define internal i32 [[CAP_FN6]]
    214 // CHECK: call void @{{.+}}fn6
    215 // CHECK: ret i32
    216 
    217 #endif
    218