1 ; RUN: opt < %s -loop-vectorize -force-vector-width=4 -dce -instcombine -licm -S | FileCheck %s
3 target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128"
4 target triple = "x86_64-unknown-linux-gnu"
7 ;CHECK: llvm.sqrt.v4f32
9 define void @sqrt_f32(i32 %n, float* noalias %y, float* noalias %x) nounwind uwtable {
11 %cmp6 = icmp sgt i32 %n, 0
12 br i1 %cmp6, label %for.body, label %for.end
14 for.body: ; preds = %entry, %for.body
15 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
16 %arrayidx = getelementptr inbounds float* %y, i64 %indvars.iv
17 %0 = load float* %arrayidx, align 4, !tbaa !0
18 %call = tail call float @llvm.sqrt.f32(float %0) nounwind readnone
19 %arrayidx2 = getelementptr inbounds float* %x, i64 %indvars.iv
20 store float %call, float* %arrayidx2, align 4, !tbaa !0
21 %indvars.iv.next = add i64 %indvars.iv, 1
22 %lftr.wideiv = trunc i64 %indvars.iv.next to i32
23 %exitcond = icmp eq i32 %lftr.wideiv, %n
24 br i1 %exitcond, label %for.end, label %for.body
26 for.end: ; preds = %for.body, %entry
30 declare float @llvm.sqrt.f32(float) nounwind readnone
33 ;CHECK: llvm.sqrt.v4f64
35 define void @sqrt_f64(i32 %n, double* noalias %y, double* noalias %x) nounwind uwtable {
37 %cmp6 = icmp sgt i32 %n, 0
38 br i1 %cmp6, label %for.body, label %for.end
40 for.body: ; preds = %entry, %for.body
41 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
42 %arrayidx = getelementptr inbounds double* %y, i64 %indvars.iv
43 %0 = load double* %arrayidx, align 8, !tbaa !3
44 %call = tail call double @llvm.sqrt.f64(double %0) nounwind readnone
45 %arrayidx2 = getelementptr inbounds double* %x, i64 %indvars.iv
46 store double %call, double* %arrayidx2, align 8, !tbaa !3
47 %indvars.iv.next = add i64 %indvars.iv, 1
48 %lftr.wideiv = trunc i64 %indvars.iv.next to i32
49 %exitcond = icmp eq i32 %lftr.wideiv, %n
50 br i1 %exitcond, label %for.end, label %for.body
52 for.end: ; preds = %for.body, %entry
56 declare double @llvm.sqrt.f64(double) nounwind readnone
59 ;CHECK: llvm.sin.v4f32
61 define void @sin_f32(i32 %n, float* noalias %y, float* noalias %x) nounwind uwtable {
63 %cmp6 = icmp sgt i32 %n, 0
64 br i1 %cmp6, label %for.body, label %for.end
66 for.body: ; preds = %entry, %for.body
67 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
68 %arrayidx = getelementptr inbounds float* %y, i64 %indvars.iv
69 %0 = load float* %arrayidx, align 4, !tbaa !0
70 %call = tail call float @llvm.sin.f32(float %0) nounwind readnone
71 %arrayidx2 = getelementptr inbounds float* %x, i64 %indvars.iv
72 store float %call, float* %arrayidx2, align 4, !tbaa !0
73 %indvars.iv.next = add i64 %indvars.iv, 1
74 %lftr.wideiv = trunc i64 %indvars.iv.next to i32
75 %exitcond = icmp eq i32 %lftr.wideiv, %n
76 br i1 %exitcond, label %for.end, label %for.body
78 for.end: ; preds = %for.body, %entry
82 declare float @llvm.sin.f32(float) nounwind readnone
85 ;CHECK: llvm.sin.v4f64
87 define void @sin_f64(i32 %n, double* noalias %y, double* noalias %x) nounwind uwtable {
89 %cmp6 = icmp sgt i32 %n, 0
90 br i1 %cmp6, label %for.body, label %for.end
92 for.body: ; preds = %entry, %for.body
93 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
94 %arrayidx = getelementptr inbounds double* %y, i64 %indvars.iv
95 %0 = load double* %arrayidx, align 8, !tbaa !3
96 %call = tail call double @llvm.sin.f64(double %0) nounwind readnone
97 %arrayidx2 = getelementptr inbounds double* %x, i64 %indvars.iv
98 store double %call, double* %arrayidx2, align 8, !tbaa !3
99 %indvars.iv.next = add i64 %indvars.iv, 1
100 %lftr.wideiv = trunc i64 %indvars.iv.next to i32
101 %exitcond = icmp eq i32 %lftr.wideiv, %n
102 br i1 %exitcond, label %for.end, label %for.body
104 for.end: ; preds = %for.body, %entry
108 declare double @llvm.sin.f64(double) nounwind readnone
111 ;CHECK: llvm.cos.v4f32
113 define void @cos_f32(i32 %n, float* noalias %y, float* noalias %x) nounwind uwtable {
115 %cmp6 = icmp sgt i32 %n, 0
116 br i1 %cmp6, label %for.body, label %for.end
118 for.body: ; preds = %entry, %for.body
119 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
120 %arrayidx = getelementptr inbounds float* %y, i64 %indvars.iv
121 %0 = load float* %arrayidx, align 4, !tbaa !0
122 %call = tail call float @llvm.cos.f32(float %0) nounwind readnone
123 %arrayidx2 = getelementptr inbounds float* %x, i64 %indvars.iv
124 store float %call, float* %arrayidx2, align 4, !tbaa !0
125 %indvars.iv.next = add i64 %indvars.iv, 1
126 %lftr.wideiv = trunc i64 %indvars.iv.next to i32
127 %exitcond = icmp eq i32 %lftr.wideiv, %n
128 br i1 %exitcond, label %for.end, label %for.body
130 for.end: ; preds = %for.body, %entry
134 declare float @llvm.cos.f32(float) nounwind readnone
137 ;CHECK: llvm.cos.v4f64
139 define void @cos_f64(i32 %n, double* noalias %y, double* noalias %x) nounwind uwtable {
141 %cmp6 = icmp sgt i32 %n, 0
142 br i1 %cmp6, label %for.body, label %for.end
144 for.body: ; preds = %entry, %for.body
145 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
146 %arrayidx = getelementptr inbounds double* %y, i64 %indvars.iv
147 %0 = load double* %arrayidx, align 8, !tbaa !3
148 %call = tail call double @llvm.cos.f64(double %0) nounwind readnone
149 %arrayidx2 = getelementptr inbounds double* %x, i64 %indvars.iv
150 store double %call, double* %arrayidx2, align 8, !tbaa !3
151 %indvars.iv.next = add i64 %indvars.iv, 1
152 %lftr.wideiv = trunc i64 %indvars.iv.next to i32
153 %exitcond = icmp eq i32 %lftr.wideiv, %n
154 br i1 %exitcond, label %for.end, label %for.body
156 for.end: ; preds = %for.body, %entry
160 declare double @llvm.cos.f64(double) nounwind readnone
163 ;CHECK: llvm.exp.v4f32
165 define void @exp_f32(i32 %n, float* noalias %y, float* noalias %x) nounwind uwtable {
167 %cmp6 = icmp sgt i32 %n, 0
168 br i1 %cmp6, label %for.body, label %for.end
170 for.body: ; preds = %entry, %for.body
171 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
172 %arrayidx = getelementptr inbounds float* %y, i64 %indvars.iv
173 %0 = load float* %arrayidx, align 4, !tbaa !0
174 %call = tail call float @llvm.exp.f32(float %0) nounwind readnone
175 %arrayidx2 = getelementptr inbounds float* %x, i64 %indvars.iv
176 store float %call, float* %arrayidx2, align 4, !tbaa !0
177 %indvars.iv.next = add i64 %indvars.iv, 1
178 %lftr.wideiv = trunc i64 %indvars.iv.next to i32
179 %exitcond = icmp eq i32 %lftr.wideiv, %n
180 br i1 %exitcond, label %for.end, label %for.body
182 for.end: ; preds = %for.body, %entry
186 declare float @llvm.exp.f32(float) nounwind readnone
189 ;CHECK: llvm.exp.v4f64
191 define void @exp_f64(i32 %n, double* noalias %y, double* noalias %x) nounwind uwtable {
193 %cmp6 = icmp sgt i32 %n, 0
194 br i1 %cmp6, label %for.body, label %for.end
196 for.body: ; preds = %entry, %for.body
197 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
198 %arrayidx = getelementptr inbounds double* %y, i64 %indvars.iv
199 %0 = load double* %arrayidx, align 8, !tbaa !3
200 %call = tail call double @llvm.exp.f64(double %0) nounwind readnone
201 %arrayidx2 = getelementptr inbounds double* %x, i64 %indvars.iv
202 store double %call, double* %arrayidx2, align 8, !tbaa !3
203 %indvars.iv.next = add i64 %indvars.iv, 1
204 %lftr.wideiv = trunc i64 %indvars.iv.next to i32
205 %exitcond = icmp eq i32 %lftr.wideiv, %n
206 br i1 %exitcond, label %for.end, label %for.body
208 for.end: ; preds = %for.body, %entry
212 declare double @llvm.exp.f64(double) nounwind readnone
215 ;CHECK: llvm.exp2.v4f32
217 define void @exp2_f32(i32 %n, float* noalias %y, float* noalias %x) nounwind uwtable {
219 %cmp6 = icmp sgt i32 %n, 0
220 br i1 %cmp6, label %for.body, label %for.end
222 for.body: ; preds = %entry, %for.body
223 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
224 %arrayidx = getelementptr inbounds float* %y, i64 %indvars.iv
225 %0 = load float* %arrayidx, align 4, !tbaa !0
226 %call = tail call float @llvm.exp2.f32(float %0) nounwind readnone
227 %arrayidx2 = getelementptr inbounds float* %x, i64 %indvars.iv
228 store float %call, float* %arrayidx2, align 4, !tbaa !0
229 %indvars.iv.next = add i64 %indvars.iv, 1
230 %lftr.wideiv = trunc i64 %indvars.iv.next to i32
231 %exitcond = icmp eq i32 %lftr.wideiv, %n
232 br i1 %exitcond, label %for.end, label %for.body
234 for.end: ; preds = %for.body, %entry
238 declare float @llvm.exp2.f32(float) nounwind readnone
241 ;CHECK: llvm.exp2.v4f64
243 define void @exp2_f64(i32 %n, double* noalias %y, double* noalias %x) nounwind uwtable {
245 %cmp6 = icmp sgt i32 %n, 0
246 br i1 %cmp6, label %for.body, label %for.end
248 for.body: ; preds = %entry, %for.body
249 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
250 %arrayidx = getelementptr inbounds double* %y, i64 %indvars.iv
251 %0 = load double* %arrayidx, align 8, !tbaa !3
252 %call = tail call double @llvm.exp2.f64(double %0) nounwind readnone
253 %arrayidx2 = getelementptr inbounds double* %x, i64 %indvars.iv
254 store double %call, double* %arrayidx2, align 8, !tbaa !3
255 %indvars.iv.next = add i64 %indvars.iv, 1
256 %lftr.wideiv = trunc i64 %indvars.iv.next to i32
257 %exitcond = icmp eq i32 %lftr.wideiv, %n
258 br i1 %exitcond, label %for.end, label %for.body
260 for.end: ; preds = %for.body, %entry
264 declare double @llvm.exp2.f64(double) nounwind readnone
267 ;CHECK: llvm.log.v4f32
269 define void @log_f32(i32 %n, float* noalias %y, float* noalias %x) nounwind uwtable {
271 %cmp6 = icmp sgt i32 %n, 0
272 br i1 %cmp6, label %for.body, label %for.end
274 for.body: ; preds = %entry, %for.body
275 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
276 %arrayidx = getelementptr inbounds float* %y, i64 %indvars.iv
277 %0 = load float* %arrayidx, align 4, !tbaa !0
278 %call = tail call float @llvm.log.f32(float %0) nounwind readnone
279 %arrayidx2 = getelementptr inbounds float* %x, i64 %indvars.iv
280 store float %call, float* %arrayidx2, align 4, !tbaa !0
281 %indvars.iv.next = add i64 %indvars.iv, 1
282 %lftr.wideiv = trunc i64 %indvars.iv.next to i32
283 %exitcond = icmp eq i32 %lftr.wideiv, %n
284 br i1 %exitcond, label %for.end, label %for.body
286 for.end: ; preds = %for.body, %entry
290 declare float @llvm.log.f32(float) nounwind readnone
293 ;CHECK: llvm.log.v4f64
295 define void @log_f64(i32 %n, double* noalias %y, double* noalias %x) nounwind uwtable {
297 %cmp6 = icmp sgt i32 %n, 0
298 br i1 %cmp6, label %for.body, label %for.end
300 for.body: ; preds = %entry, %for.body
301 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
302 %arrayidx = getelementptr inbounds double* %y, i64 %indvars.iv
303 %0 = load double* %arrayidx, align 8, !tbaa !3
304 %call = tail call double @llvm.log.f64(double %0) nounwind readnone
305 %arrayidx2 = getelementptr inbounds double* %x, i64 %indvars.iv
306 store double %call, double* %arrayidx2, align 8, !tbaa !3
307 %indvars.iv.next = add i64 %indvars.iv, 1
308 %lftr.wideiv = trunc i64 %indvars.iv.next to i32
309 %exitcond = icmp eq i32 %lftr.wideiv, %n
310 br i1 %exitcond, label %for.end, label %for.body
312 for.end: ; preds = %for.body, %entry
316 declare double @llvm.log.f64(double) nounwind readnone
319 ;CHECK: llvm.log10.v4f32
321 define void @log10_f32(i32 %n, float* noalias %y, float* noalias %x) nounwind uwtable {
323 %cmp6 = icmp sgt i32 %n, 0
324 br i1 %cmp6, label %for.body, label %for.end
326 for.body: ; preds = %entry, %for.body
327 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
328 %arrayidx = getelementptr inbounds float* %y, i64 %indvars.iv
329 %0 = load float* %arrayidx, align 4, !tbaa !0
330 %call = tail call float @llvm.log10.f32(float %0) nounwind readnone
331 %arrayidx2 = getelementptr inbounds float* %x, i64 %indvars.iv
332 store float %call, float* %arrayidx2, align 4, !tbaa !0
333 %indvars.iv.next = add i64 %indvars.iv, 1
334 %lftr.wideiv = trunc i64 %indvars.iv.next to i32
335 %exitcond = icmp eq i32 %lftr.wideiv, %n
336 br i1 %exitcond, label %for.end, label %for.body
338 for.end: ; preds = %for.body, %entry
342 declare float @llvm.log10.f32(float) nounwind readnone
345 ;CHECK: llvm.log10.v4f64
347 define void @log10_f64(i32 %n, double* noalias %y, double* noalias %x) nounwind uwtable {
349 %cmp6 = icmp sgt i32 %n, 0
350 br i1 %cmp6, label %for.body, label %for.end
352 for.body: ; preds = %entry, %for.body
353 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
354 %arrayidx = getelementptr inbounds double* %y, i64 %indvars.iv
355 %0 = load double* %arrayidx, align 8, !tbaa !3
356 %call = tail call double @llvm.log10.f64(double %0) nounwind readnone
357 %arrayidx2 = getelementptr inbounds double* %x, i64 %indvars.iv
358 store double %call, double* %arrayidx2, align 8, !tbaa !3
359 %indvars.iv.next = add i64 %indvars.iv, 1
360 %lftr.wideiv = trunc i64 %indvars.iv.next to i32
361 %exitcond = icmp eq i32 %lftr.wideiv, %n
362 br i1 %exitcond, label %for.end, label %for.body
364 for.end: ; preds = %for.body, %entry
368 declare double @llvm.log10.f64(double) nounwind readnone
371 ;CHECK: llvm.log2.v4f32
373 define void @log2_f32(i32 %n, float* noalias %y, float* noalias %x) nounwind uwtable {
375 %cmp6 = icmp sgt i32 %n, 0
376 br i1 %cmp6, label %for.body, label %for.end
378 for.body: ; preds = %entry, %for.body
379 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
380 %arrayidx = getelementptr inbounds float* %y, i64 %indvars.iv
381 %0 = load float* %arrayidx, align 4, !tbaa !0
382 %call = tail call float @llvm.log2.f32(float %0) nounwind readnone
383 %arrayidx2 = getelementptr inbounds float* %x, i64 %indvars.iv
384 store float %call, float* %arrayidx2, align 4, !tbaa !0
385 %indvars.iv.next = add i64 %indvars.iv, 1
386 %lftr.wideiv = trunc i64 %indvars.iv.next to i32
387 %exitcond = icmp eq i32 %lftr.wideiv, %n
388 br i1 %exitcond, label %for.end, label %for.body
390 for.end: ; preds = %for.body, %entry
394 declare float @llvm.log2.f32(float) nounwind readnone
397 ;CHECK: llvm.log2.v4f64
399 define void @log2_f64(i32 %n, double* noalias %y, double* noalias %x) nounwind uwtable {
401 %cmp6 = icmp sgt i32 %n, 0
402 br i1 %cmp6, label %for.body, label %for.end
404 for.body: ; preds = %entry, %for.body
405 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
406 %arrayidx = getelementptr inbounds double* %y, i64 %indvars.iv
407 %0 = load double* %arrayidx, align 8, !tbaa !3
408 %call = tail call double @llvm.log2.f64(double %0) nounwind readnone
409 %arrayidx2 = getelementptr inbounds double* %x, i64 %indvars.iv
410 store double %call, double* %arrayidx2, align 8, !tbaa !3
411 %indvars.iv.next = add i64 %indvars.iv, 1
412 %lftr.wideiv = trunc i64 %indvars.iv.next to i32
413 %exitcond = icmp eq i32 %lftr.wideiv, %n
414 br i1 %exitcond, label %for.end, label %for.body
416 for.end: ; preds = %for.body, %entry
420 declare double @llvm.log2.f64(double) nounwind readnone
423 ;CHECK: llvm.fabs.v4f32
425 define void @fabs_f32(i32 %n, float* noalias %y, float* noalias %x) nounwind uwtable {
427 %cmp6 = icmp sgt i32 %n, 0
428 br i1 %cmp6, label %for.body, label %for.end
430 for.body: ; preds = %entry, %for.body
431 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
432 %arrayidx = getelementptr inbounds float* %y, i64 %indvars.iv
433 %0 = load float* %arrayidx, align 4, !tbaa !0
434 %call = tail call float @llvm.fabs.f32(float %0) nounwind readnone
435 %arrayidx2 = getelementptr inbounds float* %x, i64 %indvars.iv
436 store float %call, float* %arrayidx2, align 4, !tbaa !0
437 %indvars.iv.next = add i64 %indvars.iv, 1
438 %lftr.wideiv = trunc i64 %indvars.iv.next to i32
439 %exitcond = icmp eq i32 %lftr.wideiv, %n
440 br i1 %exitcond, label %for.end, label %for.body
442 for.end: ; preds = %for.body, %entry
446 declare float @llvm.fabs.f32(float) nounwind readnone
448 define void @fabs_f64(i32 %n, double* noalias %y, double* noalias %x) nounwind uwtable {
450 %cmp6 = icmp sgt i32 %n, 0
451 br i1 %cmp6, label %for.body, label %for.end
453 for.body: ; preds = %entry, %for.body
454 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
455 %arrayidx = getelementptr inbounds double* %y, i64 %indvars.iv
456 %0 = load double* %arrayidx, align 8, !tbaa !3
457 %call = tail call double @llvm.fabs(double %0) nounwind readnone
458 %arrayidx2 = getelementptr inbounds double* %x, i64 %indvars.iv
459 store double %call, double* %arrayidx2, align 8, !tbaa !3
460 %indvars.iv.next = add i64 %indvars.iv, 1
461 %lftr.wideiv = trunc i64 %indvars.iv.next to i32
462 %exitcond = icmp eq i32 %lftr.wideiv, %n
463 br i1 %exitcond, label %for.end, label %for.body
465 for.end: ; preds = %for.body, %entry
469 declare double @llvm.fabs(double) nounwind readnone
472 ;CHECK: llvm.floor.v4f32
474 define void @floor_f32(i32 %n, float* noalias %y, float* noalias %x) nounwind uwtable {
476 %cmp6 = icmp sgt i32 %n, 0
477 br i1 %cmp6, label %for.body, label %for.end
479 for.body: ; preds = %entry, %for.body
480 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
481 %arrayidx = getelementptr inbounds float* %y, i64 %indvars.iv
482 %0 = load float* %arrayidx, align 4, !tbaa !0
483 %call = tail call float @llvm.floor.f32(float %0) nounwind readnone
484 %arrayidx2 = getelementptr inbounds float* %x, i64 %indvars.iv
485 store float %call, float* %arrayidx2, align 4, !tbaa !0
486 %indvars.iv.next = add i64 %indvars.iv, 1
487 %lftr.wideiv = trunc i64 %indvars.iv.next to i32
488 %exitcond = icmp eq i32 %lftr.wideiv, %n
489 br i1 %exitcond, label %for.end, label %for.body
491 for.end: ; preds = %for.body, %entry
495 declare float @llvm.floor.f32(float) nounwind readnone
498 ;CHECK: llvm.floor.v4f64
500 define void @floor_f64(i32 %n, double* noalias %y, double* noalias %x) nounwind uwtable {
502 %cmp6 = icmp sgt i32 %n, 0
503 br i1 %cmp6, label %for.body, label %for.end
505 for.body: ; preds = %entry, %for.body
506 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
507 %arrayidx = getelementptr inbounds double* %y, i64 %indvars.iv
508 %0 = load double* %arrayidx, align 8, !tbaa !3
509 %call = tail call double @llvm.floor.f64(double %0) nounwind readnone
510 %arrayidx2 = getelementptr inbounds double* %x, i64 %indvars.iv
511 store double %call, double* %arrayidx2, align 8, !tbaa !3
512 %indvars.iv.next = add i64 %indvars.iv, 1
513 %lftr.wideiv = trunc i64 %indvars.iv.next to i32
514 %exitcond = icmp eq i32 %lftr.wideiv, %n
515 br i1 %exitcond, label %for.end, label %for.body
517 for.end: ; preds = %for.body, %entry
521 declare double @llvm.floor.f64(double) nounwind readnone
524 ;CHECK: llvm.ceil.v4f32
526 define void @ceil_f32(i32 %n, float* noalias %y, float* noalias %x) nounwind uwtable {
528 %cmp6 = icmp sgt i32 %n, 0
529 br i1 %cmp6, label %for.body, label %for.end
531 for.body: ; preds = %entry, %for.body
532 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
533 %arrayidx = getelementptr inbounds float* %y, i64 %indvars.iv
534 %0 = load float* %arrayidx, align 4, !tbaa !0
535 %call = tail call float @llvm.ceil.f32(float %0) nounwind readnone
536 %arrayidx2 = getelementptr inbounds float* %x, i64 %indvars.iv
537 store float %call, float* %arrayidx2, align 4, !tbaa !0
538 %indvars.iv.next = add i64 %indvars.iv, 1
539 %lftr.wideiv = trunc i64 %indvars.iv.next to i32
540 %exitcond = icmp eq i32 %lftr.wideiv, %n
541 br i1 %exitcond, label %for.end, label %for.body
543 for.end: ; preds = %for.body, %entry
547 declare float @llvm.ceil.f32(float) nounwind readnone
550 ;CHECK: llvm.ceil.v4f64
552 define void @ceil_f64(i32 %n, double* noalias %y, double* noalias %x) nounwind uwtable {
554 %cmp6 = icmp sgt i32 %n, 0
555 br i1 %cmp6, label %for.body, label %for.end
557 for.body: ; preds = %entry, %for.body
558 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
559 %arrayidx = getelementptr inbounds double* %y, i64 %indvars.iv
560 %0 = load double* %arrayidx, align 8, !tbaa !3
561 %call = tail call double @llvm.ceil.f64(double %0) nounwind readnone
562 %arrayidx2 = getelementptr inbounds double* %x, i64 %indvars.iv
563 store double %call, double* %arrayidx2, align 8, !tbaa !3
564 %indvars.iv.next = add i64 %indvars.iv, 1
565 %lftr.wideiv = trunc i64 %indvars.iv.next to i32
566 %exitcond = icmp eq i32 %lftr.wideiv, %n
567 br i1 %exitcond, label %for.end, label %for.body
569 for.end: ; preds = %for.body, %entry
573 declare double @llvm.ceil.f64(double) nounwind readnone
576 ;CHECK: llvm.trunc.v4f32
578 define void @trunc_f32(i32 %n, float* noalias %y, float* noalias %x) nounwind uwtable {
580 %cmp6 = icmp sgt i32 %n, 0
581 br i1 %cmp6, label %for.body, label %for.end
583 for.body: ; preds = %entry, %for.body
584 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
585 %arrayidx = getelementptr inbounds float* %y, i64 %indvars.iv
586 %0 = load float* %arrayidx, align 4, !tbaa !0
587 %call = tail call float @llvm.trunc.f32(float %0) nounwind readnone
588 %arrayidx2 = getelementptr inbounds float* %x, i64 %indvars.iv
589 store float %call, float* %arrayidx2, align 4, !tbaa !0
590 %indvars.iv.next = add i64 %indvars.iv, 1
591 %lftr.wideiv = trunc i64 %indvars.iv.next to i32
592 %exitcond = icmp eq i32 %lftr.wideiv, %n
593 br i1 %exitcond, label %for.end, label %for.body
595 for.end: ; preds = %for.body, %entry
599 declare float @llvm.trunc.f32(float) nounwind readnone
602 ;CHECK: llvm.trunc.v4f64
604 define void @trunc_f64(i32 %n, double* noalias %y, double* noalias %x) nounwind uwtable {
606 %cmp6 = icmp sgt i32 %n, 0
607 br i1 %cmp6, label %for.body, label %for.end
609 for.body: ; preds = %entry, %for.body
610 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
611 %arrayidx = getelementptr inbounds double* %y, i64 %indvars.iv
612 %0 = load double* %arrayidx, align 8, !tbaa !3
613 %call = tail call double @llvm.trunc.f64(double %0) nounwind readnone
614 %arrayidx2 = getelementptr inbounds double* %x, i64 %indvars.iv
615 store double %call, double* %arrayidx2, align 8, !tbaa !3
616 %indvars.iv.next = add i64 %indvars.iv, 1
617 %lftr.wideiv = trunc i64 %indvars.iv.next to i32
618 %exitcond = icmp eq i32 %lftr.wideiv, %n
619 br i1 %exitcond, label %for.end, label %for.body
621 for.end: ; preds = %for.body, %entry
625 declare double @llvm.trunc.f64(double) nounwind readnone
628 ;CHECK: llvm.rint.v4f32
630 define void @rint_f32(i32 %n, float* noalias %y, float* noalias %x) nounwind uwtable {
632 %cmp6 = icmp sgt i32 %n, 0
633 br i1 %cmp6, label %for.body, label %for.end
635 for.body: ; preds = %entry, %for.body
636 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
637 %arrayidx = getelementptr inbounds float* %y, i64 %indvars.iv
638 %0 = load float* %arrayidx, align 4, !tbaa !0
639 %call = tail call float @llvm.rint.f32(float %0) nounwind readnone
640 %arrayidx2 = getelementptr inbounds float* %x, i64 %indvars.iv
641 store float %call, float* %arrayidx2, align 4, !tbaa !0
642 %indvars.iv.next = add i64 %indvars.iv, 1
643 %lftr.wideiv = trunc i64 %indvars.iv.next to i32
644 %exitcond = icmp eq i32 %lftr.wideiv, %n
645 br i1 %exitcond, label %for.end, label %for.body
647 for.end: ; preds = %for.body, %entry
651 declare float @llvm.rint.f32(float) nounwind readnone
654 ;CHECK: llvm.rint.v4f64
656 define void @rint_f64(i32 %n, double* noalias %y, double* noalias %x) nounwind uwtable {
658 %cmp6 = icmp sgt i32 %n, 0
659 br i1 %cmp6, label %for.body, label %for.end
661 for.body: ; preds = %entry, %for.body
662 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
663 %arrayidx = getelementptr inbounds double* %y, i64 %indvars.iv
664 %0 = load double* %arrayidx, align 8, !tbaa !3
665 %call = tail call double @llvm.rint.f64(double %0) nounwind readnone
666 %arrayidx2 = getelementptr inbounds double* %x, i64 %indvars.iv
667 store double %call, double* %arrayidx2, align 8, !tbaa !3
668 %indvars.iv.next = add i64 %indvars.iv, 1
669 %lftr.wideiv = trunc i64 %indvars.iv.next to i32
670 %exitcond = icmp eq i32 %lftr.wideiv, %n
671 br i1 %exitcond, label %for.end, label %for.body
673 for.end: ; preds = %for.body, %entry
677 declare double @llvm.rint.f64(double) nounwind readnone
679 ;CHECK: @nearbyint_f32
680 ;CHECK: llvm.nearbyint.v4f32
682 define void @nearbyint_f32(i32 %n, float* noalias %y, float* noalias %x) nounwind uwtable {
684 %cmp6 = icmp sgt i32 %n, 0
685 br i1 %cmp6, label %for.body, label %for.end
687 for.body: ; preds = %entry, %for.body
688 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
689 %arrayidx = getelementptr inbounds float* %y, i64 %indvars.iv
690 %0 = load float* %arrayidx, align 4, !tbaa !0
691 %call = tail call float @llvm.nearbyint.f32(float %0) nounwind readnone
692 %arrayidx2 = getelementptr inbounds float* %x, i64 %indvars.iv
693 store float %call, float* %arrayidx2, align 4, !tbaa !0
694 %indvars.iv.next = add i64 %indvars.iv, 1
695 %lftr.wideiv = trunc i64 %indvars.iv.next to i32
696 %exitcond = icmp eq i32 %lftr.wideiv, %n
697 br i1 %exitcond, label %for.end, label %for.body
699 for.end: ; preds = %for.body, %entry
703 declare float @llvm.nearbyint.f32(float) nounwind readnone
705 ;CHECK: @nearbyint_f64
706 ;CHECK: llvm.nearbyint.v4f64
708 define void @nearbyint_f64(i32 %n, double* noalias %y, double* noalias %x) nounwind uwtable {
710 %cmp6 = icmp sgt i32 %n, 0
711 br i1 %cmp6, label %for.body, label %for.end
713 for.body: ; preds = %entry, %for.body
714 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
715 %arrayidx = getelementptr inbounds double* %y, i64 %indvars.iv
716 %0 = load double* %arrayidx, align 8, !tbaa !3
717 %call = tail call double @llvm.nearbyint.f64(double %0) nounwind readnone
718 %arrayidx2 = getelementptr inbounds double* %x, i64 %indvars.iv
719 store double %call, double* %arrayidx2, align 8, !tbaa !3
720 %indvars.iv.next = add i64 %indvars.iv, 1
721 %lftr.wideiv = trunc i64 %indvars.iv.next to i32
722 %exitcond = icmp eq i32 %lftr.wideiv, %n
723 br i1 %exitcond, label %for.end, label %for.body
725 for.end: ; preds = %for.body, %entry
729 declare double @llvm.nearbyint.f64(double) nounwind readnone
732 ;CHECK: llvm.fma.v4f32
734 define void @fma_f32(i32 %n, float* noalias %y, float* noalias %x, float* noalias %z, float* noalias %w) nounwind uwtable {
736 %cmp12 = icmp sgt i32 %n, 0
737 br i1 %cmp12, label %for.body, label %for.end
739 for.body: ; preds = %entry, %for.body
740 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
741 %arrayidx = getelementptr inbounds float* %y, i64 %indvars.iv
742 %0 = load float* %arrayidx, align 4, !tbaa !0
743 %arrayidx2 = getelementptr inbounds float* %w, i64 %indvars.iv
744 %1 = load float* %arrayidx2, align 4, !tbaa !0
745 %arrayidx4 = getelementptr inbounds float* %z, i64 %indvars.iv
746 %2 = load float* %arrayidx4, align 4, !tbaa !0
747 %3 = tail call float @llvm.fma.f32(float %0, float %2, float %1)
748 %arrayidx6 = getelementptr inbounds float* %x, i64 %indvars.iv
749 store float %3, float* %arrayidx6, align 4, !tbaa !0
750 %indvars.iv.next = add i64 %indvars.iv, 1
751 %lftr.wideiv = trunc i64 %indvars.iv.next to i32
752 %exitcond = icmp eq i32 %lftr.wideiv, %n
753 br i1 %exitcond, label %for.end, label %for.body
755 for.end: ; preds = %for.body, %entry
759 declare float @llvm.fma.f32(float, float, float) nounwind readnone
762 ;CHECK: llvm.fma.v4f64
764 define void @fma_f64(i32 %n, double* noalias %y, double* noalias %x, double* noalias %z, double* noalias %w) nounwind uwtable {
766 %cmp12 = icmp sgt i32 %n, 0
767 br i1 %cmp12, label %for.body, label %for.end
769 for.body: ; preds = %entry, %for.body
770 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
771 %arrayidx = getelementptr inbounds double* %y, i64 %indvars.iv
772 %0 = load double* %arrayidx, align 8, !tbaa !3
773 %arrayidx2 = getelementptr inbounds double* %w, i64 %indvars.iv
774 %1 = load double* %arrayidx2, align 8, !tbaa !3
775 %arrayidx4 = getelementptr inbounds double* %z, i64 %indvars.iv
776 %2 = load double* %arrayidx4, align 8, !tbaa !3
777 %3 = tail call double @llvm.fma.f64(double %0, double %2, double %1)
778 %arrayidx6 = getelementptr inbounds double* %x, i64 %indvars.iv
779 store double %3, double* %arrayidx6, align 8, !tbaa !3
780 %indvars.iv.next = add i64 %indvars.iv, 1
781 %lftr.wideiv = trunc i64 %indvars.iv.next to i32
782 %exitcond = icmp eq i32 %lftr.wideiv, %n
783 br i1 %exitcond, label %for.end, label %for.body
785 for.end: ; preds = %for.body, %entry
789 declare double @llvm.fma.f64(double, double, double) nounwind readnone
792 ;CHECK: llvm.pow.v4f32
794 define void @pow_f32(i32 %n, float* noalias %y, float* noalias %x, float* noalias %z) nounwind uwtable {
796 %cmp9 = icmp sgt i32 %n, 0
797 br i1 %cmp9, label %for.body, label %for.end
799 for.body: ; preds = %entry, %for.body
800 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
801 %arrayidx = getelementptr inbounds float* %y, i64 %indvars.iv
802 %0 = load float* %arrayidx, align 4, !tbaa !0
803 %arrayidx2 = getelementptr inbounds float* %z, i64 %indvars.iv
804 %1 = load float* %arrayidx2, align 4, !tbaa !0
805 %call = tail call float @llvm.pow.f32(float %0, float %1) nounwind readnone
806 %arrayidx4 = getelementptr inbounds float* %x, i64 %indvars.iv
807 store float %call, float* %arrayidx4, align 4, !tbaa !0
808 %indvars.iv.next = add i64 %indvars.iv, 1
809 %lftr.wideiv = trunc i64 %indvars.iv.next to i32
810 %exitcond = icmp eq i32 %lftr.wideiv, %n
811 br i1 %exitcond, label %for.end, label %for.body
813 for.end: ; preds = %for.body, %entry
817 declare float @llvm.pow.f32(float, float) nounwind readnone
820 ;CHECK: llvm.pow.v4f64
822 define void @pow_f64(i32 %n, double* noalias %y, double* noalias %x, double* noalias %z) nounwind uwtable {
824 %cmp9 = icmp sgt i32 %n, 0
825 br i1 %cmp9, label %for.body, label %for.end
827 for.body: ; preds = %entry, %for.body
828 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
829 %arrayidx = getelementptr inbounds double* %y, i64 %indvars.iv
830 %0 = load double* %arrayidx, align 8, !tbaa !3
831 %arrayidx2 = getelementptr inbounds double* %z, i64 %indvars.iv
832 %1 = load double* %arrayidx2, align 8, !tbaa !3
833 %call = tail call double @llvm.pow.f64(double %0, double %1) nounwind readnone
834 %arrayidx4 = getelementptr inbounds double* %x, i64 %indvars.iv
835 store double %call, double* %arrayidx4, align 8, !tbaa !3
836 %indvars.iv.next = add i64 %indvars.iv, 1
837 %lftr.wideiv = trunc i64 %indvars.iv.next to i32
838 %exitcond = icmp eq i32 %lftr.wideiv, %n
839 br i1 %exitcond, label %for.end, label %for.body
841 for.end: ; preds = %for.body, %entry
845 declare double @llvm.pow.f64(double, double) nounwind readnone
847 !0 = metadata !{metadata !"float", metadata !1}
848 !1 = metadata !{metadata !"omnipotent char", metadata !2}
849 !2 = metadata !{metadata !"Simple C/C++ TBAA"}
850 !3 = metadata !{metadata !"double", metadata !1}
851 !4 = metadata !{metadata !"int", metadata !1}