blob: d15616d781ad5cce517d43d7fdedde589094011e [file] [log] [blame]
Alexey Bataevae03d072014-10-08 14:34:59 +00001// RUN: %clang_cc1 -verify -fopenmp=libiomp5 -x c++ -triple %itanium_abi_triple -emit-llvm %s -o - | FileCheck %s
2// RUN: %clang_cc1 -fopenmp=libiomp5 -x c++ -std=c++11 -triple %itanium_abi_triple -emit-pch -o %t %s
3// RUN: %clang_cc1 -fopenmp=libiomp5 -x c++ -triple %itanium_abi_triple -std=c++11 -include-pch %t -verify %s -emit-llvm -o - | FileCheck %s
Alexey Bataev4a5bb772014-10-08 14:01:46 +00004// expected-no-diagnostics
5#ifndef HEADER
6#define HEADER
7
8struct St {
9 int a, b;
10 St() : a(0), b(0) {}
11 St(const St &st) : a(st.a + st.b), b(0) {}
12 ~St() {}
13};
14
15volatile int g;
16
17template <class T>
18struct S {
19 T f;
20 S(T a) : f(a + g) {}
21 S() : f(g) {}
22 S(const S &s, St t = St()) : f(s.f + t.a) {}
23 operator T() { return T(); }
24 ~S() {}
25};
26
27// CHECK-DAG: [[S_FLOAT_TY:%.+]] = type { float }
28// CHECK-DAG: [[S_INT_TY:%.+]] = type { i{{[0-9]+}} }
29// CHECK-DAG: [[ST_TY:%.+]] = type { i{{[0-9]+}}, i{{[0-9]+}} }
30// CHECK-DAG: [[CAP_MAIN_TY:%.+]] = type { [2 x i{{[0-9]+}}]*, i{{[0-9]+}}*, [2 x [[S_FLOAT_TY]]]*, [[S_FLOAT_TY]]* }
31// CHECK-DAG: [[CAP_TMAIN_TY:%.+]] = type { [2 x i{{[0-9]+}}]*, i{{[0-9]+}}*, [2 x [[S_INT_TY]]]*, [[S_INT_TY]]* }
32// CHECK-DAG: [[IMPLICIT_BARRIER_LOC:@.+]] = private unnamed_addr constant %{{.+}} { i32 0, i32 66, i32 0, i32 0, i8*
33
34template <typename T>
35T tmain() {
36 S<T> test;
37 T t_var = T();
38 T vec[] = {1, 2};
39 S<T> s_arr[] = {1, 2};
40 S<T> var(3);
41#pragma omp parallel firstprivate(t_var, vec, s_arr, var)
42 {
43 vec[0] = t_var;
44 s_arr[0] = var;
45 }
46 return T();
47}
48
49int main() {
50 S<float> test;
51 int t_var = 0;
52 int vec[] = {1, 2};
53 S<float> s_arr[] = {1, 2};
54 S<float> var(3);
55#pragma omp parallel firstprivate(t_var, vec, s_arr, var)
56 {
57 vec[0] = t_var;
58 s_arr[0] = var;
59 }
60 return tmain<int>();
61}
62
Alexey Bataevcbcb7892014-10-10 02:50:06 +000063// CHECK: define {{.*}}i{{[0-9]+}} @main()
Alexey Bataev4a5bb772014-10-08 14:01:46 +000064// CHECK: [[TEST:%.+]] = alloca [[S_FLOAT_TY]],
Alexey Bataev25cdd152014-10-08 15:39:06 +000065// CHECK: call {{.*}} [[S_FLOAT_TY_DEF_CONSTR:@.+]]([[S_FLOAT_TY]]* [[TEST]])
Alexey Bataev4a5bb772014-10-08 14:01:46 +000066// CHECK: %{{.+}} = bitcast [[CAP_MAIN_TY]]*
67// 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
Alexey Bataevcbcb7892014-10-10 02:50:06 +000068// CHECK: = call {{.*}}i{{.+}} [[TMAIN_INT:@.+]]()
Alexey Bataev25cdd152014-10-08 15:39:06 +000069// CHECK: call {{.*}} [[S_FLOAT_TY_DESTR:@.+]]([[S_FLOAT_TY]]*
Alexey Bataev4a5bb772014-10-08 14:01:46 +000070// CHECK: ret
71//
72// CHECK: define internal void [[MAIN_MICROTASK]](i{{[0-9]+}}* [[GTID_ADDR:%.+]], i{{[0-9]+}}* %{{.+}}, [[CAP_MAIN_TY]]* %{{.+}})
73// CHECK: [[T_VAR_PRIV:%.+]] = alloca i{{[0-9]+}},
74// CHECK: [[VEC_PRIV:%.+]] = alloca [2 x i{{[0-9]+}}],
75// CHECK: [[S_ARR_PRIV:%.+]] = alloca [2 x [[S_FLOAT_TY]]],
76// CHECK: [[VAR_PRIV:%.+]] = alloca [[S_FLOAT_TY]],
Alexey Bataev18095712014-10-10 12:19:54 +000077// CHECK: store i{{[0-9]+}}* [[GTID_ADDR]], i{{[0-9]+}}** [[GTID_ADDR_ADDR:%.+]],
Alexey Bataev4a5bb772014-10-08 14:01:46 +000078// CHECK: [[T_VAR_PTR_REF:%.+]] = getelementptr inbounds [[CAP_MAIN_TY]]* %{{.+}}, i{{[0-9]+}} 0, i{{[0-9]+}} 1
79// CHECK: [[T_VAR_REF:%.+]] = load i{{[0-9]+}}** [[T_VAR_PTR_REF]],
80// CHECK: [[T_VAR_VAL:%.+]] = load i{{[0-9]+}}* [[T_VAR_REF]],
81// CHECK: store i{{[0-9]+}} [[T_VAR_VAL]], i{{[0-9]+}}* [[T_VAR_PRIV]],
82// CHECK: [[VEC_PTR_REF:%.+]] = getelementptr inbounds [[CAP_MAIN_TY]]* %{{.+}}, i{{[0-9]+}} 0, i{{[0-9]+}} 0
83// CHECK: [[VEC_REF:%.+]] = load [2 x i{{[0-9]+}}]** [[VEC_PTR_REF:%.+]],
84// CHECK: br label %[[VEC_PRIV_INIT:.+]]
85// CHECK: [[VEC_PRIV_INIT]]
86// CHECK: [[VEC_DEST:%.+]] = bitcast [2 x i{{[0-9]+}}]* [[VEC_PRIV]] to i8*
87// CHECK: [[VEC_SRC:%.+]] = bitcast [2 x i{{[0-9]+}}]* [[VEC_REF]] to i8*
88// CHECK: call void @llvm.memcpy.{{.+}}(i8* [[VEC_DEST]], i8* [[VEC_SRC]],
89// CHECK: br label %[[VEC_PRIV_INIT_END:.+]]
90// CHECK: [[VEC_PRIV_INIT_END]]
91// CHECK: [[S_ARR_REF_PTR:%.+]] = getelementptr inbounds [[CAP_MAIN_TY]]* %{{.+}}, i{{[0-9]+}} 0, i{{[0-9]+}} 2
92// CHECK: [[S_ARR_REF:%.+]] = load [2 x [[S_FLOAT_TY]]]** [[S_ARR_REF_PTR]],
93// CHECK: br label %[[S_ARR_PRIV_INIT:.+]]
94// CHECK: [[S_ARR_PRIV_INIT]]
95// CHECK: [[S_ARR_BEGIN:%.+]] = getelementptr inbounds [2 x [[S_FLOAT_TY]]]* [[S_ARR_REF]], i{{[0-9]+}} 0, i{{[0-9]+}} 0
96// CHECK: [[S_ARR_PRIV_BEGIN:%.+]] = getelementptr inbounds [2 x [[S_FLOAT_TY]]]* [[S_ARR_PRIV]], i{{[0-9]+}} 0, i{{[0-9]+}} 0
97// CHECK: [[S_ARR_END:%.+]] = getelementptr [[S_FLOAT_TY]]* [[S_ARR_BEGIN]], i{{[0-9]+}} 2
98// CHECK: [[S_ARR_PRIV_END:%.+]] = getelementptr [[S_FLOAT_TY]]* [[S_ARR_PRIV_BEGIN]], i{{[0-9]+}} 2
99// CHECK: [[IS_EMPTY:%.+]] = icmp eq [[S_FLOAT_TY]]* [[S_ARR_PRIV_BEGIN]], [[S_ARR_PRIV_END]]
100// CHECK: br i1 [[IS_EMPTY]], label %[[S_ARR_BODY_DONE:.+]], label %[[S_ARR_BODY:.+]]
101// CHECK: [[S_ARR_BODY]]
Alexey Bataev25cdd152014-10-08 15:39:06 +0000102// CHECK: call {{.*}} [[ST_TY_DEFAULT_CONSTR:@.+]]([[ST_TY]]* [[ST_TY_TEMP:%.+]])
103// CHECK: call {{.*}} [[S_FLOAT_TY_COPY_CONSTR:@.+]]([[S_FLOAT_TY]]* {{.+}}, [[S_FLOAT_TY]]* {{.+}}, [[ST_TY]]* [[ST_TY_TEMP]])
104// CHECK: call {{.*}} [[ST_TY_DESTR:@.+]]([[ST_TY]]* [[ST_TY_TEMP]])
Alexey Bataev4a5bb772014-10-08 14:01:46 +0000105// CHECK: br i1 {{.+}}, label %{{.+}}, label %[[S_ARR_BODY]]
106// CHECK: br label %[[S_ARR_PRIV_INIT_END:.+]]
107// CHECK: [[S_ARR_PRIV_INIT_END]]
108// CHECK: [[VAR_REF_PTR:%.+]] = getelementptr inbounds [[CAP_MAIN_TY]]* %{{.+}}, i{{[0-9]+}} 0, i{{[0-9]+}} 3
109// CHECK: [[VAR_REF:%.+]] = load [[S_FLOAT_TY]]** [[VAR_REF_PTR]],
Alexey Bataev25cdd152014-10-08 15:39:06 +0000110// CHECK: call {{.*}} [[ST_TY_DEFAULT_CONSTR]]([[ST_TY]]* [[ST_TY_TEMP:%.+]])
111// CHECK: call {{.*}} [[S_FLOAT_TY_COPY_CONSTR]]([[S_FLOAT_TY]]* [[VAR_PRIV]], [[S_FLOAT_TY]]* {{.*}} [[VAR_REF]], [[ST_TY]]* [[ST_TY_TEMP]])
112// CHECK: call {{.*}} [[ST_TY_DESTR]]([[ST_TY]]* [[ST_TY_TEMP]])
Alexey Bataev18095712014-10-10 12:19:54 +0000113// CHECK: [[GTID_REF:%.+]] = load i{{[0-9]+}}** [[GTID_ADDR_ADDR]]
114// CHECK: [[GTID:%.+]] = load i{{[0-9]+}}* [[GTID_REF]]
Alexey Bataev4a5bb772014-10-08 14:01:46 +0000115// CHECK: call void @__kmpc_barrier(%{{.+}}* [[IMPLICIT_BARRIER_LOC]], i{{[0-9]+}} [[GTID]])
Alexey Bataev25cdd152014-10-08 15:39:06 +0000116// CHECK-DAG: call {{.*}} [[S_FLOAT_TY_DESTR]]([[S_FLOAT_TY]]* [[VAR_PRIV]])
117// CHECK-DAG: call {{.*}} [[S_FLOAT_TY_DESTR]]([[S_FLOAT_TY]]*
Alexey Bataev4a5bb772014-10-08 14:01:46 +0000118// CHECK: ret void
119
120// CHECK: define {{.*}} i{{[0-9]+}} [[TMAIN_INT]]()
121// CHECK: [[TEST:%.+]] = alloca [[S_INT_TY]],
Alexey Bataev25cdd152014-10-08 15:39:06 +0000122// CHECK: call {{.*}} [[S_INT_TY_DEF_CONSTR:@.+]]([[S_INT_TY]]* [[TEST]])
Alexey Bataev4a5bb772014-10-08 14:01:46 +0000123// 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
Alexey Bataev25cdd152014-10-08 15:39:06 +0000124// CHECK: call {{.*}} [[S_INT_TY_DESTR:@.+]]([[S_INT_TY]]*
Alexey Bataev4a5bb772014-10-08 14:01:46 +0000125// CHECK: ret
126//
127// CHECK: define internal void [[TMAIN_MICROTASK]](i{{[0-9]+}}* [[GTID_ADDR:%.+]], i{{[0-9]+}}* %{{.+}}, [[CAP_TMAIN_TY]]* %{{.+}})
128// CHECK: [[T_VAR_PRIV:%.+]] = alloca i{{[0-9]+}},
129// CHECK: [[VEC_PRIV:%.+]] = alloca [2 x i{{[0-9]+}}],
130// CHECK: [[S_ARR_PRIV:%.+]] = alloca [2 x [[S_INT_TY]]],
131// CHECK: [[VAR_PRIV:%.+]] = alloca [[S_INT_TY]],
Alexey Bataev18095712014-10-10 12:19:54 +0000132// CHECK: store i{{[0-9]+}}* [[GTID_ADDR]], i{{[0-9]+}}** [[GTID_ADDR_ADDR:%.+]],
Alexey Bataev4a5bb772014-10-08 14:01:46 +0000133// CHECK: [[T_VAR_PTR_REF:%.+]] = getelementptr inbounds [[CAP_TMAIN_TY]]* %{{.+}}, i{{[0-9]+}} 0, i{{[0-9]+}} 1
134// CHECK: [[T_VAR_REF:%.+]] = load i{{[0-9]+}}** [[T_VAR_PTR_REF]],
135// CHECK: [[T_VAR_VAL:%.+]] = load i{{[0-9]+}}* [[T_VAR_REF]],
136// CHECK: store i{{[0-9]+}} [[T_VAR_VAL]], i{{[0-9]+}}* [[T_VAR_PRIV]],
137// CHECK: [[VEC_PTR_REF:%.+]] = getelementptr inbounds [[CAP_TMAIN_TY]]* %{{.+}}, i{{[0-9]+}} 0, i{{[0-9]+}} 0
138// CHECK: [[VEC_REF:%.+]] = load [2 x i{{[0-9]+}}]** [[VEC_PTR_REF:%.+]],
139// CHECK: br label %[[VEC_PRIV_INIT:.+]]
140// CHECK: [[VEC_PRIV_INIT]]
141// CHECK: [[VEC_DEST:%.+]] = bitcast [2 x i{{[0-9]+}}]* [[VEC_PRIV]] to i8*
142// CHECK: [[VEC_SRC:%.+]] = bitcast [2 x i{{[0-9]+}}]* [[VEC_REF]] to i8*
143// CHECK: call void @llvm.memcpy.{{.+}}(i8* [[VEC_DEST]], i8* [[VEC_SRC]],
144// CHECK: br label %[[VEC_PRIV_INIT_END:.+]]
145// CHECK: [[VEC_PRIV_INIT_END]]
146// CHECK: [[S_ARR_REF_PTR:%.+]] = getelementptr inbounds [[CAP_TMAIN_TY]]* %{{.+}}, i{{[0-9]+}} 0, i{{[0-9]+}} 2
147// CHECK: [[S_ARR_REF:%.+]] = load [2 x [[S_INT_TY]]]** [[S_ARR_REF_PTR]],
148// CHECK: br label %[[S_ARR_PRIV_INIT:.+]]
149// CHECK: [[S_ARR_PRIV_INIT]]
150// CHECK: [[S_ARR_BEGIN:%.+]] = getelementptr inbounds [2 x [[S_INT_TY]]]* [[S_ARR_REF]], i{{[0-9]+}} 0, i{{[0-9]+}} 0
151// CHECK: [[S_ARR_PRIV_BEGIN:%.+]] = getelementptr inbounds [2 x [[S_INT_TY]]]* [[S_ARR_PRIV]], i{{[0-9]+}} 0, i{{[0-9]+}} 0
152// CHECK: [[S_ARR_END:%.+]] = getelementptr [[S_INT_TY]]* [[S_ARR_BEGIN]], i{{[0-9]+}} 2
153// CHECK: [[S_ARR_PRIV_END:%.+]] = getelementptr [[S_INT_TY]]* [[S_ARR_PRIV_BEGIN]], i{{[0-9]+}} 2
154// CHECK: [[IS_EMPTY:%.+]] = icmp eq [[S_INT_TY]]* [[S_ARR_PRIV_BEGIN]], [[S_ARR_PRIV_END]]
155// CHECK: br i1 [[IS_EMPTY]], label %[[S_ARR_BODY_DONE:.+]], label %[[S_ARR_BODY:.+]]
156// CHECK: [[S_ARR_BODY]]
Alexey Bataev25cdd152014-10-08 15:39:06 +0000157// CHECK: call {{.*}} [[ST_TY_DEFAULT_CONSTR]]([[ST_TY]]* [[ST_TY_TEMP:%.+]])
158// CHECK: call {{.*}} [[S_INT_TY_COPY_CONSTR:@.+]]([[S_INT_TY]]* {{.+}}, [[S_INT_TY]]* {{.+}}, [[ST_TY]]* [[ST_TY_TEMP]])
159// CHECK: call {{.*}} [[ST_TY_DESTR]]([[ST_TY]]* [[ST_TY_TEMP]])
Alexey Bataev4a5bb772014-10-08 14:01:46 +0000160// CHECK: br i1 {{.+}}, label %{{.+}}, label %[[S_ARR_BODY]]
161// CHECK: br label %[[S_ARR_PRIV_INIT_END:.+]]
162// CHECK: [[S_ARR_PRIV_INIT_END]]
163// CHECK: [[VAR_REF_PTR:%.+]] = getelementptr inbounds [[CAP_TMAIN_TY]]* %{{.+}}, i{{[0-9]+}} 0, i{{[0-9]+}} 3
164// CHECK: [[VAR_REF:%.+]] = load [[S_INT_TY]]** [[VAR_REF_PTR]],
Alexey Bataev25cdd152014-10-08 15:39:06 +0000165// CHECK: call {{.*}} [[ST_TY_DEFAULT_CONSTR]]([[ST_TY]]* [[ST_TY_TEMP:%.+]])
166// CHECK: call {{.*}} [[S_INT_TY_COPY_CONSTR]]([[S_INT_TY]]* [[VAR_PRIV]], [[S_INT_TY]]* {{.*}} [[VAR_REF]], [[ST_TY]]* [[ST_TY_TEMP]])
167// CHECK: call {{.*}} [[ST_TY_DESTR]]([[ST_TY]]* [[ST_TY_TEMP]])
Alexey Bataev18095712014-10-10 12:19:54 +0000168// CHECK: [[GTID_REF:%.+]] = load i{{[0-9]+}}** [[GTID_ADDR_ADDR]]
169// CHECK: [[GTID:%.+]] = load i{{[0-9]+}}* [[GTID_REF]]
Alexey Bataev4a5bb772014-10-08 14:01:46 +0000170// CHECK: call void @__kmpc_barrier(%{{.+}}* [[IMPLICIT_BARRIER_LOC]], i{{[0-9]+}} [[GTID]])
Alexey Bataev25cdd152014-10-08 15:39:06 +0000171// CHECK-DAG: call {{.*}} [[S_INT_TY_DESTR]]([[S_INT_TY]]* [[VAR_PRIV]])
172// CHECK-DAG: call {{.*}} [[S_INT_TY_DESTR]]([[S_INT_TY]]*
Alexey Bataev4a5bb772014-10-08 14:01:46 +0000173// CHECK: ret void
174#endif
175