blob: 526ba1a9a8a02c0937b67f70c631143b3c718a73 [file] [log] [blame]
Alexey Bataevdb390212015-05-20 04:24:19 +00001// 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// RUN: %clang_cc1 -verify -fopenmp -x c++ -std=c++11 -DLAMBDA -triple x86_64-apple-darwin10 -emit-llvm %s -o - | FileCheck -check-prefix=LAMBDA %s
5// RUN: %clang_cc1 -verify -fopenmp -x c++ -fblocks -DBLOCKS -triple x86_64-apple-darwin10 -emit-llvm %s -o - | FileCheck -check-prefix=BLOCKS %s
Adrian Prantlbc068582015-07-08 01:00:30 +00006// REQUIRES: x86-registered-target
Alexey Bataev794ba0d2015-04-10 10:43:45 +00007// expected-no-diagnostics
8#ifndef HEADER
9#define HEADER
10
Alexey Bataev1d7f0fa2015-09-10 09:48:30 +000011volatile int g __attribute__((aligned(128))) = 1212;
Alexey Bataev794ba0d2015-04-10 10:43:45 +000012
13template <class T>
14struct S {
15 T f;
16 S(T a) : f(a + g) {}
17 S() : f(g) {}
18 operator T() { return T(); }
19 S &operator&(const S &) { return *this; }
20 ~S() {}
21};
22
23// CHECK-DAG: [[S_FLOAT_TY:%.+]] = type { float }
24// CHECK-DAG: [[S_INT_TY:%.+]] = type { i{{[0-9]+}} }
Alexey Bataev794ba0d2015-04-10 10:43:45 +000025// CHECK-DAG: [[IMPLICIT_BARRIER_LOC:@.+]] = private unnamed_addr constant %{{.+}} { i32 0, i32 66, i32 0, i32 0, i8*
26// CHECK-DAG: [[REDUCTION_LOC:@.+]] = private unnamed_addr constant %{{.+}} { i32 0, i32 18, i32 0, i32 0, i8*
27// CHECK-DAG: [[REDUCTION_LOCK:@.+]] = common global [8 x i32] zeroinitializer
28
29template <typename T>
30T tmain() {
31 T t;
32 S<T> test;
Alexey Bataev1d7f0fa2015-09-10 09:48:30 +000033 T t_var __attribute__((aligned(128))) = T(), t_var1 __attribute__((aligned(128)));
Alexey Bataev794ba0d2015-04-10 10:43:45 +000034 T vec[] = {1, 2};
Alexey Bataev1d7f0fa2015-09-10 09:48:30 +000035 S<T> s_arr[] = {1, 2};
36 S<T> var __attribute__((aligned(128))) (3), var1 __attribute__((aligned(128)));
Alexey Bataev794ba0d2015-04-10 10:43:45 +000037#pragma omp parallel reduction(+:t_var) reduction(&:var) reduction(&& : var1) reduction(min: t_var1)
38 {
39 vec[0] = t_var;
40 s_arr[0] = var;
41 }
42 return T();
43}
44
45int main() {
46#ifdef LAMBDA
47 // LAMBDA: [[G:@.+]] = global i{{[0-9]+}} 1212,
48 // LAMBDA-LABEL: @main
49 // LAMBDA: call void [[OUTER_LAMBDA:@.+]](
50 [&]() {
51 // LAMBDA: define{{.*}} internal{{.*}} void [[OUTER_LAMBDA]](
Alexey Bataev2377fe92015-09-10 08:12:02 +000052 // LAMBDA: call void {{.+}} @__kmpc_fork_call({{.+}}, i32 1, {{.+}}* [[OMP_REGION:@.+]] to {{.+}}, i32* [[G]])
Alexey Bataev794ba0d2015-04-10 10:43:45 +000053#pragma omp parallel reduction(+:g)
54 {
Alexey Bataev2377fe92015-09-10 08:12:02 +000055 // LAMBDA: define{{.*}} internal{{.*}} void [[OMP_REGION]](i32* noalias %{{.+}}, i32* noalias %{{.+}}, i32* dereferenceable(4) %{{.+}})
Alexey Bataev794ba0d2015-04-10 10:43:45 +000056 // LAMBDA: [[G_PRIVATE_ADDR:%.+]] = alloca i{{[0-9]+}},
57
58 // Reduction list for runtime.
59 // LAMBDA: [[RED_LIST:%.+]] = alloca [1 x i8*],
60
Alexey Bataev2377fe92015-09-10 08:12:02 +000061 // LAMBDA: [[G_REF:%.+]] = load i{{[0-9]+}}*, i{{[0-9]+}}** [[G_REF_ADDR:%.+]]
Alexey Bataev1d7f0fa2015-09-10 09:48:30 +000062 // LAMBDA: store i{{[0-9]+}} 0, i{{[0-9]+}}* [[G_PRIVATE_ADDR]], align 128
Alexey Bataev794ba0d2015-04-10 10:43:45 +000063 g = 1;
Alexey Bataev1d7f0fa2015-09-10 09:48:30 +000064 // LAMBDA: store i{{[0-9]+}} 1, i{{[0-9]+}}* [[G_PRIVATE_ADDR]], align 128
Alexey Bataev794ba0d2015-04-10 10:43:45 +000065 // LAMBDA: [[G_PRIVATE_ADDR_REF:%.+]] = getelementptr inbounds %{{.+}}, %{{.+}}* [[ARG:%.+]], i{{[0-9]+}} 0, i{{[0-9]+}} 0
66 // LAMBDA: store i{{[0-9]+}}* [[G_PRIVATE_ADDR]], i{{[0-9]+}}** [[G_PRIVATE_ADDR_REF]]
67 // LAMBDA: call void [[INNER_LAMBDA:@.+]](%{{.+}}* [[ARG]])
68
John McCall7f416cc2015-09-08 08:05:57 +000069 // LAMBDA: [[G_PRIV_REF:%.+]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[RED_LIST]], i64 0, i64 0
Alexey Bataev794ba0d2015-04-10 10:43:45 +000070 // LAMBDA: [[BITCAST:%.+]] = bitcast i32* [[G_PRIVATE_ADDR]] to i8*
71 // LAMBDA: store i8* [[BITCAST]], i8** [[G_PRIV_REF]],
72 // LAMBDA: call i32 @__kmpc_reduce_nowait(
73 // LAMBDA: switch i32 %{{.+}}, label %[[REDUCTION_DONE:.+]] [
74 // LAMBDA: i32 1, label %[[CASE1:.+]]
75 // LAMBDA: i32 2, label %[[CASE2:.+]]
76 // LAMBDA: [[CASE1]]
77 // LAMBDA: [[G_VAL:%.+]] = load i32, i32* [[G_REF]]
78 // LAMBDA: [[G_PRIV_VAL:%.+]] = load i32, i32* [[G_PRIVATE_ADDR]]
79 // LAMBDA: [[ADD:%.+]] = add nsw i32 [[G_VAL]], [[G_PRIV_VAL]]
80 // LAMBDA: store i32 [[ADD]], i32* [[G_REF]]
81 // LAMBDA: call void @__kmpc_end_reduce_nowait(
82 // LAMBDA: br label %[[REDUCTION_DONE]]
83 // LAMBDA: [[CASE2]]
84 // LAMBDA: [[G_PRIV_VAL:%.+]] = load i32, i32* [[G_PRIVATE_ADDR]]
85 // LAMBDA: atomicrmw add i32* [[G_REF]], i32 [[G_PRIV_VAL]] monotonic
86 // LAMBDA: br label %[[REDUCTION_DONE]]
87 // LAMBDA: [[REDUCTION_DONE]]
88 // LAMBDA: ret void
89 [&]() {
90 // LAMBDA: define {{.+}} void [[INNER_LAMBDA]](%{{.+}}* [[ARG_PTR:%.+]])
91 // LAMBDA: store %{{.+}}* [[ARG_PTR]], %{{.+}}** [[ARG_PTR_REF:%.+]],
92 g = 2;
93 // LAMBDA: [[ARG_PTR:%.+]] = load %{{.+}}*, %{{.+}}** [[ARG_PTR_REF]]
94 // LAMBDA: [[G_PTR_REF:%.+]] = getelementptr inbounds %{{.+}}, %{{.+}}* [[ARG_PTR]], i{{[0-9]+}} 0, i{{[0-9]+}} 0
95 // LAMBDA: [[G_REF:%.+]] = load i{{[0-9]+}}*, i{{[0-9]+}}** [[G_PTR_REF]]
Alexey Bataevb44fdfc2015-07-14 10:32:29 +000096 // LAMBDA: store i{{[0-9]+}} 2, i{{[0-9]+}}* [[G_REF]]
Alexey Bataev794ba0d2015-04-10 10:43:45 +000097 }();
98 }
99 }();
100 return 0;
101#elif defined(BLOCKS)
102 // BLOCKS: [[G:@.+]] = global i{{[0-9]+}} 1212,
103 // BLOCKS-LABEL: @main
David Blaikied6c88ec2015-04-16 23:25:00 +0000104 // BLOCKS: call void {{%.+}}(i8
Alexey Bataev794ba0d2015-04-10 10:43:45 +0000105 ^{
106 // BLOCKS: define{{.*}} internal{{.*}} void {{.+}}(i8*
Alexey Bataev2377fe92015-09-10 08:12:02 +0000107 // BLOCKS: call void {{.+}} @__kmpc_fork_call({{.+}}, i32 1, {{.+}}* [[OMP_REGION:@.+]] to {{.+}}, i32* [[G]])
Alexey Bataev794ba0d2015-04-10 10:43:45 +0000108#pragma omp parallel reduction(-:g)
109 {
Alexey Bataev2377fe92015-09-10 08:12:02 +0000110 // BLOCKS: define{{.*}} internal{{.*}} void [[OMP_REGION]](i32* noalias %{{.+}}, i32* noalias %{{.+}}, i32* dereferenceable(4) %{{.+}})
Alexey Bataev794ba0d2015-04-10 10:43:45 +0000111 // BLOCKS: [[G_PRIVATE_ADDR:%.+]] = alloca i{{[0-9]+}},
112
113 // Reduction list for runtime.
114 // BLOCKS: [[RED_LIST:%.+]] = alloca [1 x i8*],
115
Alexey Bataev2377fe92015-09-10 08:12:02 +0000116 // BLOCKS: [[G_REF:%.+]] = load i{{[0-9]+}}*, i{{[0-9]+}}** [[G_REF_ADDR:%.+]]
Alexey Bataev1d7f0fa2015-09-10 09:48:30 +0000117 // BLOCKS: store i{{[0-9]+}} 0, i{{[0-9]+}}* [[G_PRIVATE_ADDR]], align 128
Alexey Bataev794ba0d2015-04-10 10:43:45 +0000118 g = 1;
Alexey Bataev1d7f0fa2015-09-10 09:48:30 +0000119 // BLOCKS: store i{{[0-9]+}} 1, i{{[0-9]+}}* [[G_PRIVATE_ADDR]], align 128
Alexey Bataev794ba0d2015-04-10 10:43:45 +0000120 // BLOCKS-NOT: [[G]]{{[[^:word:]]}}
121 // BLOCKS: i{{[0-9]+}}* [[G_PRIVATE_ADDR]]
122 // BLOCKS-NOT: [[G]]{{[[^:word:]]}}
David Blaikied6c88ec2015-04-16 23:25:00 +0000123 // BLOCKS: call void {{%.+}}(i8
Alexey Bataev794ba0d2015-04-10 10:43:45 +0000124
John McCall7f416cc2015-09-08 08:05:57 +0000125 // BLOCKS: [[G_PRIV_REF:%.+]] = getelementptr inbounds [1 x i8*], [1 x i8*]* [[RED_LIST]], i64 0, i64 0
Alexey Bataev794ba0d2015-04-10 10:43:45 +0000126 // BLOCKS: [[BITCAST:%.+]] = bitcast i32* [[G_PRIVATE_ADDR]] to i8*
127 // BLOCKS: store i8* [[BITCAST]], i8** [[G_PRIV_REF]],
128 // BLOCKS: call i32 @__kmpc_reduce_nowait(
129 // BLOCKS: switch i32 %{{.+}}, label %[[REDUCTION_DONE:.+]] [
130 // BLOCKS: i32 1, label %[[CASE1:.+]]
131 // BLOCKS: i32 2, label %[[CASE2:.+]]
132 // BLOCKS: [[CASE1]]
133 // BLOCKS: [[G_VAL:%.+]] = load i32, i32* [[G_REF]]
134 // BLOCKS: [[G_PRIV_VAL:%.+]] = load i32, i32* [[G_PRIVATE_ADDR]]
135 // BLOCKS: [[ADD:%.+]] = add nsw i32 [[G_VAL]], [[G_PRIV_VAL]]
136 // BLOCKS: store i32 [[ADD]], i32* [[G_REF]]
137 // BLOCKS: call void @__kmpc_end_reduce_nowait(
138 // BLOCKS: br label %[[REDUCTION_DONE]]
139 // BLOCKS: [[CASE2]]
140 // BLOCKS: [[G_PRIV_VAL:%.+]] = load i32, i32* [[G_PRIVATE_ADDR]]
141 // BLOCKS: atomicrmw add i32* [[G_REF]], i32 [[G_PRIV_VAL]] monotonic
142 // BLOCKS: br label %[[REDUCTION_DONE]]
143 // BLOCKS: [[REDUCTION_DONE]]
144 // BLOCKS: ret void
145 ^{
146 // BLOCKS: define {{.+}} void {{@.+}}(i8*
147 g = 2;
148 // BLOCKS-NOT: [[G]]{{[[^:word:]]}}
Alexey Bataevb44fdfc2015-07-14 10:32:29 +0000149 // BLOCKS: store i{{[0-9]+}} 2, i{{[0-9]+}}*
Alexey Bataev794ba0d2015-04-10 10:43:45 +0000150 // BLOCKS-NOT: [[G]]{{[[^:word:]]}}
151 // BLOCKS: ret
152 }();
153 }
154 }();
155 return 0;
156#else
157 S<float> test;
158 float t_var = 0, t_var1;
159 int vec[] = {1, 2};
160 S<float> s_arr[] = {1, 2};
161 S<float> var(3), var1;
162#pragma omp parallel reduction(+:t_var) reduction(&:var) reduction(&& : var1) reduction(min: t_var1)
163 {
164 vec[0] = t_var;
165 s_arr[0] = var;
166 }
Alexey Bataev8ef31412015-12-18 07:58:25 +0000167 if (var1)
168#pragma omp parallel reduction(+ : t_var) reduction(& : var) reduction(&& : var1) reduction(min : t_var1)
169 while (1) {
170 vec[0] = t_var;
171 s_arr[0] = var;
172 }
Alexey Bataev794ba0d2015-04-10 10:43:45 +0000173 return tmain<int>();
174#endif
175}
176
177// CHECK: define {{.*}}i{{[0-9]+}} @main()
178// CHECK: [[TEST:%.+]] = alloca [[S_FLOAT_TY]],
179// CHECK: call {{.*}} [[S_FLOAT_TY_CONSTR:@.+]]([[S_FLOAT_TY]]* [[TEST]])
Alexey Bataev2377fe92015-09-10 08:12:02 +0000180// CHECK: call void (%{{.+}}*, i{{[0-9]+}}, void (i{{[0-9]+}}*, i{{[0-9]+}}*, ...)*, ...) @__kmpc_fork_call(%{{.+}}* @{{.+}}, i{{[0-9]+}} 6, void (i{{[0-9]+}}*, i{{[0-9]+}}*, ...)* bitcast (void (i{{[0-9]+}}*, i{{[0-9]+}}*, [2 x i32]*, float*, [2 x [[S_FLOAT_TY]]]*, [[S_FLOAT_TY]]*, [[S_FLOAT_TY]]*, float*)* [[MAIN_MICROTASK:@.+]] to void
Alexey Bataev8ef31412015-12-18 07:58:25 +0000181// CHECK: call void (%{{.+}}*, i{{[0-9]+}}, void (i{{[0-9]+}}*, i{{[0-9]+}}*, ...)*, ...) @__kmpc_fork_call(%{{.+}}* @{{.+}}, i{{[0-9]+}} 6, void (i{{[0-9]+}}*, i{{[0-9]+}}*, ...)* bitcast (void (i{{[0-9]+}}*, i{{[0-9]+}}*, [2 x i32]*, float*, [2 x [[S_FLOAT_TY]]]*, [[S_FLOAT_TY]]*, [[S_FLOAT_TY]]*, float*)* [[MAIN_MICROTASK1:@.+]] to void
Alexey Bataev794ba0d2015-04-10 10:43:45 +0000182// CHECK: = call {{.*}}i{{.+}} [[TMAIN_INT:@.+]]()
183// CHECK: call {{.*}} [[S_FLOAT_TY_DESTR:@.+]]([[S_FLOAT_TY]]*
184// CHECK: ret
185//
Alexey Bataev2377fe92015-09-10 08:12:02 +0000186// CHECK: define internal void [[MAIN_MICROTASK]](i{{[0-9]+}}* noalias [[GTID_ADDR:%.+]], i{{[0-9]+}}* noalias %{{.+}},
Alexey Bataev794ba0d2015-04-10 10:43:45 +0000187// CHECK: [[T_VAR_PRIV:%.+]] = alloca float,
188// CHECK: [[VAR_PRIV:%.+]] = alloca [[S_FLOAT_TY]],
189// CHECK: [[VAR1_PRIV:%.+]] = alloca [[S_FLOAT_TY]],
190// CHECK: [[T_VAR1_PRIV:%.+]] = alloca float,
191
192// Reduction list for runtime.
193// CHECK: [[RED_LIST:%.+]] = alloca [4 x i8*],
194
195// CHECK: store i{{[0-9]+}}* [[GTID_ADDR]], i{{[0-9]+}}** [[GTID_ADDR_ADDR:%.+]],
196
Alexey Bataev2377fe92015-09-10 08:12:02 +0000197// CHECK: [[T_VAR_REF:%.+]] = load float*, float** %
198// CHECK: [[VAR_REF:%.+]] = load [[S_FLOAT_TY]]*, [[S_FLOAT_TY]]** %
199// CHECK: [[VAR1_REF:%.+]] = load [[S_FLOAT_TY]]*, [[S_FLOAT_TY]]** %
200// CHECK: [[T_VAR1_REF:%.+]] = load float*, float** %
201
Alexey Bataev794ba0d2015-04-10 10:43:45 +0000202// For + reduction operation initial value of private variable is 0.
203// CHECK: store float 0.0{{.+}}, float* [[T_VAR_PRIV]],
204
Alexey Bataev794ba0d2015-04-10 10:43:45 +0000205// For & reduction operation initial value of private variable is ones in all bits.
206// CHECK: call {{.*}} [[S_FLOAT_TY_CONSTR:@.+]]([[S_FLOAT_TY]]* [[VAR_PRIV]])
207
Alexey Bataev794ba0d2015-04-10 10:43:45 +0000208// For && reduction operation initial value of private variable is 1.0.
209// CHECK: call {{.*}} [[S_FLOAT_TY_CONSTR:@.+]]([[S_FLOAT_TY]]* [[VAR1_PRIV]])
210
Alexey Bataev794ba0d2015-04-10 10:43:45 +0000211// For min reduction operation initial value of private variable is largest repesentable value.
212// CHECK: store float 0x47EFFFFFE0000000, float* [[T_VAR1_PRIV]],
213
Alexey Bataev794ba0d2015-04-10 10:43:45 +0000214// Skip checks for internal operations.
215
216// void *RedList[<n>] = {<ReductionVars>[0], ..., <ReductionVars>[<n>-1]};
217
John McCall7f416cc2015-09-08 08:05:57 +0000218// CHECK: [[T_VAR_PRIV_REF:%.+]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[RED_LIST]], i64 0, i64 0
Alexey Bataev794ba0d2015-04-10 10:43:45 +0000219// CHECK: [[BITCAST:%.+]] = bitcast float* [[T_VAR_PRIV]] to i8*
220// CHECK: store i8* [[BITCAST]], i8** [[T_VAR_PRIV_REF]],
John McCall7f416cc2015-09-08 08:05:57 +0000221// CHECK: [[VAR_PRIV_REF:%.+]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[RED_LIST]], i64 0, i64 1
Alexey Bataev794ba0d2015-04-10 10:43:45 +0000222// CHECK: [[BITCAST:%.+]] = bitcast [[S_FLOAT_TY]]* [[VAR_PRIV]] to i8*
223// CHECK: store i8* [[BITCAST]], i8** [[VAR_PRIV_REF]],
John McCall7f416cc2015-09-08 08:05:57 +0000224// CHECK: [[VAR1_PRIV_REF:%.+]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[RED_LIST]], i64 0, i64 2
Alexey Bataev794ba0d2015-04-10 10:43:45 +0000225// CHECK: [[BITCAST:%.+]] = bitcast [[S_FLOAT_TY]]* [[VAR1_PRIV]] to i8*
226// CHECK: store i8* [[BITCAST]], i8** [[VAR1_PRIV_REF]],
John McCall7f416cc2015-09-08 08:05:57 +0000227// CHECK: [[T_VAR1_PRIV_REF:%.+]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[RED_LIST]], i64 0, i64 3
Alexey Bataev794ba0d2015-04-10 10:43:45 +0000228// CHECK: [[BITCAST:%.+]] = bitcast float* [[T_VAR1_PRIV]] to i8*
229// CHECK: store i8* [[BITCAST]], i8** [[T_VAR1_PRIV_REF]],
230
231// res = __kmpc_reduce_nowait(<loc>, <gtid>, <n>, sizeof(RedList), RedList, reduce_func, &<lock>);
232
Alexey Bataev69c62a92015-04-15 04:52:20 +0000233// CHECK: [[GTID_REF:%.+]] = load i{{[0-9]+}}*, i{{[0-9]+}}** [[GTID_ADDR_ADDR]]
234// CHECK: [[GTID:%.+]] = load i{{[0-9]+}}, i{{[0-9]+}}* [[GTID_REF]]
Alexey Bataev794ba0d2015-04-10 10:43:45 +0000235// CHECK: [[BITCAST:%.+]] = bitcast [4 x i8*]* [[RED_LIST]] to i8*
236// CHECK: [[RES:%.+]] = call i32 @__kmpc_reduce_nowait(%{{.+}}* [[REDUCTION_LOC]], i32 [[GTID]], i32 4, i64 32, i8* [[BITCAST]], void (i8*, i8*)* [[REDUCTION_FUNC:@.+]], [8 x i32]* [[REDUCTION_LOCK]])
237
238// switch(res)
239// CHECK: switch i32 [[RES]], label %[[RED_DONE:.+]] [
240// CHECK: i32 1, label %[[CASE1:.+]]
241// CHECK: i32 2, label %[[CASE2:.+]]
242// CHECK: ]
243
244// case 1:
245// t_var += t_var_reduction;
246// CHECK: [[T_VAR_VAL:%.+]] = load float, float* [[T_VAR_REF]],
247// CHECK: [[T_VAR_PRIV_VAL:%.+]] = load float, float* [[T_VAR_PRIV]],
248// CHECK: [[UP:%.+]] = fadd float [[T_VAR_VAL]], [[T_VAR_PRIV_VAL]]
249// CHECK: store float [[UP]], float* [[T_VAR_REF]],
250
251// var = var.operator &(var_reduction);
252// CHECK: [[UP:%.+]] = call dereferenceable(4) [[S_FLOAT_TY]]* @{{.+}}([[S_FLOAT_TY]]* [[VAR_REF]], [[S_FLOAT_TY]]* dereferenceable(4) [[VAR_PRIV]])
253// CHECK: [[BC1:%.+]] = bitcast [[S_FLOAT_TY]]* [[VAR_REF]] to i8*
254// CHECK: [[BC2:%.+]] = bitcast [[S_FLOAT_TY]]* [[UP]] to i8*
Pete Cooper3b39e882015-11-19 05:55:59 +0000255// CHECK: call void @llvm.memcpy.p0i8.p0i8.i64(i8* [[BC1]], i8* [[BC2]], i64 4, i32 4, i1 false)
Alexey Bataev794ba0d2015-04-10 10:43:45 +0000256
257// var1 = var1.operator &&(var1_reduction);
258// CHECK: [[TO_FLOAT:%.+]] = call float @{{.+}}([[S_FLOAT_TY]]* [[VAR1_REF]])
259// CHECK: [[VAR1_BOOL:%.+]] = fcmp une float [[TO_FLOAT]], 0.0
Alexey Bataev69a47792015-05-07 03:54:03 +0000260// CHECK: br i1 [[VAR1_BOOL]], label %[[TRUE:.+]], label %[[END2:.+]]
Alexey Bataev794ba0d2015-04-10 10:43:45 +0000261// CHECK: [[TRUE]]
262// CHECK: [[TO_FLOAT:%.+]] = call float @{{.+}}([[S_FLOAT_TY]]* [[VAR1_PRIV]])
263// CHECK: [[VAR1_REDUCTION_BOOL:%.+]] = fcmp une float [[TO_FLOAT]], 0.0
Alexey Bataev794ba0d2015-04-10 10:43:45 +0000264// CHECK: br label %[[END2]]
265// CHECK: [[END2]]
Alexey Bataev69a47792015-05-07 03:54:03 +0000266// CHECK: [[COND_LVALUE:%.+]] = phi i1 [ false, %{{.+}} ], [ [[VAR1_REDUCTION_BOOL]], %[[TRUE]] ]
267// CHECK: [[CONV:%.+]] = uitofp i1 [[COND_LVALUE]] to float
268// CHECK: call void @{{.+}}([[S_FLOAT_TY]]* [[COND_LVALUE:%.+]], float [[CONV]])
Alexey Bataev794ba0d2015-04-10 10:43:45 +0000269// CHECK: [[BC1:%.+]] = bitcast [[S_FLOAT_TY]]* [[VAR1_REF]] to i8*
270// CHECK: [[BC2:%.+]] = bitcast [[S_FLOAT_TY]]* [[COND_LVALUE]] to i8*
Pete Cooper3b39e882015-11-19 05:55:59 +0000271// CHECK: call void @llvm.memcpy.p0i8.p0i8.i64(i8* [[BC1]], i8* [[BC2]], i64 4, i32 4, i1 false)
Alexey Bataev794ba0d2015-04-10 10:43:45 +0000272
273// t_var1 = min(t_var1, t_var1_reduction);
274// CHECK: [[T_VAR1_VAL:%.+]] = load float, float* [[T_VAR1_REF]],
275// CHECK: [[T_VAR1_PRIV_VAL:%.+]] = load float, float* [[T_VAR1_PRIV]],
276// CHECK: [[CMP:%.+]] = fcmp olt float [[T_VAR1_VAL]], [[T_VAR1_PRIV_VAL]]
Alexey Bataev69a47792015-05-07 03:54:03 +0000277// CHECK: br i1 [[CMP]]
278// CHECK: [[UP:%.+]] = phi float
Alexey Bataev794ba0d2015-04-10 10:43:45 +0000279// CHECK: store float [[UP]], float* [[T_VAR1_REF]],
280
281// __kmpc_end_reduce_nowait(<loc>, <gtid>, &<lock>);
282// CHECK: call void @__kmpc_end_reduce_nowait(%{{.+}}* [[REDUCTION_LOC]], i32 [[GTID]], [8 x i32]* [[REDUCTION_LOCK]])
283
284// break;
285// CHECK: br label %[[RED_DONE]]
286
287// case 2:
288// t_var += t_var_reduction;
289// CHECK: load float, float* [[T_VAR_PRIV]]
290// CHECK: [[T_VAR_REF_INT:%.+]] = bitcast float* [[T_VAR_REF]] to i32*
Alexey Bataevf0ab5532015-05-15 08:36:34 +0000291// CHECK: [[OLD1:%.+]] = load atomic i32, i32* [[T_VAR_REF_INT]] monotonic,
Alexey Bataev794ba0d2015-04-10 10:43:45 +0000292// CHECK: br label %[[CONT:.+]]
293// CHECK: [[CONT]]
Alexey Bataevf0ab5532015-05-15 08:36:34 +0000294// CHECK: [[ORIG_OLD_INT:%.+]] = phi i32 [ [[OLD1]], %{{.+}} ], [ [[OLD2:%.+]], %[[CONT]] ]
295// CHECK: fadd float
296// CHECK: [[UP_INT:%.+]] = load i32
Alexey Bataev794ba0d2015-04-10 10:43:45 +0000297// CHECK: [[T_VAR_REF_INT:%.+]] = bitcast float* [[T_VAR_REF]] to i32*
298// CHECK: [[RES:%.+]] = cmpxchg i32* [[T_VAR_REF_INT]], i32 [[ORIG_OLD_INT]], i32 [[UP_INT]] monotonic monotonic
Alexey Bataevf0ab5532015-05-15 08:36:34 +0000299// CHECK: [[OLD2:%.+]] = extractvalue { i32, i1 } [[RES]], 0
Alexey Bataev794ba0d2015-04-10 10:43:45 +0000300// CHECK: [[SUCCESS_FAIL:%.+]] = extractvalue { i32, i1 } [[RES]], 1
Alexey Bataev794ba0d2015-04-10 10:43:45 +0000301// CHECK: br i1 [[SUCCESS_FAIL]], label %[[ATOMIC_DONE:.+]], label %[[CONT]]
302// CHECK: [[ATOMIC_DONE]]
303
304// var = var.operator &(var_reduction);
305// CHECK: call void @__kmpc_critical(
306// CHECK: [[UP:%.+]] = call dereferenceable(4) [[S_FLOAT_TY]]* @{{.+}}([[S_FLOAT_TY]]* [[VAR_REF]], [[S_FLOAT_TY]]* dereferenceable(4) [[VAR_PRIV]])
307// CHECK: [[BC1:%.+]] = bitcast [[S_FLOAT_TY]]* [[VAR_REF]] to i8*
308// CHECK: [[BC2:%.+]] = bitcast [[S_FLOAT_TY]]* [[UP]] to i8*
Pete Cooper3b39e882015-11-19 05:55:59 +0000309// CHECK: call void @llvm.memcpy.p0i8.p0i8.i64(i8* [[BC1]], i8* [[BC2]], i64 4, i32 4, i1 false)
Alexey Bataev794ba0d2015-04-10 10:43:45 +0000310// CHECK: call void @__kmpc_end_critical(
311
312// var1 = var1.operator &&(var1_reduction);
313// CHECK: call void @__kmpc_critical(
314// CHECK: [[TO_FLOAT:%.+]] = call float @{{.+}}([[S_FLOAT_TY]]* [[VAR1_REF]])
315// CHECK: [[VAR1_BOOL:%.+]] = fcmp une float [[TO_FLOAT]], 0.0
Alexey Bataev69a47792015-05-07 03:54:03 +0000316// CHECK: br i1 [[VAR1_BOOL]], label %[[TRUE:.+]], label %[[END2:.+]]
Alexey Bataev794ba0d2015-04-10 10:43:45 +0000317// CHECK: [[TRUE]]
318// CHECK: [[TO_FLOAT:%.+]] = call float @{{.+}}([[S_FLOAT_TY]]* [[VAR1_PRIV]])
319// CHECK: [[VAR1_REDUCTION_BOOL:%.+]] = fcmp une float [[TO_FLOAT]], 0.0
Alexey Bataev794ba0d2015-04-10 10:43:45 +0000320// CHECK: br label %[[END2]]
321// CHECK: [[END2]]
Alexey Bataev69a47792015-05-07 03:54:03 +0000322// CHECK: [[COND_LVALUE:%.+]] = phi i1 [ false, %{{.+}} ], [ [[VAR1_REDUCTION_BOOL]], %[[TRUE]] ]
323// CHECK: [[CONV:%.+]] = uitofp i1 [[COND_LVALUE]] to float
324// CHECK: call void @{{.+}}([[S_FLOAT_TY]]* [[COND_LVALUE:%.+]], float [[CONV]])
Alexey Bataev794ba0d2015-04-10 10:43:45 +0000325// CHECK: [[BC1:%.+]] = bitcast [[S_FLOAT_TY]]* [[VAR1_REF]] to i8*
326// CHECK: [[BC2:%.+]] = bitcast [[S_FLOAT_TY]]* [[COND_LVALUE]] to i8*
Pete Cooper3b39e882015-11-19 05:55:59 +0000327// CHECK: call void @llvm.memcpy.p0i8.p0i8.i64(i8* [[BC1]], i8* [[BC2]], i64 4, i32 4, i1 false)
Alexey Bataev794ba0d2015-04-10 10:43:45 +0000328// CHECK: call void @__kmpc_end_critical(
329
330// t_var1 = min(t_var1, t_var1_reduction);
331// CHECK: load float, float* [[T_VAR1_PRIV]]
332// CHECK: [[T_VAR1_REF_INT:%.+]] = bitcast float* [[T_VAR1_REF]] to i32*
Alexey Bataevf0ab5532015-05-15 08:36:34 +0000333// CHECK: [[OLD1:%.+]] = load atomic i32, i32* [[T_VAR1_REF_INT]] monotonic,
Alexey Bataev794ba0d2015-04-10 10:43:45 +0000334// CHECK: br label %[[CONT:.+]]
335// CHECK: [[CONT]]
Alexey Bataevf0ab5532015-05-15 08:36:34 +0000336// CHECK: [[ORIG_OLD_INT:%.+]] = phi i32 [ [[OLD1]], %{{.+}} ], [ [[OLD2:%.+]], %{{.+}} ]
Alexey Bataev794ba0d2015-04-10 10:43:45 +0000337// CHECK: [[CMP:%.+]] = fcmp olt float
Alexey Bataev69a47792015-05-07 03:54:03 +0000338// CHECK: br i1 [[CMP]]
339// CHECK: [[UP:%.+]] = phi float
Alexey Bataevf0ab5532015-05-15 08:36:34 +0000340// CHECK: [[UP_INT:%.+]] = load i32
Alexey Bataev794ba0d2015-04-10 10:43:45 +0000341// CHECK: [[T_VAR1_REF_INT:%.+]] = bitcast float* [[T_VAR1_REF]] to i32*
342// CHECK: [[RES:%.+]] = cmpxchg i32* [[T_VAR1_REF_INT]], i32 [[ORIG_OLD_INT]], i32 [[UP_INT]] monotonic monotonic
Alexey Bataevf0ab5532015-05-15 08:36:34 +0000343// CHECK: [[OLD2:%.+]] = extractvalue { i32, i1 } [[RES]], 0
Alexey Bataev794ba0d2015-04-10 10:43:45 +0000344// CHECK: [[SUCCESS_FAIL:%.+]] = extractvalue { i32, i1 } [[RES]], 1
Alexey Bataev794ba0d2015-04-10 10:43:45 +0000345// CHECK: br i1 [[SUCCESS_FAIL]], label %[[ATOMIC_DONE:.+]], label %[[CONT]]
346// CHECK: [[ATOMIC_DONE]]
347
348// break;
349// CHECK: br label %[[RED_DONE]]
350// CHECK: [[RED_DONE]]
Alexey Bataev25e5b442015-09-15 12:52:43 +0000351// CHECK: call void @__kmpc_barrier(%{{.+}}* [[IMPLICIT_BARRIER_LOC]], i{{[0-9]+}} [[GTID]])
Alexey Bataev794ba0d2015-04-10 10:43:45 +0000352
353// CHECK-DAG: call {{.*}} [[S_FLOAT_TY_DESTR]]([[S_FLOAT_TY]]* [[VAR_PRIV]])
354// CHECK-DAG: call {{.*}} [[S_FLOAT_TY_DESTR]]([[S_FLOAT_TY]]*
355// CHECK: ret void
356
357// void reduce_func(void *lhs[<n>], void *rhs[<n>]) {
358// *(Type0*)lhs[0] = ReductionOperation0(*(Type0*)lhs[0], *(Type0*)rhs[0]);
359// ...
360// *(Type<n>-1*)lhs[<n>-1] = ReductionOperation<n>-1(*(Type<n>-1*)lhs[<n>-1],
361// *(Type<n>-1*)rhs[<n>-1]);
362// }
363// CHECK: define internal void [[REDUCTION_FUNC]](i8*, i8*)
364// t_var_lhs = (float*)lhs[0];
John McCall7f416cc2015-09-08 08:05:57 +0000365// CHECK: [[T_VAR_RHS_REF:%.+]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[RED_LIST_RHS:%.+]], i64 0, i64 0
Alexey Bataev794ba0d2015-04-10 10:43:45 +0000366// CHECK: [[T_VAR_RHS_VOID:%.+]] = load i8*, i8** [[T_VAR_RHS_REF]],
367// CHECK: [[T_VAR_RHS:%.+]] = bitcast i8* [[T_VAR_RHS_VOID]] to float*
368// t_var_rhs = (float*)rhs[0];
John McCall7f416cc2015-09-08 08:05:57 +0000369// CHECK: [[T_VAR_LHS_REF:%.+]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[RED_LIST_LHS:%.+]], i64 0, i64 0
Alexey Bataev794ba0d2015-04-10 10:43:45 +0000370// CHECK: [[T_VAR_LHS_VOID:%.+]] = load i8*, i8** [[T_VAR_LHS_REF]],
371// CHECK: [[T_VAR_LHS:%.+]] = bitcast i8* [[T_VAR_LHS_VOID]] to float*
372
373// var_lhs = (S<float>*)lhs[1];
John McCall7f416cc2015-09-08 08:05:57 +0000374// CHECK: [[VAR_RHS_REF:%.+]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[RED_LIST_RHS]], i64 0, i64 1
Alexey Bataev794ba0d2015-04-10 10:43:45 +0000375// CHECK: [[VAR_RHS_VOID:%.+]] = load i8*, i8** [[VAR_RHS_REF]],
376// CHECK: [[VAR_RHS:%.+]] = bitcast i8* [[VAR_RHS_VOID]] to [[S_FLOAT_TY]]*
377// var_rhs = (S<float>*)rhs[1];
John McCall7f416cc2015-09-08 08:05:57 +0000378// CHECK: [[VAR_LHS_REF:%.+]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[RED_LIST_LHS]], i64 0, i64 1
Alexey Bataev794ba0d2015-04-10 10:43:45 +0000379// CHECK: [[VAR_LHS_VOID:%.+]] = load i8*, i8** [[VAR_LHS_REF]],
380// CHECK: [[VAR_LHS:%.+]] = bitcast i8* [[VAR_LHS_VOID]] to [[S_FLOAT_TY]]*
381
382// var1_lhs = (S<float>*)lhs[2];
John McCall7f416cc2015-09-08 08:05:57 +0000383// CHECK: [[VAR1_RHS_REF:%.+]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[RED_LIST_RHS]], i64 0, i64 2
Alexey Bataev794ba0d2015-04-10 10:43:45 +0000384// CHECK: [[VAR1_RHS_VOID:%.+]] = load i8*, i8** [[VAR1_RHS_REF]],
385// CHECK: [[VAR1_RHS:%.+]] = bitcast i8* [[VAR1_RHS_VOID]] to [[S_FLOAT_TY]]*
386// var1_rhs = (S<float>*)rhs[2];
John McCall7f416cc2015-09-08 08:05:57 +0000387// CHECK: [[VAR1_LHS_REF:%.+]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[RED_LIST_LHS]], i64 0, i64 2
Alexey Bataev794ba0d2015-04-10 10:43:45 +0000388// CHECK: [[VAR1_LHS_VOID:%.+]] = load i8*, i8** [[VAR1_LHS_REF]],
389// CHECK: [[VAR1_LHS:%.+]] = bitcast i8* [[VAR1_LHS_VOID]] to [[S_FLOAT_TY]]*
390
391// t_var1_lhs = (float*)lhs[3];
John McCall7f416cc2015-09-08 08:05:57 +0000392// CHECK: [[T_VAR1_RHS_REF:%.+]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[RED_LIST_RHS]], i64 0, i64 3
Alexey Bataev794ba0d2015-04-10 10:43:45 +0000393// CHECK: [[T_VAR1_RHS_VOID:%.+]] = load i8*, i8** [[T_VAR1_RHS_REF]],
394// CHECK: [[T_VAR1_RHS:%.+]] = bitcast i8* [[T_VAR1_RHS_VOID]] to float*
395// t_var1_rhs = (float*)rhs[3];
John McCall7f416cc2015-09-08 08:05:57 +0000396// CHECK: [[T_VAR1_LHS_REF:%.+]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[RED_LIST_LHS]], i64 0, i64 3
Alexey Bataev794ba0d2015-04-10 10:43:45 +0000397// CHECK: [[T_VAR1_LHS_VOID:%.+]] = load i8*, i8** [[T_VAR1_LHS_REF]],
398// CHECK: [[T_VAR1_LHS:%.+]] = bitcast i8* [[T_VAR1_LHS_VOID]] to float*
399
400// t_var_lhs += t_var_rhs;
401// CHECK: [[T_VAR_LHS_VAL:%.+]] = load float, float* [[T_VAR_LHS]],
402// CHECK: [[T_VAR_RHS_VAL:%.+]] = load float, float* [[T_VAR_RHS]],
403// CHECK: [[UP:%.+]] = fadd float [[T_VAR_LHS_VAL]], [[T_VAR_RHS_VAL]]
404// CHECK: store float [[UP]], float* [[T_VAR_LHS]],
405
406// var_lhs = var_lhs.operator &(var_rhs);
407// CHECK: [[UP:%.+]] = call dereferenceable(4) [[S_FLOAT_TY]]* @{{.+}}([[S_FLOAT_TY]]* [[VAR_LHS]], [[S_FLOAT_TY]]* dereferenceable(4) [[VAR_RHS]])
408// CHECK: [[BC1:%.+]] = bitcast [[S_FLOAT_TY]]* [[VAR_LHS]] to i8*
409// CHECK: [[BC2:%.+]] = bitcast [[S_FLOAT_TY]]* [[UP]] to i8*
Pete Cooper3b39e882015-11-19 05:55:59 +0000410// CHECK: call void @llvm.memcpy.p0i8.p0i8.i64(i8* [[BC1]], i8* [[BC2]], i64 4, i32 4, i1 false)
Alexey Bataev794ba0d2015-04-10 10:43:45 +0000411
412// var1_lhs = var1_lhs.operator &&(var1_rhs);
413// CHECK: [[TO_FLOAT:%.+]] = call float @{{.+}}([[S_FLOAT_TY]]* [[VAR1_LHS]])
414// CHECK: [[VAR1_BOOL:%.+]] = fcmp une float [[TO_FLOAT]], 0.0
Alexey Bataev69a47792015-05-07 03:54:03 +0000415// CHECK: br i1 [[VAR1_BOOL]], label %[[TRUE:.+]], label %[[END2:.+]]
Alexey Bataev794ba0d2015-04-10 10:43:45 +0000416// CHECK: [[TRUE]]
417// CHECK: [[TO_FLOAT:%.+]] = call float @{{.+}}([[S_FLOAT_TY]]* [[VAR1_RHS]])
418// CHECK: [[VAR1_REDUCTION_BOOL:%.+]] = fcmp une float [[TO_FLOAT]], 0.0
Alexey Bataev794ba0d2015-04-10 10:43:45 +0000419// CHECK: br label %[[END2]]
420// CHECK: [[END2]]
Alexey Bataev69a47792015-05-07 03:54:03 +0000421// CHECK: [[COND_LVALUE:%.+]] = phi i1 [ false, %{{.+}} ], [ [[VAR1_REDUCTION_BOOL]], %[[TRUE]] ]
422// CHECK: [[CONV:%.+]] = uitofp i1 [[COND_LVALUE]] to float
423// CHECK: call void @{{.+}}([[S_FLOAT_TY]]* [[COND_LVALUE:%.+]], float [[CONV]])
Alexey Bataev794ba0d2015-04-10 10:43:45 +0000424// CHECK: [[BC1:%.+]] = bitcast [[S_FLOAT_TY]]* [[VAR1_LHS]] to i8*
425// CHECK: [[BC2:%.+]] = bitcast [[S_FLOAT_TY]]* [[COND_LVALUE]] to i8*
Pete Cooper3b39e882015-11-19 05:55:59 +0000426// CHECK: call void @llvm.memcpy.p0i8.p0i8.i64(i8* [[BC1]], i8* [[BC2]], i64 4, i32 4, i1 false)
Alexey Bataev794ba0d2015-04-10 10:43:45 +0000427
428// t_var1_lhs = min(t_var1_lhs, t_var1_rhs);
429// CHECK: [[T_VAR1_LHS_VAL:%.+]] = load float, float* [[T_VAR1_LHS]],
430// CHECK: [[T_VAR1_RHS_VAL:%.+]] = load float, float* [[T_VAR1_RHS]],
431// CHECK: [[CMP:%.+]] = fcmp olt float [[T_VAR1_LHS_VAL]], [[T_VAR1_RHS_VAL]]
Alexey Bataev69a47792015-05-07 03:54:03 +0000432// CHECK: br i1 [[CMP]]
433// CHECK: [[UP:%.+]] = phi float
Alexey Bataev794ba0d2015-04-10 10:43:45 +0000434// CHECK: store float [[UP]], float* [[T_VAR1_LHS]],
435// CHECK: ret void
436
Alexey Bataev8ef31412015-12-18 07:58:25 +0000437// CHECK: define internal void [[MAIN_MICROTASK1]](i{{[0-9]+}}* noalias [[GTID_ADDR:%.+]], i{{[0-9]+}}* noalias %{{.+}},
438// CHECK: [[T_VAR_PRIV:%.+]] = alloca float,
439// CHECK: [[VAR_PRIV:%.+]] = alloca [[S_FLOAT_TY]],
440// CHECK: [[VAR1_PRIV:%.+]] = alloca [[S_FLOAT_TY]],
441// CHECK: [[T_VAR1_PRIV:%.+]] = alloca float,
442
443// CHECK: store i{{[0-9]+}}* [[GTID_ADDR]], i{{[0-9]+}}** [[GTID_ADDR_ADDR:%.+]],
444
445// CHECK: [[T_VAR_REF:%.+]] = load float*, float** %
446// CHECK: [[VAR_REF:%.+]] = load [[S_FLOAT_TY]]*, [[S_FLOAT_TY]]** %
447// CHECK: [[VAR1_REF:%.+]] = load [[S_FLOAT_TY]]*, [[S_FLOAT_TY]]** %
448// CHECK: [[T_VAR1_REF:%.+]] = load float*, float** %
449
450// For + reduction operation initial value of private variable is 0.
451// CHECK: store float 0.0{{.+}}, float* [[T_VAR_PRIV]],
452
453// For & reduction operation initial value of private variable is ones in all bits.
454// CHECK: call {{.*}} [[S_FLOAT_TY_CONSTR:@.+]]([[S_FLOAT_TY]]* [[VAR_PRIV]])
455
456// For && reduction operation initial value of private variable is 1.0.
457// CHECK: call {{.*}} [[S_FLOAT_TY_CONSTR:@.+]]([[S_FLOAT_TY]]* [[VAR1_PRIV]])
458
459// For min reduction operation initial value of private variable is largest repesentable value.
460// CHECK: store float 0x47EFFFFFE0000000, float* [[T_VAR1_PRIV]],
461
462// CHECK-NOT: call i32 @__kmpc_reduce
463
464// CHECK: ret void
465
Alexey Bataev794ba0d2015-04-10 10:43:45 +0000466// CHECK: define {{.*}} i{{[0-9]+}} [[TMAIN_INT]]()
467// CHECK: [[TEST:%.+]] = alloca [[S_INT_TY]],
468// CHECK: call {{.*}} [[S_INT_TY_CONSTR:@.+]]([[S_INT_TY]]* [[TEST]])
Alexey Bataev2377fe92015-09-10 08:12:02 +0000469// CHECK: call void (%{{.+}}*, i{{[0-9]+}}, void (i{{[0-9]+}}*, i{{[0-9]+}}*, ...)*, ...) @__kmpc_fork_call(%{{.+}}* @{{.+}}, i{{[0-9]+}} 6, void (i{{[0-9]+}}*, i{{[0-9]+}}*, ...)* bitcast (void (i{{[0-9]+}}*, i{{[0-9]+}}*, [2 x i32]*, i32*, [2 x [[S_INT_TY]]]*, [[S_INT_TY]]*, [[S_INT_TY]]*, i32*)* [[TMAIN_MICROTASK:@.+]] to void
Alexey Bataev794ba0d2015-04-10 10:43:45 +0000470// CHECK: call {{.*}} [[S_INT_TY_DESTR:@.+]]([[S_INT_TY]]*
471// CHECK: ret
472//
Alexey Bataev2377fe92015-09-10 08:12:02 +0000473// CHECK: define internal void [[TMAIN_MICROTASK]](i{{[0-9]+}}* noalias [[GTID_ADDR:%.+]], i{{[0-9]+}}* noalias %{{.+}},
Alexey Bataev1d7f0fa2015-09-10 09:48:30 +0000474// CHECK: [[T_VAR_PRIV:%.+]] = alloca i{{[0-9]+}}, align 128
475// CHECK: [[VAR_PRIV:%.+]] = alloca [[S_INT_TY]], align 128
476// CHECK: [[VAR1_PRIV:%.+]] = alloca [[S_INT_TY]], align 128
477// CHECK: [[T_VAR1_PRIV:%.+]] = alloca i{{[0-9]+}}, align 128
Alexey Bataev794ba0d2015-04-10 10:43:45 +0000478
479// Reduction list for runtime.
480// CHECK: [[RED_LIST:%.+]] = alloca [4 x i8*],
481
482// CHECK: store i{{[0-9]+}}* [[GTID_ADDR]], i{{[0-9]+}}** [[GTID_ADDR_ADDR:%.+]],
483
Alexey Bataev2377fe92015-09-10 08:12:02 +0000484// CHECK: [[T_VAR_REF:%.+]] = load i{{[0-9]+}}*, i{{[0-9]+}}** %
485// CHECK: [[VAR_REF:%.+]] = load [[S_INT_TY]]*, [[S_INT_TY]]** %
486// CHECK: [[VAR1_REF:%.+]] = load [[S_INT_TY]]*, [[S_INT_TY]]** %
487// CHECK: [[T_VAR1_REF:%.+]] = load i{{[0-9]+}}*, i{{[0-9]+}}** %
488
Alexey Bataev794ba0d2015-04-10 10:43:45 +0000489// For + reduction operation initial value of private variable is 0.
490// CHECK: store i{{[0-9]+}} 0, i{{[0-9]+}}* [[T_VAR_PRIV]],
491
Alexey Bataev794ba0d2015-04-10 10:43:45 +0000492// For & reduction operation initial value of private variable is ones in all bits.
493// CHECK: call {{.*}} [[S_INT_TY_CONSTR:@.+]]([[S_INT_TY]]* [[VAR_PRIV]])
494
Alexey Bataev794ba0d2015-04-10 10:43:45 +0000495// For && reduction operation initial value of private variable is 1.0.
496// CHECK: call {{.*}} [[S_INT_TY_CONSTR:@.+]]([[S_INT_TY]]* [[VAR1_PRIV]])
497
Alexey Bataev794ba0d2015-04-10 10:43:45 +0000498// For min reduction operation initial value of private variable is largest repesentable value.
499// CHECK: store i{{[0-9]+}} 2147483647, i{{[0-9]+}}* [[T_VAR1_PRIV]],
500
Alexey Bataev794ba0d2015-04-10 10:43:45 +0000501// Skip checks for internal operations.
502
503// void *RedList[<n>] = {<ReductionVars>[0], ..., <ReductionVars>[<n>-1]};
504
John McCall7f416cc2015-09-08 08:05:57 +0000505// CHECK: [[T_VAR_PRIV_REF:%.+]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[RED_LIST]], i64 0, i64 0
Alexey Bataev794ba0d2015-04-10 10:43:45 +0000506// CHECK: [[BITCAST:%.+]] = bitcast i{{[0-9]+}}* [[T_VAR_PRIV]] to i8*
507// CHECK: store i8* [[BITCAST]], i8** [[T_VAR_PRIV_REF]],
John McCall7f416cc2015-09-08 08:05:57 +0000508// CHECK: [[VAR_PRIV_REF:%.+]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[RED_LIST]], i64 0, i64 1
Alexey Bataev794ba0d2015-04-10 10:43:45 +0000509// CHECK: [[BITCAST:%.+]] = bitcast [[S_INT_TY]]* [[VAR_PRIV]] to i8*
510// CHECK: store i8* [[BITCAST]], i8** [[VAR_PRIV_REF]],
John McCall7f416cc2015-09-08 08:05:57 +0000511// CHECK: [[VAR1_PRIV_REF:%.+]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[RED_LIST]], i64 0, i64 2
Alexey Bataev794ba0d2015-04-10 10:43:45 +0000512// CHECK: [[BITCAST:%.+]] = bitcast [[S_INT_TY]]* [[VAR1_PRIV]] to i8*
513// CHECK: store i8* [[BITCAST]], i8** [[VAR1_PRIV_REF]],
John McCall7f416cc2015-09-08 08:05:57 +0000514// CHECK: [[T_VAR1_PRIV_REF:%.+]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[RED_LIST]], i64 0, i64 3
Alexey Bataev794ba0d2015-04-10 10:43:45 +0000515// CHECK: [[BITCAST:%.+]] = bitcast i{{[0-9]+}}* [[T_VAR1_PRIV]] to i8*
516// CHECK: store i8* [[BITCAST]], i8** [[T_VAR1_PRIV_REF]],
517
518// res = __kmpc_reduce_nowait(<loc>, <gtid>, <n>, sizeof(RedList), RedList, reduce_func, &<lock>);
519
Alexey Bataev69c62a92015-04-15 04:52:20 +0000520// CHECK: [[GTID_REF:%.+]] = load i{{[0-9]+}}*, i{{[0-9]+}}** [[GTID_ADDR_ADDR]]
521// CHECK: [[GTID:%.+]] = load i{{[0-9]+}}, i{{[0-9]+}}* [[GTID_REF]]
Alexey Bataev794ba0d2015-04-10 10:43:45 +0000522// CHECK: [[BITCAST:%.+]] = bitcast [4 x i8*]* [[RED_LIST]] to i8*
523// CHECK: [[RES:%.+]] = call i32 @__kmpc_reduce_nowait(%{{.+}}* [[REDUCTION_LOC]], i32 [[GTID]], i32 4, i64 32, i8* [[BITCAST]], void (i8*, i8*)* [[REDUCTION_FUNC:@.+]], [8 x i32]* [[REDUCTION_LOCK]])
524
525// switch(res)
526// CHECK: switch i32 [[RES]], label %[[RED_DONE:.+]] [
527// CHECK: i32 1, label %[[CASE1:.+]]
528// CHECK: i32 2, label %[[CASE2:.+]]
529// CHECK: ]
530
531// case 1:
532// t_var += t_var_reduction;
533// CHECK: [[T_VAR_VAL:%.+]] = load i{{[0-9]+}}, i{{[0-9]+}}* [[T_VAR_REF]],
534// CHECK: [[T_VAR_PRIV_VAL:%.+]] = load i{{[0-9]+}}, i{{[0-9]+}}* [[T_VAR_PRIV]],
535// CHECK: [[UP:%.+]] = add nsw i{{[0-9]+}} [[T_VAR_VAL]], [[T_VAR_PRIV_VAL]]
536// CHECK: store i{{[0-9]+}} [[UP]], i{{[0-9]+}}* [[T_VAR_REF]],
537
538// var = var.operator &(var_reduction);
539// CHECK: [[UP:%.+]] = call dereferenceable(4) [[S_INT_TY]]* @{{.+}}([[S_INT_TY]]* [[VAR_REF]], [[S_INT_TY]]* dereferenceable(4) [[VAR_PRIV]])
540// CHECK: [[BC1:%.+]] = bitcast [[S_INT_TY]]* [[VAR_REF]] to i8*
541// CHECK: [[BC2:%.+]] = bitcast [[S_INT_TY]]* [[UP]] to i8*
Pete Cooper3b39e882015-11-19 05:55:59 +0000542// CHECK: call void @llvm.memcpy.p0i8.p0i8.i64(i8* [[BC1]], i8* [[BC2]], i64 4, i32 4, i1 false)
Alexey Bataev794ba0d2015-04-10 10:43:45 +0000543
544// var1 = var1.operator &&(var1_reduction);
545// CHECK: [[TO_INT:%.+]] = call i{{[0-9]+}} @{{.+}}([[S_INT_TY]]* [[VAR1_REF]])
546// CHECK: [[VAR1_BOOL:%.+]] = icmp ne i{{[0-9]+}} [[TO_INT]], 0
Alexey Bataev69a47792015-05-07 03:54:03 +0000547// CHECK: br i1 [[VAR1_BOOL]], label %[[TRUE:.+]], label %[[END2:.+]]
Alexey Bataev794ba0d2015-04-10 10:43:45 +0000548// CHECK: [[TRUE]]
549// CHECK: [[TO_INT:%.+]] = call i{{[0-9]+}} @{{.+}}([[S_INT_TY]]* [[VAR1_PRIV]])
550// CHECK: [[VAR1_REDUCTION_BOOL:%.+]] = icmp ne i{{[0-9]+}} [[TO_INT]], 0
Alexey Bataev794ba0d2015-04-10 10:43:45 +0000551// CHECK: [[END2]]
Alexey Bataev69a47792015-05-07 03:54:03 +0000552// CHECK: [[COND_LVALUE:%.+]] = phi i1 [ false, %{{.+}} ], [ [[VAR1_REDUCTION_BOOL]], %[[TRUE]] ]
553// CHECK: [[CONV:%.+]] = zext i1 [[COND_LVALUE]] to i32
554// CHECK: call void @{{.+}}([[S_INT_TY]]* [[COND_LVALUE:%.+]], i32 [[CONV]])
Alexey Bataev794ba0d2015-04-10 10:43:45 +0000555// CHECK: [[BC1:%.+]] = bitcast [[S_INT_TY]]* [[VAR1_REF]] to i8*
556// CHECK: [[BC2:%.+]] = bitcast [[S_INT_TY]]* [[COND_LVALUE]] to i8*
Pete Cooper3b39e882015-11-19 05:55:59 +0000557// CHECK: call void @llvm.memcpy.p0i8.p0i8.i64(i8* [[BC1]], i8* [[BC2]], i64 4, i32 4, i1 false)
Alexey Bataev794ba0d2015-04-10 10:43:45 +0000558
559// t_var1 = min(t_var1, t_var1_reduction);
560// CHECK: [[T_VAR1_VAL:%.+]] = load i{{[0-9]+}}, i{{[0-9]+}}* [[T_VAR1_REF]],
561// CHECK: [[T_VAR1_PRIV_VAL:%.+]] = load i{{[0-9]+}}, i{{[0-9]+}}* [[T_VAR1_PRIV]],
562// CHECK: [[CMP:%.+]] = icmp slt i{{[0-9]+}} [[T_VAR1_VAL]], [[T_VAR1_PRIV_VAL]]
Alexey Bataev69a47792015-05-07 03:54:03 +0000563// CHECK: br i1 [[CMP]]
564// CHECK: [[UP:%.+]] = phi i32
Alexey Bataev794ba0d2015-04-10 10:43:45 +0000565// CHECK: store i{{[0-9]+}} [[UP]], i{{[0-9]+}}* [[T_VAR1_REF]],
566
567// __kmpc_end_reduce_nowait(<loc>, <gtid>, &<lock>);
568// CHECK: call void @__kmpc_end_reduce_nowait(%{{.+}}* [[REDUCTION_LOC]], i32 [[GTID]], [8 x i32]* [[REDUCTION_LOCK]])
569
570// break;
571// CHECK: br label %[[RED_DONE]]
572
573// case 2:
574// t_var += t_var_reduction;
575// CHECK: [[T_VAR_PRIV_VAL:%.+]] = load i{{[0-9]+}}, i{{[0-9]+}}* [[T_VAR_PRIV]]
576// CHECK: atomicrmw add i32* [[T_VAR_REF]], i32 [[T_VAR_PRIV_VAL]] monotonic
577
578// var = var.operator &(var_reduction);
579// CHECK: call void @__kmpc_critical(
580// CHECK: [[UP:%.+]] = call dereferenceable(4) [[S_INT_TY]]* @{{.+}}([[S_INT_TY]]* [[VAR_REF]], [[S_INT_TY]]* dereferenceable(4) [[VAR_PRIV]])
581// CHECK: [[BC1:%.+]] = bitcast [[S_INT_TY]]* [[VAR_REF]] to i8*
582// CHECK: [[BC2:%.+]] = bitcast [[S_INT_TY]]* [[UP]] to i8*
Pete Cooper3b39e882015-11-19 05:55:59 +0000583// CHECK: call void @llvm.memcpy.p0i8.p0i8.i64(i8* [[BC1]], i8* [[BC2]], i64 4, i32 4, i1 false)
Alexey Bataev794ba0d2015-04-10 10:43:45 +0000584// CHECK: call void @__kmpc_end_critical(
585
586// var1 = var1.operator &&(var1_reduction);
587// CHECK: call void @__kmpc_critical(
588// CHECK: [[TO_INT:%.+]] = call i{{[0-9]+}} @{{.+}}([[S_INT_TY]]* [[VAR1_REF]])
589// CHECK: [[VAR1_BOOL:%.+]] = icmp ne i{{[0-9]+}} [[TO_INT]], 0
Alexey Bataev69a47792015-05-07 03:54:03 +0000590// CHECK: br i1 [[VAR1_BOOL]], label %[[TRUE:.+]], label %[[END2:.+]]
Alexey Bataev794ba0d2015-04-10 10:43:45 +0000591// CHECK: [[TRUE]]
592// CHECK: [[TO_INT:%.+]] = call i{{[0-9]+}} @{{.+}}([[S_INT_TY]]* [[VAR1_PRIV]])
593// CHECK: [[VAR1_REDUCTION_BOOL:%.+]] = icmp ne i{{[0-9]+}} [[TO_INT]], 0
Alexey Bataev794ba0d2015-04-10 10:43:45 +0000594// CHECK: br label %[[END2]]
595// CHECK: [[END2]]
Alexey Bataev69a47792015-05-07 03:54:03 +0000596// CHECK: [[COND_LVALUE:%.+]] = phi i1 [ false, %{{.+}} ], [ [[VAR1_REDUCTION_BOOL]], %[[TRUE]] ]
597// CHECK: [[CONV:%.+]] = zext i1 [[COND_LVALUE]] to i32
598// CHECK: call void @{{.+}}([[S_INT_TY]]* [[COND_LVALUE:%.+]], i32 [[CONV]])
Alexey Bataev794ba0d2015-04-10 10:43:45 +0000599// CHECK: [[BC1:%.+]] = bitcast [[S_INT_TY]]* [[VAR1_REF]] to i8*
600// CHECK: [[BC2:%.+]] = bitcast [[S_INT_TY]]* [[COND_LVALUE]] to i8*
Pete Cooper3b39e882015-11-19 05:55:59 +0000601// CHECK: call void @llvm.memcpy.p0i8.p0i8.i64(i8* [[BC1]], i8* [[BC2]], i64 4, i32 4, i1 false)
Alexey Bataev794ba0d2015-04-10 10:43:45 +0000602// CHECK: call void @__kmpc_end_critical(
603
604// t_var1 = min(t_var1, t_var1_reduction);
605// CHECK: [[T_VAR1_PRIV_VAL:%.+]] = load i{{[0-9]+}}, i{{[0-9]+}}* [[T_VAR1_PRIV]]
606// CHECK: atomicrmw min i32* [[T_VAR1_REF]], i32 [[T_VAR1_PRIV_VAL]] monotonic
607
608// break;
609// CHECK: br label %[[RED_DONE]]
610// CHECK: [[RED_DONE]]
Alexey Bataev25e5b442015-09-15 12:52:43 +0000611// CHECK: call void @__kmpc_barrier(%{{.+}}* [[IMPLICIT_BARRIER_LOC]], i{{[0-9]+}} [[GTID]])
Alexey Bataev794ba0d2015-04-10 10:43:45 +0000612
613// CHECK-DAG: call {{.*}} [[S_INT_TY_DESTR]]([[S_INT_TY]]* [[VAR_PRIV]])
614// CHECK-DAG: call {{.*}} [[S_INT_TY_DESTR]]([[S_INT_TY]]*
615// CHECK: ret void
616
617// void reduce_func(void *lhs[<n>], void *rhs[<n>]) {
618// *(Type0*)lhs[0] = ReductionOperation0(*(Type0*)lhs[0], *(Type0*)rhs[0]);
619// ...
620// *(Type<n>-1*)lhs[<n>-1] = ReductionOperation<n>-1(*(Type<n>-1*)lhs[<n>-1],
621// *(Type<n>-1*)rhs[<n>-1]);
622// }
623// CHECK: define internal void [[REDUCTION_FUNC]](i8*, i8*)
624// t_var_lhs = (i{{[0-9]+}}*)lhs[0];
John McCall7f416cc2015-09-08 08:05:57 +0000625// CHECK: [[T_VAR_RHS_REF:%.+]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[RED_LIST_RHS:%.+]], i64 0, i64 0
Alexey Bataev794ba0d2015-04-10 10:43:45 +0000626// CHECK: [[T_VAR_RHS_VOID:%.+]] = load i8*, i8** [[T_VAR_RHS_REF]],
627// CHECK: [[T_VAR_RHS:%.+]] = bitcast i8* [[T_VAR_RHS_VOID]] to i{{[0-9]+}}*
628// t_var_rhs = (i{{[0-9]+}}*)rhs[0];
John McCall7f416cc2015-09-08 08:05:57 +0000629// CHECK: [[T_VAR_LHS_REF:%.+]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[RED_LIST_LHS:%.+]], i64 0, i64 0
Alexey Bataev794ba0d2015-04-10 10:43:45 +0000630// CHECK: [[T_VAR_LHS_VOID:%.+]] = load i8*, i8** [[T_VAR_LHS_REF]],
631// CHECK: [[T_VAR_LHS:%.+]] = bitcast i8* [[T_VAR_LHS_VOID]] to i{{[0-9]+}}*
632
633// var_lhs = (S<i{{[0-9]+}}>*)lhs[1];
John McCall7f416cc2015-09-08 08:05:57 +0000634// CHECK: [[VAR_RHS_REF:%.+]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[RED_LIST_RHS]], i64 0, i64 1
Alexey Bataev794ba0d2015-04-10 10:43:45 +0000635// CHECK: [[VAR_RHS_VOID:%.+]] = load i8*, i8** [[VAR_RHS_REF]],
636// CHECK: [[VAR_RHS:%.+]] = bitcast i8* [[VAR_RHS_VOID]] to [[S_INT_TY]]*
637// var_rhs = (S<i{{[0-9]+}}>*)rhs[1];
John McCall7f416cc2015-09-08 08:05:57 +0000638// CHECK: [[VAR_LHS_REF:%.+]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[RED_LIST_LHS]], i64 0, i64 1
Alexey Bataev794ba0d2015-04-10 10:43:45 +0000639// CHECK: [[VAR_LHS_VOID:%.+]] = load i8*, i8** [[VAR_LHS_REF]],
640// CHECK: [[VAR_LHS:%.+]] = bitcast i8* [[VAR_LHS_VOID]] to [[S_INT_TY]]*
641
642// var1_lhs = (S<i{{[0-9]+}}>*)lhs[2];
John McCall7f416cc2015-09-08 08:05:57 +0000643// CHECK: [[VAR1_RHS_REF:%.+]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[RED_LIST_RHS]], i64 0, i64 2
Alexey Bataev794ba0d2015-04-10 10:43:45 +0000644// CHECK: [[VAR1_RHS_VOID:%.+]] = load i8*, i8** [[VAR1_RHS_REF]],
645// CHECK: [[VAR1_RHS:%.+]] = bitcast i8* [[VAR1_RHS_VOID]] to [[S_INT_TY]]*
646// var1_rhs = (S<i{{[0-9]+}}>*)rhs[2];
John McCall7f416cc2015-09-08 08:05:57 +0000647// CHECK: [[VAR1_LHS_REF:%.+]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[RED_LIST_LHS]], i64 0, i64 2
Alexey Bataev794ba0d2015-04-10 10:43:45 +0000648// CHECK: [[VAR1_LHS_VOID:%.+]] = load i8*, i8** [[VAR1_LHS_REF]],
649// CHECK: [[VAR1_LHS:%.+]] = bitcast i8* [[VAR1_LHS_VOID]] to [[S_INT_TY]]*
650
651// t_var1_lhs = (i{{[0-9]+}}*)lhs[3];
John McCall7f416cc2015-09-08 08:05:57 +0000652// CHECK: [[T_VAR1_RHS_REF:%.+]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[RED_LIST_RHS]], i64 0, i64 3
Alexey Bataev794ba0d2015-04-10 10:43:45 +0000653// CHECK: [[T_VAR1_RHS_VOID:%.+]] = load i8*, i8** [[T_VAR1_RHS_REF]],
654// CHECK: [[T_VAR1_RHS:%.+]] = bitcast i8* [[T_VAR1_RHS_VOID]] to i{{[0-9]+}}*
655// t_var1_rhs = (i{{[0-9]+}}*)rhs[3];
John McCall7f416cc2015-09-08 08:05:57 +0000656// CHECK: [[T_VAR1_LHS_REF:%.+]] = getelementptr inbounds [4 x i8*], [4 x i8*]* [[RED_LIST_LHS]], i64 0, i64 3
Alexey Bataev794ba0d2015-04-10 10:43:45 +0000657// CHECK: [[T_VAR1_LHS_VOID:%.+]] = load i8*, i8** [[T_VAR1_LHS_REF]],
658// CHECK: [[T_VAR1_LHS:%.+]] = bitcast i8* [[T_VAR1_LHS_VOID]] to i{{[0-9]+}}*
659
660// t_var_lhs += t_var_rhs;
661// CHECK: [[T_VAR_LHS_VAL:%.+]] = load i{{[0-9]+}}, i{{[0-9]+}}* [[T_VAR_LHS]],
662// CHECK: [[T_VAR_RHS_VAL:%.+]] = load i{{[0-9]+}}, i{{[0-9]+}}* [[T_VAR_RHS]],
663// CHECK: [[UP:%.+]] = add nsw i{{[0-9]+}} [[T_VAR_LHS_VAL]], [[T_VAR_RHS_VAL]]
664// CHECK: store i{{[0-9]+}} [[UP]], i{{[0-9]+}}* [[T_VAR_LHS]],
665
666// var_lhs = var_lhs.operator &(var_rhs);
667// CHECK: [[UP:%.+]] = call dereferenceable(4) [[S_INT_TY]]* @{{.+}}([[S_INT_TY]]* [[VAR_LHS]], [[S_INT_TY]]* dereferenceable(4) [[VAR_RHS]])
668// CHECK: [[BC1:%.+]] = bitcast [[S_INT_TY]]* [[VAR_LHS]] to i8*
669// CHECK: [[BC2:%.+]] = bitcast [[S_INT_TY]]* [[UP]] to i8*
Pete Cooper3b39e882015-11-19 05:55:59 +0000670// CHECK: call void @llvm.memcpy.p0i8.p0i8.i64(i8* [[BC1]], i8* [[BC2]], i64 4, i32 4, i1 false)
Alexey Bataev794ba0d2015-04-10 10:43:45 +0000671
672// var1_lhs = var1_lhs.operator &&(var1_rhs);
673// CHECK: [[TO_INT:%.+]] = call i{{[0-9]+}} @{{.+}}([[S_INT_TY]]* [[VAR1_LHS]])
674// CHECK: [[VAR1_BOOL:%.+]] = icmp ne i{{[0-9]+}} [[TO_INT]], 0
Alexey Bataev69a47792015-05-07 03:54:03 +0000675// CHECK: br i1 [[VAR1_BOOL]], label %[[TRUE:.+]], label %[[END2:.+]]
Alexey Bataev794ba0d2015-04-10 10:43:45 +0000676// CHECK: [[TRUE]]
677// CHECK: [[TO_INT:%.+]] = call i{{[0-9]+}} @{{.+}}([[S_INT_TY]]* [[VAR1_RHS]])
678// CHECK: [[VAR1_REDUCTION_BOOL:%.+]] = icmp ne i{{[0-9]+}} [[TO_INT]], 0
Alexey Bataev794ba0d2015-04-10 10:43:45 +0000679// CHECK: br label %[[END2]]
680// CHECK: [[END2]]
Alexey Bataev69a47792015-05-07 03:54:03 +0000681// CHECK: [[COND_LVALUE:%.+]] = phi i1 [ false, %{{.+}} ], [ [[VAR1_REDUCTION_BOOL]], %[[TRUE]] ]
682// CHECK: [[CONV:%.+]] = zext i1 [[COND_LVALUE]] to i32
683// CHECK: call void @{{.+}}([[S_INT_TY]]* [[COND_LVALUE:%.+]], i32 [[CONV]])
Alexey Bataev794ba0d2015-04-10 10:43:45 +0000684// CHECK: [[BC1:%.+]] = bitcast [[S_INT_TY]]* [[VAR1_LHS]] to i8*
685// CHECK: [[BC2:%.+]] = bitcast [[S_INT_TY]]* [[COND_LVALUE]] to i8*
Pete Cooper3b39e882015-11-19 05:55:59 +0000686// CHECK: call void @llvm.memcpy.p0i8.p0i8.i64(i8* [[BC1]], i8* [[BC2]], i64 4, i32 4, i1 false)
Alexey Bataev794ba0d2015-04-10 10:43:45 +0000687
688// t_var1_lhs = min(t_var1_lhs, t_var1_rhs);
689// CHECK: [[T_VAR1_LHS_VAL:%.+]] = load i{{[0-9]+}}, i{{[0-9]+}}* [[T_VAR1_LHS]],
690// CHECK: [[T_VAR1_RHS_VAL:%.+]] = load i{{[0-9]+}}, i{{[0-9]+}}* [[T_VAR1_RHS]],
691// CHECK: [[CMP:%.+]] = icmp slt i{{[0-9]+}} [[T_VAR1_LHS_VAL]], [[T_VAR1_RHS_VAL]]
Alexey Bataev69a47792015-05-07 03:54:03 +0000692// CHECK: br i1 [[CMP]]
693// CHECK: [[UP:%.+]] = phi i32
Alexey Bataev794ba0d2015-04-10 10:43:45 +0000694// CHECK: store i{{[0-9]+}} [[UP]], i{{[0-9]+}}* [[T_VAR1_LHS]],
695// CHECK: ret void
696
697#endif
698