1*67e74705SXin Li // RUN: %clang_cc1 -verify -fopenmp -x c++ -triple x86_64-unknown-unknown -emit-llvm %s -fexceptions -fcxx-exceptions -o - | FileCheck %s
2*67e74705SXin Li // RUN: %clang_cc1 -fopenmp -x c++ -std=c++11 -triple x86_64-unknown-unknown -fexceptions -fcxx-exceptions -emit-pch -o %t %s
3*67e74705SXin Li // RUN: %clang_cc1 -fopenmp -x c++ -triple x86_64-unknown-unknown -fexceptions -fcxx-exceptions -std=c++11 -include-pch %t -verify %s -emit-llvm -o - | FileCheck %s
4*67e74705SXin Li // REQUIRES: x86-registered-target
5*67e74705SXin Li // expected-no-diagnostics
6*67e74705SXin Li #ifndef HEADER
7*67e74705SXin Li #define HEADER
8*67e74705SXin Li
9*67e74705SXin Li // CHECK: [[IDENT_T_TY:%.+]] = type { i32, i32, i32, i32, i8* }
10*67e74705SXin Li // CHECK: [[IMPLICIT_BARRIER_LOC:@.+]] = private unnamed_addr constant %{{.+}} { i32 0, i32 66, i32 0, i32 0, i8*
11*67e74705SXin Li // CHECK-LABEL: define {{.*void}} @{{.*}}static_not_chunked{{.*}}(float* {{.+}}, float* {{.+}}, float* {{.+}}, float* {{.+}})
static_not_chunked(float * a,float * b,float * c,float * d)12*67e74705SXin Li void static_not_chunked(float *a, float *b, float *c, float *d) {
13*67e74705SXin Li // CHECK: [[GTID:%.+]] = call i32 @__kmpc_global_thread_num([[IDENT_T_TY]]* [[DEFAULT_LOC:[@%].+]])
14*67e74705SXin Li #pragma omp for schedule(static) ordered
15*67e74705SXin Li // CHECK: call void @__kmpc_dispatch_init_4([[IDENT_T_TY]]* [[DEFAULT_LOC]], i32 [[GTID]], i32 66, i32 0, i32 4571423, i32 1, i32 1)
16*67e74705SXin Li //
17*67e74705SXin Li // CHECK: [[HASWORK:%.+]] = call i32 @__kmpc_dispatch_next_4([[IDENT_T_TY]]* [[DEFAULT_LOC]], i32 [[GTID]], i32* [[OMP_ISLAST:%[^,]+]], i32* [[OMP_LB:%[^,]+]], i32* [[OMP_UB:%[^,]+]], i32* [[OMP_ST:%[^,]+]])
18*67e74705SXin Li // CHECK-NEXT: [[O_CMP:%.+]] = icmp ne i32 [[HASWORK]], 0
19*67e74705SXin Li // CHECK-NEXT: br i1 [[O_CMP]], label %[[O_LOOP1_BODY:[^,]+]], label %[[O_LOOP1_END:[^,]+]]
20*67e74705SXin Li
21*67e74705SXin Li // Loop header
22*67e74705SXin Li // CHECK: [[O_LOOP1_BODY]]
23*67e74705SXin Li // CHECK: [[LB:%.+]] = load i32, i32* [[OMP_LB]]
24*67e74705SXin Li // CHECK-NEXT: store i32 [[LB]], i32* [[OMP_IV:[^,]+]]
25*67e74705SXin Li // CHECK: [[IV:%.+]] = load i32, i32* [[OMP_IV]]
26*67e74705SXin Li
27*67e74705SXin Li // CHECK-NEXT: [[UB:%.+]] = load i32, i32* [[OMP_UB]]
28*67e74705SXin Li // CHECK-NEXT: [[CMP:%.+]] = icmp sle i32 [[IV]], [[UB]]
29*67e74705SXin Li // CHECK-NEXT: br i1 [[CMP]], label %[[LOOP1_BODY:[^,]+]], label %[[LOOP1_END:[^,]+]]
30*67e74705SXin Li for (int i = 32000000; i > 33; i += -7) {
31*67e74705SXin Li // CHECK: [[LOOP1_BODY]]
32*67e74705SXin Li // Start of body: calculate i from IV:
33*67e74705SXin Li // CHECK: [[IV1_1:%.+]] = load i32, i32* [[OMP_IV]]
34*67e74705SXin Li // CHECK-NEXT: [[CALC_I_1:%.+]] = mul nsw i32 [[IV1_1]], 7
35*67e74705SXin Li // CHECK-NEXT: [[CALC_I_2:%.+]] = sub nsw i32 32000000, [[CALC_I_1]]
36*67e74705SXin Li // CHECK-NEXT: store i32 [[CALC_I_2]], i32* [[LC_I:.+]]
37*67e74705SXin Li
38*67e74705SXin Li // ... start of ordered region ...
39*67e74705SXin Li // CHECK-NEXT: call void @__kmpc_ordered([[IDENT_T_TY]]* [[DEFAULT_LOC]], i32 [[GTID]])
40*67e74705SXin Li // ... loop body ...
41*67e74705SXin Li // End of body: store into a[i]:
42*67e74705SXin Li // CHECK: store float [[RESULT:%.+]], float* {{%.+}}
43*67e74705SXin Li // CHECK-NOT: !llvm.mem.parallel_loop_access
44*67e74705SXin Li // CHECK-NEXT: call void @__kmpc_end_ordered([[IDENT_T_TY]]* [[DEFAULT_LOC]], i32 [[GTID]])
45*67e74705SXin Li // ... end of ordered region ...
46*67e74705SXin Li #pragma omp ordered
47*67e74705SXin Li a[i] = b[i] * c[i] * d[i];
48*67e74705SXin Li // CHECK: [[IV1_2:%.+]] = load i32, i32* [[OMP_IV]]{{.*}}
49*67e74705SXin Li // CHECK-NEXT: [[ADD1_2:%.+]] = add nsw i32 [[IV1_2]], 1
50*67e74705SXin Li // CHECK-NEXT: store i32 [[ADD1_2]], i32* [[OMP_IV]]
51*67e74705SXin Li // CHECK-NEXT: call void @__kmpc_dispatch_fini_4([[IDENT_T_TY]]* [[DEFAULT_LOC]], i32 [[GTID]])
52*67e74705SXin Li // CHECK-NEXT: br label %{{.+}}
53*67e74705SXin Li }
54*67e74705SXin Li // CHECK: [[LOOP1_END]]
55*67e74705SXin Li // CHECK: [[O_LOOP1_END]]
56*67e74705SXin Li // CHECK: call {{.+}} @__kmpc_barrier([[IDENT_T_TY]]* [[IMPLICIT_BARRIER_LOC]], i32 [[GTID]])
57*67e74705SXin Li // CHECK: ret void
58*67e74705SXin Li }
59*67e74705SXin Li
60*67e74705SXin Li // CHECK-LABEL: define {{.*void}} @{{.*}}dynamic1{{.*}}(float* {{.+}}, float* {{.+}}, float* {{.+}}, float* {{.+}})
dynamic1(float * a,float * b,float * c,float * d)61*67e74705SXin Li void dynamic1(float *a, float *b, float *c, float *d) {
62*67e74705SXin Li // CHECK: [[GTID:%.+]] = call i32 @__kmpc_global_thread_num([[IDENT_T_TY]]* [[DEFAULT_LOC:[@%].+]])
63*67e74705SXin Li #pragma omp for schedule(dynamic) ordered
64*67e74705SXin Li // CHECK: call void @__kmpc_dispatch_init_8u([[IDENT_T_TY]]* [[DEFAULT_LOC]], i32 [[GTID]], i32 67, i64 0, i64 16908287, i64 1, i64 1)
65*67e74705SXin Li //
66*67e74705SXin Li // CHECK: [[HASWORK:%.+]] = call i32 @__kmpc_dispatch_next_8u([[IDENT_T_TY]]* [[DEFAULT_LOC]], i32 [[GTID]], i32* [[OMP_ISLAST:%[^,]+]], i64* [[OMP_LB:%[^,]+]], i64* [[OMP_UB:%[^,]+]], i64* [[OMP_ST:%[^,]+]])
67*67e74705SXin Li // CHECK-NEXT: [[O_CMP:%.+]] = icmp ne i32 [[HASWORK]], 0
68*67e74705SXin Li // CHECK-NEXT: br i1 [[O_CMP]], label %[[O_LOOP1_BODY:[^,]+]], label %[[O_LOOP1_END:[^,]+]]
69*67e74705SXin Li
70*67e74705SXin Li // Loop header
71*67e74705SXin Li // CHECK: [[O_LOOP1_BODY]]
72*67e74705SXin Li // CHECK: [[LB:%.+]] = load i64, i64* [[OMP_LB]]
73*67e74705SXin Li // CHECK-NEXT: store i64 [[LB]], i64* [[OMP_IV:[^,]+]]
74*67e74705SXin Li // CHECK: [[IV:%.+]] = load i64, i64* [[OMP_IV]]
75*67e74705SXin Li
76*67e74705SXin Li // CHECK-NEXT: [[UB:%.+]] = load i64, i64* [[OMP_UB]]
77*67e74705SXin Li // CHECK-NEXT: [[CMP:%.+]] = icmp ule i64 [[IV]], [[UB]]
78*67e74705SXin Li // CHECK-NEXT: br i1 [[CMP]], label %[[LOOP1_BODY:[^,]+]], label %[[LOOP1_END:[^,]+]]
79*67e74705SXin Li for (unsigned long long i = 131071; i < 2147483647; i += 127) {
80*67e74705SXin Li // CHECK: [[LOOP1_BODY]]
81*67e74705SXin Li // Start of body: calculate i from IV:
82*67e74705SXin Li // CHECK: [[IV1_1:%.+]] = load i64, i64* [[OMP_IV]]
83*67e74705SXin Li // CHECK-NEXT: [[CALC_I_1:%.+]] = mul i64 [[IV1_1]], 127
84*67e74705SXin Li // CHECK-NEXT: [[CALC_I_2:%.+]] = add i64 131071, [[CALC_I_1]]
85*67e74705SXin Li // CHECK-NEXT: store i64 [[CALC_I_2]], i64* [[LC_I:.+]]
86*67e74705SXin Li
87*67e74705SXin Li // ... start of ordered region ...
88*67e74705SXin Li // CHECK-NEXT: call void @__kmpc_ordered([[IDENT_T_TY]]* [[DEFAULT_LOC]], i32 [[GTID]])
89*67e74705SXin Li // ... loop body ...
90*67e74705SXin Li // End of body: store into a[i]:
91*67e74705SXin Li // CHECK: store float [[RESULT:%.+]], float* {{%.+}}
92*67e74705SXin Li // CHECK-NOT: !llvm.mem.parallel_loop_access
93*67e74705SXin Li // CHECK-NEXT: call void @__kmpc_end_ordered([[IDENT_T_TY]]* [[DEFAULT_LOC]], i32 [[GTID]])
94*67e74705SXin Li // ... end of ordered region ...
95*67e74705SXin Li #pragma omp ordered threads
96*67e74705SXin Li a[i] = b[i] * c[i] * d[i];
97*67e74705SXin Li // CHECK: [[IV1_2:%.+]] = load i64, i64* [[OMP_IV]]{{.*}}
98*67e74705SXin Li // CHECK-NEXT: [[ADD1_2:%.+]] = add i64 [[IV1_2]], 1
99*67e74705SXin Li // CHECK-NEXT: store i64 [[ADD1_2]], i64* [[OMP_IV]]
100*67e74705SXin Li
101*67e74705SXin Li // ... end iteration for ordered loop ...
102*67e74705SXin Li // CHECK-NEXT: call void @__kmpc_dispatch_fini_8u([[IDENT_T_TY]]* [[DEFAULT_LOC]], i32 [[GTID]])
103*67e74705SXin Li // CHECK-NEXT: br label %{{.+}}
104*67e74705SXin Li }
105*67e74705SXin Li // CHECK: [[LOOP1_END]]
106*67e74705SXin Li // CHECK: [[O_LOOP1_END]]
107*67e74705SXin Li // CHECK: call {{.+}} @__kmpc_barrier([[IDENT_T_TY]]* [[IMPLICIT_BARRIER_LOC]], i32 [[GTID]])
108*67e74705SXin Li // CHECK: ret void
109*67e74705SXin Li }
110*67e74705SXin Li
111*67e74705SXin Li // CHECK-LABEL: define {{.*void}} @{{.*}}test_auto{{.*}}(float* {{.+}}, float* {{.+}}, float* {{.+}}, float* {{.+}})
test_auto(float * a,float * b,float * c,float * d)112*67e74705SXin Li void test_auto(float *a, float *b, float *c, float *d) {
113*67e74705SXin Li unsigned int x = 0;
114*67e74705SXin Li unsigned int y = 0;
115*67e74705SXin Li // CHECK: [[GTID:%.+]] = call i32 @__kmpc_global_thread_num([[IDENT_T_TY]]* [[DEFAULT_LOC:[@%].+]])
116*67e74705SXin Li #pragma omp for schedule(auto) collapse(2) ordered
117*67e74705SXin Li // CHECK: call void @__kmpc_dispatch_init_8([[IDENT_T_TY]]* [[DEFAULT_LOC]], i32 [[GTID]], i32 70, i64 0, i64 [[LAST_ITER:%[^,]+]], i64 1, i64 1)
118*67e74705SXin Li //
119*67e74705SXin Li // CHECK: [[HASWORK:%.+]] = call i32 @__kmpc_dispatch_next_8([[IDENT_T_TY]]* [[DEFAULT_LOC]], i32 [[GTID]], i32* [[OMP_ISLAST:%[^,]+]], i64* [[OMP_LB:%[^,]+]], i64* [[OMP_UB:%[^,]+]], i64* [[OMP_ST:%[^,]+]])
120*67e74705SXin Li // CHECK-NEXT: [[O_CMP:%.+]] = icmp ne i32 [[HASWORK]], 0
121*67e74705SXin Li // CHECK-NEXT: br i1 [[O_CMP]], label %[[O_LOOP1_BODY:[^,]+]], label %[[O_LOOP1_END:[^,]+]]
122*67e74705SXin Li
123*67e74705SXin Li // Loop header
124*67e74705SXin Li // CHECK: [[O_LOOP1_BODY]]
125*67e74705SXin Li // CHECK: [[LB:%.+]] = load i64, i64* [[OMP_LB]]
126*67e74705SXin Li // CHECK-NEXT: store i64 [[LB]], i64* [[OMP_IV:[^,]+]]
127*67e74705SXin Li // CHECK: [[IV:%.+]] = load i64, i64* [[OMP_IV]]
128*67e74705SXin Li
129*67e74705SXin Li // CHECK-NEXT: [[UB:%.+]] = load i64, i64* [[OMP_UB]]
130*67e74705SXin Li // CHECK-NEXT: [[CMP:%.+]] = icmp sle i64 [[IV]], [[UB]]
131*67e74705SXin Li // CHECK-NEXT: br i1 [[CMP]], label %[[LOOP1_BODY:[^,]+]], label %[[LOOP1_END:[^,]+]]
132*67e74705SXin Li // FIXME: When the iteration count of some nested loop is not a known constant,
133*67e74705SXin Li // we should pre-calculate it, like we do for the total number of iterations!
134*67e74705SXin Li for (char i = static_cast<char>(y); i <= '9'; ++i)
135*67e74705SXin Li for (x = 11; x > 0; --x) {
136*67e74705SXin Li // CHECK: [[LOOP1_BODY]]
137*67e74705SXin Li // Start of body: indices are calculated from IV:
138*67e74705SXin Li // CHECK: store i8 {{%[^,]+}}, i8* {{%[^,]+}}
139*67e74705SXin Li // CHECK: store i32 {{%[^,]+}}, i32* {{%[^,]+}}
140*67e74705SXin Li
141*67e74705SXin Li // ... start of ordered region ...
142*67e74705SXin Li // CHECK: call void @__kmpc_ordered([[IDENT_T_TY]]* [[DEFAULT_LOC]], i32 [[GTID]])
143*67e74705SXin Li // ... loop body ...
144*67e74705SXin Li // End of body: store into a[i]:
145*67e74705SXin Li // CHECK: store float [[RESULT:%.+]], float* {{%.+}}
146*67e74705SXin Li // CHECK-NOT: !llvm.mem.parallel_loop_access
147*67e74705SXin Li // CHECK-NEXT: call void @__kmpc_end_ordered([[IDENT_T_TY]]* [[DEFAULT_LOC]], i32 [[GTID]])
148*67e74705SXin Li // ... end of ordered region ...
149*67e74705SXin Li #pragma omp ordered
150*67e74705SXin Li a[i] = b[i] * c[i] * d[i];
151*67e74705SXin Li // CHECK: [[IV1_2:%.+]] = load i64, i64* [[OMP_IV]]{{.*}}
152*67e74705SXin Li // CHECK-NEXT: [[ADD1_2:%.+]] = add nsw i64 [[IV1_2]], 1
153*67e74705SXin Li // CHECK-NEXT: store i64 [[ADD1_2]], i64* [[OMP_IV]]
154*67e74705SXin Li
155*67e74705SXin Li // ... end iteration for ordered loop ...
156*67e74705SXin Li // CHECK-NEXT: call void @__kmpc_dispatch_fini_8([[IDENT_T_TY]]* [[DEFAULT_LOC]], i32 [[GTID]])
157*67e74705SXin Li // CHECK-NEXT: br label %{{.+}}
158*67e74705SXin Li }
159*67e74705SXin Li // CHECK: [[LOOP1_END]]
160*67e74705SXin Li // CHECK: [[O_LOOP1_END]]
161*67e74705SXin Li // CHECK: call {{.+}} @__kmpc_barrier([[IDENT_T_TY]]* [[IMPLICIT_BARRIER_LOC]], i32 [[GTID]])
162*67e74705SXin Li // CHECK: ret void
163*67e74705SXin Li }
164*67e74705SXin Li
165*67e74705SXin Li // CHECK-LABEL: define {{.*void}} @{{.*}}runtime{{.*}}(float* {{.+}}, float* {{.+}}, float* {{.+}}, float* {{.+}})
runtime(float * a,float * b,float * c,float * d)166*67e74705SXin Li void runtime(float *a, float *b, float *c, float *d) {
167*67e74705SXin Li int x = 0;
168*67e74705SXin Li // CHECK: [[GTID:%.+]] = call i32 @__kmpc_global_thread_num([[IDENT_T_TY]]* [[DEFAULT_LOC:[@%].+]])
169*67e74705SXin Li #pragma omp for collapse(2) schedule(runtime) ordered
170*67e74705SXin Li // CHECK: call void @__kmpc_dispatch_init_4([[IDENT_T_TY]]* [[DEFAULT_LOC]], i32 [[GTID]], i32 69, i32 0, i32 199, i32 1, i32 1)
171*67e74705SXin Li //
172*67e74705SXin Li // CHECK: [[HASWORK:%.+]] = call i32 @__kmpc_dispatch_next_4([[IDENT_T_TY]]* [[DEFAULT_LOC]], i32 [[GTID]], i32* [[OMP_ISLAST:%[^,]+]], i32* [[OMP_LB:%[^,]+]], i32* [[OMP_UB:%[^,]+]], i32* [[OMP_ST:%[^,]+]])
173*67e74705SXin Li // CHECK-NEXT: [[O_CMP:%.+]] = icmp ne i32 [[HASWORK]], 0
174*67e74705SXin Li // CHECK-NEXT: br i1 [[O_CMP]], label %[[O_LOOP1_BODY:[^,]+]], label %[[O_LOOP1_END:[^,]+]]
175*67e74705SXin Li
176*67e74705SXin Li // Loop header
177*67e74705SXin Li // CHECK: [[O_LOOP1_BODY]]
178*67e74705SXin Li // CHECK: [[LB:%.+]] = load i32, i32* [[OMP_LB]]
179*67e74705SXin Li // CHECK-NEXT: store i32 [[LB]], i32* [[OMP_IV:[^,]+]]
180*67e74705SXin Li // CHECK: [[IV:%.+]] = load i32, i32* [[OMP_IV]]
181*67e74705SXin Li
182*67e74705SXin Li // CHECK-NEXT: [[UB:%.+]] = load i32, i32* [[OMP_UB]]
183*67e74705SXin Li // CHECK-NEXT: [[CMP:%.+]] = icmp sle i32 [[IV]], [[UB]]
184*67e74705SXin Li // CHECK-NEXT: br i1 [[CMP]], label %[[LOOP1_BODY:[^,]+]], label %[[LOOP1_END:[^,]+]]
185*67e74705SXin Li for (unsigned char i = '0' ; i <= '9'; ++i)
186*67e74705SXin Li for (x = -10; x < 10; ++x) {
187*67e74705SXin Li // CHECK: [[LOOP1_BODY]]
188*67e74705SXin Li // Start of body: indices are calculated from IV:
189*67e74705SXin Li // CHECK: store i8 {{%[^,]+}}, i8* {{%[^,]+}}
190*67e74705SXin Li // CHECK: store i32 {{%[^,]+}}, i32* {{%[^,]+}}
191*67e74705SXin Li
192*67e74705SXin Li // ... start of ordered region ...
193*67e74705SXin Li // CHECK: call void @__kmpc_ordered([[IDENT_T_TY]]* [[DEFAULT_LOC]], i32 [[GTID]])
194*67e74705SXin Li // ... loop body ...
195*67e74705SXin Li // End of body: store into a[i]:
196*67e74705SXin Li // CHECK: store float [[RESULT:%.+]], float* {{%.+}}
197*67e74705SXin Li // CHECK-NOT: !llvm.mem.parallel_loop_access
198*67e74705SXin Li // CHECK-NEXT: call void @__kmpc_end_ordered([[IDENT_T_TY]]* [[DEFAULT_LOC]], i32 [[GTID]])
199*67e74705SXin Li // ... end of ordered region ...
200*67e74705SXin Li #pragma omp ordered threads
201*67e74705SXin Li a[i] = b[i] * c[i] * d[i];
202*67e74705SXin Li // CHECK: [[IV1_2:%.+]] = load i32, i32* [[OMP_IV]]{{.*}}
203*67e74705SXin Li // CHECK-NEXT: [[ADD1_2:%.+]] = add nsw i32 [[IV1_2]], 1
204*67e74705SXin Li // CHECK-NEXT: store i32 [[ADD1_2]], i32* [[OMP_IV]]
205*67e74705SXin Li
206*67e74705SXin Li // ... end iteration for ordered loop ...
207*67e74705SXin Li // CHECK-NEXT: call void @__kmpc_dispatch_fini_4([[IDENT_T_TY]]* [[DEFAULT_LOC]], i32 [[GTID]])
208*67e74705SXin Li // CHECK-NEXT: br label %{{.+}}
209*67e74705SXin Li }
210*67e74705SXin Li // CHECK: [[LOOP1_END]]
211*67e74705SXin Li // CHECK: [[O_LOOP1_END]]
212*67e74705SXin Li // CHECK: call {{.+}} @__kmpc_barrier([[IDENT_T_TY]]* [[IMPLICIT_BARRIER_LOC]], i32 [[GTID]])
213*67e74705SXin Li // CHECK: ret void
214*67e74705SXin Li }
215*67e74705SXin Li
216*67e74705SXin Li float f[10];
217*67e74705SXin Li // CHECK-LABEL: foo_simd
foo_simd(int low,int up)218*67e74705SXin Li void foo_simd(int low, int up) {
219*67e74705SXin Li // CHECK: store float 0.000000e+00, float* %{{.+}}, align {{[0-9]+}}, !llvm.mem.parallel_loop_access !
220*67e74705SXin Li // CHECK-NEXT: call void [[CAP_FUNC:@.+]](i32* %{{.+}}) #{{[0-9]+}}, !llvm.mem.parallel_loop_access !
221*67e74705SXin Li #pragma omp simd
222*67e74705SXin Li for (int i = low; i < up; ++i) {
223*67e74705SXin Li f[i] = 0.0;
224*67e74705SXin Li #pragma omp ordered simd
225*67e74705SXin Li f[i] = 1.0;
226*67e74705SXin Li }
227*67e74705SXin Li // CHECK: store float 0.000000e+00, float* %{{.+}}, align {{[0-9]+}}
228*67e74705SXin Li // CHECK-NEXT: call void [[CAP_FUNC:@.+]](i32* %{{.+}}) #{{[0-9]+}}
229*67e74705SXin Li #pragma omp for simd ordered
230*67e74705SXin Li for (int i = low; i < up; ++i) {
231*67e74705SXin Li f[i] = 0.0;
232*67e74705SXin Li #pragma omp ordered simd
233*67e74705SXin Li f[i] = 1.0;
234*67e74705SXin Li }
235*67e74705SXin Li }
236*67e74705SXin Li
237*67e74705SXin Li // CHECK: define internal void [[CAP_FUNC]](i32* dereferenceable({{[0-9]+}}) %{{.+}}) #
238*67e74705SXin Li // CHECK: store float 1.000000e+00, float* %{{.+}}, align
239*67e74705SXin Li // CHECK-NEXT: ret void
240*67e74705SXin Li
241*67e74705SXin Li #endif // HEADER
242*67e74705SXin Li
243