blob: 2db06740d3e438b09699164622f33fd6a0cd4e68 [file] [log] [blame]
Stephen Hines176edba2014-12-01 14:53:08 -08001// RUN: %clang_cc1 -verify -fopenmp=libiomp5 -x c++ -triple x86_64-unknown-unknown -emit-llvm %s -o - | FileCheck %s
2// RUN: %clang_cc1 -fopenmp=libiomp5 -x c++ -std=c++11 -triple x86_64-unknown-unknown -emit-pch -o %t %s
3// RUN: %clang_cc1 -fopenmp=libiomp5 -x c++ -triple x86_64-unknown-unknown -std=c++11 -include-pch %t -verify %s -emit-llvm -o - | FileCheck %s
4// expected-no-diagnostics
5#ifndef HEADER
6#define HEADER
7
8template <class T>
9struct S {
10 T f;
11 S(T a) : f(a) {}
12 S() : f() {}
13 operator T() { return T(); }
14 ~S() {}
15};
16
17// CHECK: [[S_FLOAT_TY:%.+]] = type { float }
18// CHECK: [[CAP_MAIN_TY:%.+]] = type { [2 x i{{[0-9]+}}]*, i{{[0-9]+}}*, [2 x [[S_FLOAT_TY]]]*, [[S_FLOAT_TY]]* }
19// CHECK: [[S_INT_TY:%.+]] = type { i{{[0-9]+}} }
20// CHECK: [[CAP_TMAIN_TY:%.+]] = type { [2 x i{{[0-9]+}}]*, i{{[0-9]+}}*, [2 x [[S_INT_TY]]]*, [[S_INT_TY]]* }
21// CHECK: [[IMPLICIT_BARRIER_LOC:@.+]] = private unnamed_addr constant %{{.+}} { i32 0, i32 66, i32 0, i32 0, i8*
22template <typename T>
23T tmain() {
24 S<T> test;
25 T t_var;
26 T vec[] = {1, 2};
27 S<T> s_arr[] = {1, 2};
28 S<T> var(3);
29#pragma omp parallel private(t_var, vec, s_arr, var)
30 {
31 vec[0] = t_var;
32 s_arr[0] = var;
33 }
34 return T();
35}
36
37int main() {
38 S<float> test;
39 int t_var;
40 int vec[] = {1, 2};
41 S<float> s_arr[] = {1, 2};
42 S<float> var(3);
43#pragma omp parallel private(t_var, vec, s_arr, var)
44 {
45 vec[0] = t_var;
46 s_arr[0] = var;
47 }
48 return tmain<int>();
49}
50
51// CHECK: define i{{[0-9]+}} @main()
52// CHECK: [[TEST:%.+]] = alloca [[S_FLOAT_TY]],
53// CHECK: call {{.*}} [[S_FLOAT_TY_DEF_CONSTR:@.+]]([[S_FLOAT_TY]]* [[TEST]])
54// CHECK: %{{.+}} = bitcast [[CAP_MAIN_TY]]*
55// CHECK: call void (%{{.+}}*, i{{[0-9]+}}, void (i{{[0-9]+}}*, i{{[0-9]+}}*, ...)*, ...)* @__kmpc_fork_call(%{{.+}}* @{{.+}}, i{{[0-9]+}} 1, void (i{{[0-9]+}}*, i{{[0-9]+}}*, ...)* bitcast (void (i{{[0-9]+}}*, i{{[0-9]+}}*, [[CAP_MAIN_TY]]*)* [[MAIN_MICROTASK:@.+]] to void
56// CHECK: = call i{{.+}} [[TMAIN_INT:@.+]]()
57// CHECK: call void [[S_FLOAT_TY_DESTR:@.+]]([[S_FLOAT_TY]]*
58// CHECK: ret
59//
60// CHECK: define internal void [[MAIN_MICROTASK]](i{{[0-9]+}}* [[GTID_ADDR:%.+]], i{{[0-9]+}}* %{{.+}}, [[CAP_MAIN_TY]]* %{{.+}})
61// CHECK: [[T_VAR_PRIV:%.+]] = alloca i{{[0-9]+}},
62// CHECK: [[VEC_PRIV:%.+]] = alloca [2 x i{{[0-9]+}}],
63// CHECK: [[S_ARR_PRIV:%.+]] = alloca [2 x [[S_FLOAT_TY]]],
64// CHECK: [[VAR_PRIV:%.+]] = alloca [[S_FLOAT_TY]],
65// CHECK: store i{{[0-9]+}}* [[GTID_ADDR]], i{{[0-9]+}}** [[GTID_ADDR_REF:%.+]]
66// CHECK-NOT: [[T_VAR_PRIV]]
67// CHECK-NOT: [[VEC_PRIV]]
68// CHECK: {{.+}}:
69// CHECK: [[S_ARR_PRIV_ITEM:%.+]] = phi [[S_FLOAT_TY]]*
70// CHECK: call {{.*}} [[S_FLOAT_TY_DEF_CONSTR]]([[S_FLOAT_TY]]* [[S_ARR_PRIV_ITEM]])
71// CHECK-NOT: [[T_VAR_PRIV]]
72// CHECK-NOT: [[VEC_PRIV]]
73// CHECK: call {{.*}} [[S_FLOAT_TY_DEF_CONSTR]]([[S_FLOAT_TY]]* [[VAR_PRIV]])
74// CHECK: [[GTID_REF:%.+]] = load i{{[0-9]+}}** [[GTID_ADDR_REF]]
75// CHECK: [[GTID:%.+]] = load i{{[0-9]+}}* [[GTID_REF]]
76// CHECK: call void @__kmpc_barrier(%{{.+}}* [[IMPLICIT_BARRIER_LOC]], i{{[0-9]+}} [[GTID]])
77// CHECK-DAG: call void [[S_FLOAT_TY_DESTR]]([[S_FLOAT_TY]]* [[VAR_PRIV]])
78// CHECK-DAG: call void [[S_FLOAT_TY_DESTR]]([[S_FLOAT_TY]]*
79// CHECK: ret void
80
81// CHECK: define {{.*}} i{{[0-9]+}} [[TMAIN_INT]]()
82// CHECK: [[TEST:%.+]] = alloca [[S_INT_TY]],
83// CHECK: call {{.*}} [[S_INT_TY_DEF_CONSTR:@.+]]([[S_INT_TY]]* [[TEST]])
84// CHECK: call void (%{{.+}}*, i{{[0-9]+}}, void (i{{[0-9]+}}*, i{{[0-9]+}}*, ...)*, ...)* @__kmpc_fork_call(%{{.+}}* @{{.+}}, i{{[0-9]+}} 1, void (i{{[0-9]+}}*, i{{[0-9]+}}*, ...)* bitcast (void (i{{[0-9]+}}*, i{{[0-9]+}}*, [[CAP_TMAIN_TY]]*)* [[TMAIN_MICROTASK:@.+]] to void
85// CHECK: call void [[S_INT_TY_DESTR:@.+]]([[S_INT_TY]]*
86// CHECK: ret
87//
88// CHECK: define internal void [[TMAIN_MICROTASK]](i{{[0-9]+}}* [[GTID_ADDR:%.+]], i{{[0-9]+}}* %{{.+}}, [[CAP_TMAIN_TY]]* %{{.+}})
89// CHECK: [[T_VAR_PRIV:%.+]] = alloca i{{[0-9]+}},
90// CHECK: [[VEC_PRIV:%.+]] = alloca [2 x i{{[0-9]+}}],
91// CHECK: [[S_ARR_PRIV:%.+]] = alloca [2 x [[S_INT_TY]]],
92// CHECK: [[VAR_PRIV:%.+]] = alloca [[S_INT_TY]],
93// CHECK: store i{{[0-9]+}}* [[GTID_ADDR]], i{{[0-9]+}}** [[GTID_ADDR_REF:%.+]]
94// CHECK-NOT: [[T_VAR_PRIV]]
95// CHECK-NOT: [[VEC_PRIV]]
96// CHECK: {{.+}}:
97// CHECK: [[S_ARR_PRIV_ITEM:%.+]] = phi [[S_INT_TY]]*
98// CHECK: call {{.*}} [[S_INT_TY_DEF_CONSTR]]([[S_INT_TY]]* [[S_ARR_PRIV_ITEM]])
99// CHECK-NOT: [[T_VAR_PRIV]]
100// CHECK-NOT: [[VEC_PRIV]]
101// CHECK: call {{.*}} [[S_INT_TY_DEF_CONSTR]]([[S_INT_TY]]* [[VAR_PRIV]])
102// CHECK: [[GTID_REF:%.+]] = load i{{[0-9]+}}** [[GTID_ADDR_REF]]
103// CHECK: [[GTID:%.+]] = load i{{[0-9]+}}* [[GTID_REF]]
104// CHECK: call void @__kmpc_barrier(%{{.+}}* [[IMPLICIT_BARRIER_LOC]], i{{[0-9]+}} [[GTID]])
105// CHECK-DAG: call void [[S_INT_TY_DESTR]]([[S_INT_TY]]* [[VAR_PRIV]])
106// CHECK-DAG: call void [[S_INT_TY_DESTR]]([[S_INT_TY]]*
107// CHECK: ret void
108#endif
109