Revert "[InstCombine] Support gep nuw in icmp folds" (#118698)
[llvm-project.git] / llvm / test / Transforms / LoopVectorize / intrinsic.ll
blob9c910d70807a157b49ea6b7e67573b249f164fba
1 ; RUN: opt < %s -passes=loop-vectorize,dce,instcombine -force-vector-interleave=1 -force-vector-width=4 -S | FileCheck %s
3 define void @sqrt_f32(i32 %n, ptr %y, ptr %x) {
4 ; CHECK-LABEL: @sqrt_f32(
5 ; CHECK: llvm.sqrt.v4f32
6 ; CHECK: ret void
8 entry:
9   %cmp6 = icmp sgt i32 %n, 0
10   br i1 %cmp6, label %for.body, label %for.end
12 for.body:                                         ; preds = %entry, %for.body
13   %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
14   %arrayidx = getelementptr inbounds float, ptr %y, i64 %indvars.iv
15   %0 = load float, ptr %arrayidx, align 4
16   %call = tail call float @llvm.sqrt.f32(float %0)
17   %arrayidx2 = getelementptr inbounds float, ptr %x, i64 %indvars.iv
18   store float %call, ptr %arrayidx2, align 4
19   %indvars.iv.next = add i64 %indvars.iv, 1
20   %lftr.wideiv = trunc i64 %indvars.iv.next to i32
21   %exitcond = icmp eq i32 %lftr.wideiv, %n
22   br i1 %exitcond, label %for.end, label %for.body
24 for.end:                                          ; preds = %for.body, %entry
25   ret void
28 declare float @llvm.sqrt.f32(float)
30 define void @sqrt_f64(i32 %n, ptr %y, ptr %x) {
31 ; CHECK-LABEL: @sqrt_f64(
32 ; CHECK: llvm.sqrt.v4f64
33 ; CHECK: ret void
35 entry:
36   %cmp6 = icmp sgt i32 %n, 0
37   br i1 %cmp6, label %for.body, label %for.end
39 for.body:                                         ; preds = %entry, %for.body
40   %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
41   %arrayidx = getelementptr inbounds double, ptr %y, i64 %indvars.iv
42   %0 = load double, ptr %arrayidx, align 8
43   %call = tail call double @llvm.sqrt.f64(double %0)
44   %arrayidx2 = getelementptr inbounds double, ptr %x, i64 %indvars.iv
45   store double %call, ptr %arrayidx2, align 8
46   %indvars.iv.next = add i64 %indvars.iv, 1
47   %lftr.wideiv = trunc i64 %indvars.iv.next to i32
48   %exitcond = icmp eq i32 %lftr.wideiv, %n
49   br i1 %exitcond, label %for.end, label %for.body
51 for.end:                                          ; preds = %for.body, %entry
52   ret void
55 declare double @llvm.sqrt.f64(double)
57 define void @sin_f32(i32 %n, ptr %y, ptr %x) {
58 ; CHECK-LABEL: @sin_f32(
59 ; CHECK: llvm.sin.v4f32
60 ; CHECK: ret void
62 entry:
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, ptr %y, i64 %indvars.iv
69   %0 = load float, ptr %arrayidx, align 4
70   %call = tail call float @llvm.sin.f32(float %0)
71   %arrayidx2 = getelementptr inbounds float, ptr %x, i64 %indvars.iv
72   store float %call, ptr %arrayidx2, align 4
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
79   ret void
82 declare float @llvm.sin.f32(float)
84 define void @sin_f64(i32 %n, ptr %y, ptr %x) {
85 ; CHECK-LABEL: @sin_f64(
86 ; CHECK: llvm.sin.v4f64
87 ; CHECK: ret void
89 entry:
90   %cmp6 = icmp sgt i32 %n, 0
91   br i1 %cmp6, label %for.body, label %for.end
93 for.body:                                         ; preds = %entry, %for.body
94   %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
95   %arrayidx = getelementptr inbounds double, ptr %y, i64 %indvars.iv
96   %0 = load double, ptr %arrayidx, align 8
97   %call = tail call double @llvm.sin.f64(double %0)
98   %arrayidx2 = getelementptr inbounds double, ptr %x, i64 %indvars.iv
99   store double %call, ptr %arrayidx2, align 8
100   %indvars.iv.next = add i64 %indvars.iv, 1
101   %lftr.wideiv = trunc i64 %indvars.iv.next to i32
102   %exitcond = icmp eq i32 %lftr.wideiv, %n
103   br i1 %exitcond, label %for.end, label %for.body
105 for.end:                                          ; preds = %for.body, %entry
106   ret void
109 declare double @llvm.sin.f64(double)
111 define void @cos_f32(i32 %n, ptr %y, ptr %x) {
112 ; CHECK-LABEL: @cos_f32(
113 ; CHECK: llvm.cos.v4f32
114 ; CHECK: ret void
116 entry:
117   %cmp6 = icmp sgt i32 %n, 0
118   br i1 %cmp6, label %for.body, label %for.end
120 for.body:                                         ; preds = %entry, %for.body
121   %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
122   %arrayidx = getelementptr inbounds float, ptr %y, i64 %indvars.iv
123   %0 = load float, ptr %arrayidx, align 4
124   %call = tail call float @llvm.cos.f32(float %0)
125   %arrayidx2 = getelementptr inbounds float, ptr %x, i64 %indvars.iv
126   store float %call, ptr %arrayidx2, align 4
127   %indvars.iv.next = add i64 %indvars.iv, 1
128   %lftr.wideiv = trunc i64 %indvars.iv.next to i32
129   %exitcond = icmp eq i32 %lftr.wideiv, %n
130   br i1 %exitcond, label %for.end, label %for.body
132 for.end:                                          ; preds = %for.body, %entry
133   ret void
136 declare float @llvm.cos.f32(float)
138 define void @cos_f64(i32 %n, ptr %y, ptr %x) {
139 ; CHECK-LABEL: @cos_f64(
140 ; CHECK: llvm.cos.v4f64
141 ; CHECK: ret void
143 entry:
144   %cmp6 = icmp sgt i32 %n, 0
145   br i1 %cmp6, label %for.body, label %for.end
147 for.body:                                         ; preds = %entry, %for.body
148   %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
149   %arrayidx = getelementptr inbounds double, ptr %y, i64 %indvars.iv
150   %0 = load double, ptr %arrayidx, align 8
151   %call = tail call double @llvm.cos.f64(double %0)
152   %arrayidx2 = getelementptr inbounds double, ptr %x, i64 %indvars.iv
153   store double %call, ptr %arrayidx2, align 8
154   %indvars.iv.next = add i64 %indvars.iv, 1
155   %lftr.wideiv = trunc i64 %indvars.iv.next to i32
156   %exitcond = icmp eq i32 %lftr.wideiv, %n
157   br i1 %exitcond, label %for.end, label %for.body
159 for.end:                                          ; preds = %for.body, %entry
160   ret void
163 declare double @llvm.cos.f64(double)
165 define void @tan_f32(i32 %n, ptr %y, ptr %x) {
166 ; CHECK-LABEL: @tan_f32(
167 ; CHECK: llvm.tan.v4f32
168 ; CHECK: ret void
170 entry:
171   %cmp6 = icmp sgt i32 %n, 0
172   br i1 %cmp6, label %for.body, label %for.end
174 for.body:                                         ; preds = %entry, %for.body
175   %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
176   %arrayidx = getelementptr inbounds float, ptr %y, i64 %indvars.iv
177   %0 = load float, ptr %arrayidx, align 4
178   %call = tail call float @llvm.tan.f32(float %0)
179   %arrayidx2 = getelementptr inbounds float, ptr %x, i64 %indvars.iv
180   store float %call, ptr %arrayidx2, align 4
181   %indvars.iv.next = add i64 %indvars.iv, 1
182   %lftr.wideiv = trunc i64 %indvars.iv.next to i32
183   %exitcond = icmp eq i32 %lftr.wideiv, %n
184   br i1 %exitcond, label %for.end, label %for.body
186 for.end:                                          ; preds = %for.body, %entry
187   ret void
190 declare float @llvm.tan.f32(float)
192 define void @tan_f64(i32 %n, ptr %y, ptr %x) {
193 ; CHECK-LABEL: @tan_f64(
194 ; CHECK: llvm.tan.v4f64
195 ; CHECK: ret void
197 entry:
198   %cmp6 = icmp sgt i32 %n, 0
199   br i1 %cmp6, label %for.body, label %for.end
201 for.body:                                         ; preds = %entry, %for.body
202   %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
203   %arrayidx = getelementptr inbounds double, ptr %y, i64 %indvars.iv
204   %0 = load double, ptr %arrayidx, align 8
205   %call = tail call double @llvm.tan.f64(double %0)
206   %arrayidx2 = getelementptr inbounds double, ptr %x, i64 %indvars.iv
207   store double %call, ptr %arrayidx2, align 8
208   %indvars.iv.next = add i64 %indvars.iv, 1
209   %lftr.wideiv = trunc i64 %indvars.iv.next to i32
210   %exitcond = icmp eq i32 %lftr.wideiv, %n
211   br i1 %exitcond, label %for.end, label %for.body
213 for.end:                                          ; preds = %for.body, %entry
214   ret void
217 declare double @llvm.tan.f64(double)
219 define void @exp_f32(i32 %n, ptr %y, ptr %x) {
220 ; CHECK-LABEL: @exp_f32(
221 ; CHECK: llvm.exp.v4f32
222 ; CHECK: ret void
224 entry:
225   %cmp6 = icmp sgt i32 %n, 0
226   br i1 %cmp6, label %for.body, label %for.end
228 for.body:                                         ; preds = %entry, %for.body
229   %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
230   %arrayidx = getelementptr inbounds float, ptr %y, i64 %indvars.iv
231   %0 = load float, ptr %arrayidx, align 4
232   %call = tail call float @llvm.exp.f32(float %0)
233   %arrayidx2 = getelementptr inbounds float, ptr %x, i64 %indvars.iv
234   store float %call, ptr %arrayidx2, align 4
235   %indvars.iv.next = add i64 %indvars.iv, 1
236   %lftr.wideiv = trunc i64 %indvars.iv.next to i32
237   %exitcond = icmp eq i32 %lftr.wideiv, %n
238   br i1 %exitcond, label %for.end, label %for.body
240 for.end:                                          ; preds = %for.body, %entry
241   ret void
244 declare float @llvm.exp.f32(float)
246 define void @exp_f64(i32 %n, ptr %y, ptr %x) {
247 ; CHECK-LABEL: @exp_f64(
248 ; CHECK: llvm.exp.v4f64
249 ; CHECK: ret void
251 entry:
252   %cmp6 = icmp sgt i32 %n, 0
253   br i1 %cmp6, label %for.body, label %for.end
255 for.body:                                         ; preds = %entry, %for.body
256   %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
257   %arrayidx = getelementptr inbounds double, ptr %y, i64 %indvars.iv
258   %0 = load double, ptr %arrayidx, align 8
259   %call = tail call double @llvm.exp.f64(double %0)
260   %arrayidx2 = getelementptr inbounds double, ptr %x, i64 %indvars.iv
261   store double %call, ptr %arrayidx2, align 8
262   %indvars.iv.next = add i64 %indvars.iv, 1
263   %lftr.wideiv = trunc i64 %indvars.iv.next to i32
264   %exitcond = icmp eq i32 %lftr.wideiv, %n
265   br i1 %exitcond, label %for.end, label %for.body
267 for.end:                                          ; preds = %for.body, %entry
268   ret void
271 declare double @llvm.exp.f64(double)
273 define void @exp2_f32(i32 %n, ptr %y, ptr %x) {
274 ; CHECK-LABEL: @exp2_f32(
275 ; CHECK: llvm.exp2.v4f32
276 ; CHECK: ret void
278 entry:
279   %cmp6 = icmp sgt i32 %n, 0
280   br i1 %cmp6, label %for.body, label %for.end
282 for.body:                                         ; preds = %entry, %for.body
283   %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
284   %arrayidx = getelementptr inbounds float, ptr %y, i64 %indvars.iv
285   %0 = load float, ptr %arrayidx, align 4
286   %call = tail call float @llvm.exp2.f32(float %0)
287   %arrayidx2 = getelementptr inbounds float, ptr %x, i64 %indvars.iv
288   store float %call, ptr %arrayidx2, align 4
289   %indvars.iv.next = add i64 %indvars.iv, 1
290   %lftr.wideiv = trunc i64 %indvars.iv.next to i32
291   %exitcond = icmp eq i32 %lftr.wideiv, %n
292   br i1 %exitcond, label %for.end, label %for.body
294 for.end:                                          ; preds = %for.body, %entry
295   ret void
298 declare float @llvm.exp2.f32(float)
300 define void @exp2_f64(i32 %n, ptr %y, ptr %x) {
301 ; CHECK-LABEL: @exp2_f64(
302 ; CHECK: llvm.exp2.v4f64
303 ; CHECK: ret void
305 entry:
306   %cmp6 = icmp sgt i32 %n, 0
307   br i1 %cmp6, label %for.body, label %for.end
309 for.body:                                         ; preds = %entry, %for.body
310   %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
311   %arrayidx = getelementptr inbounds double, ptr %y, i64 %indvars.iv
312   %0 = load double, ptr %arrayidx, align 8
313   %call = tail call double @llvm.exp2.f64(double %0)
314   %arrayidx2 = getelementptr inbounds double, ptr %x, i64 %indvars.iv
315   store double %call, ptr %arrayidx2, align 8
316   %indvars.iv.next = add i64 %indvars.iv, 1
317   %lftr.wideiv = trunc i64 %indvars.iv.next to i32
318   %exitcond = icmp eq i32 %lftr.wideiv, %n
319   br i1 %exitcond, label %for.end, label %for.body
321 for.end:                                          ; preds = %for.body, %entry
322   ret void
325 declare double @llvm.exp2.f64(double)
327 define void @log_f32(i32 %n, ptr %y, ptr %x) {
328 ; CHECK-LABEL: @log_f32(
329 ; CHECK: llvm.log.v4f32
330 ; CHECK: ret void
332 entry:
333   %cmp6 = icmp sgt i32 %n, 0
334   br i1 %cmp6, label %for.body, label %for.end
336 for.body:                                         ; preds = %entry, %for.body
337   %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
338   %arrayidx = getelementptr inbounds float, ptr %y, i64 %indvars.iv
339   %0 = load float, ptr %arrayidx, align 4
340   %call = tail call float @llvm.log.f32(float %0)
341   %arrayidx2 = getelementptr inbounds float, ptr %x, i64 %indvars.iv
342   store float %call, ptr %arrayidx2, align 4
343   %indvars.iv.next = add i64 %indvars.iv, 1
344   %lftr.wideiv = trunc i64 %indvars.iv.next to i32
345   %exitcond = icmp eq i32 %lftr.wideiv, %n
346   br i1 %exitcond, label %for.end, label %for.body
348 for.end:                                          ; preds = %for.body, %entry
349   ret void
352 declare float @llvm.log.f32(float)
354 define void @log_f64(i32 %n, ptr %y, ptr %x) {
355 ; CHECK-LABEL: @log_f64(
356 ; CHECK: llvm.log.v4f64
357 ; CHECK: ret void
359 entry:
360   %cmp6 = icmp sgt i32 %n, 0
361   br i1 %cmp6, label %for.body, label %for.end
363 for.body:                                         ; preds = %entry, %for.body
364   %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
365   %arrayidx = getelementptr inbounds double, ptr %y, i64 %indvars.iv
366   %0 = load double, ptr %arrayidx, align 8
367   %call = tail call double @llvm.log.f64(double %0)
368   %arrayidx2 = getelementptr inbounds double, ptr %x, i64 %indvars.iv
369   store double %call, ptr %arrayidx2, align 8
370   %indvars.iv.next = add i64 %indvars.iv, 1
371   %lftr.wideiv = trunc i64 %indvars.iv.next to i32
372   %exitcond = icmp eq i32 %lftr.wideiv, %n
373   br i1 %exitcond, label %for.end, label %for.body
375 for.end:                                          ; preds = %for.body, %entry
376   ret void
379 declare double @llvm.log.f64(double)
381 define void @log10_f32(i32 %n, ptr %y, ptr %x) {
382 ; CHECK-LABEL: @log10_f32(
383 ; CHECK: llvm.log10.v4f32
384 ; CHECK: ret void
386 entry:
387   %cmp6 = icmp sgt i32 %n, 0
388   br i1 %cmp6, label %for.body, label %for.end
390 for.body:                                         ; preds = %entry, %for.body
391   %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
392   %arrayidx = getelementptr inbounds float, ptr %y, i64 %indvars.iv
393   %0 = load float, ptr %arrayidx, align 4
394   %call = tail call float @llvm.log10.f32(float %0)
395   %arrayidx2 = getelementptr inbounds float, ptr %x, i64 %indvars.iv
396   store float %call, ptr %arrayidx2, align 4
397   %indvars.iv.next = add i64 %indvars.iv, 1
398   %lftr.wideiv = trunc i64 %indvars.iv.next to i32
399   %exitcond = icmp eq i32 %lftr.wideiv, %n
400   br i1 %exitcond, label %for.end, label %for.body
402 for.end:                                          ; preds = %for.body, %entry
403   ret void
406 declare float @llvm.log10.f32(float)
408 define void @log10_f64(i32 %n, ptr %y, ptr %x) {
409 ; CHECK-LABEL: @log10_f64(
410 ; CHECK: llvm.log10.v4f64
411 ; CHECK: ret void
413 entry:
414   %cmp6 = icmp sgt i32 %n, 0
415   br i1 %cmp6, label %for.body, label %for.end
417 for.body:                                         ; preds = %entry, %for.body
418   %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
419   %arrayidx = getelementptr inbounds double, ptr %y, i64 %indvars.iv
420   %0 = load double, ptr %arrayidx, align 8
421   %call = tail call double @llvm.log10.f64(double %0)
422   %arrayidx2 = getelementptr inbounds double, ptr %x, i64 %indvars.iv
423   store double %call, ptr %arrayidx2, align 8
424   %indvars.iv.next = add i64 %indvars.iv, 1
425   %lftr.wideiv = trunc i64 %indvars.iv.next to i32
426   %exitcond = icmp eq i32 %lftr.wideiv, %n
427   br i1 %exitcond, label %for.end, label %for.body
429 for.end:                                          ; preds = %for.body, %entry
430   ret void
433 declare double @llvm.log10.f64(double)
435 define void @log2_f32(i32 %n, ptr %y, ptr %x) {
436 ; CHECK-LABEL: @log2_f32(
437 ; CHECK: llvm.log2.v4f32
438 ; CHECK: ret void
440 entry:
441   %cmp6 = icmp sgt i32 %n, 0
442   br i1 %cmp6, label %for.body, label %for.end
444 for.body:                                         ; preds = %entry, %for.body
445   %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
446   %arrayidx = getelementptr inbounds float, ptr %y, i64 %indvars.iv
447   %0 = load float, ptr %arrayidx, align 4
448   %call = tail call float @llvm.log2.f32(float %0)
449   %arrayidx2 = getelementptr inbounds float, ptr %x, i64 %indvars.iv
450   store float %call, ptr %arrayidx2, align 4
451   %indvars.iv.next = add i64 %indvars.iv, 1
452   %lftr.wideiv = trunc i64 %indvars.iv.next to i32
453   %exitcond = icmp eq i32 %lftr.wideiv, %n
454   br i1 %exitcond, label %for.end, label %for.body
456 for.end:                                          ; preds = %for.body, %entry
457   ret void
460 declare float @llvm.log2.f32(float)
462 define void @log2_f64(i32 %n, ptr %y, ptr %x) {
463 ; CHECK-LABEL: @log2_f64(
464 ; CHECK: llvm.log2.v4f64
465 ; CHECK: ret void
467 entry:
468   %cmp6 = icmp sgt i32 %n, 0
469   br i1 %cmp6, label %for.body, label %for.end
471 for.body:                                         ; preds = %entry, %for.body
472   %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
473   %arrayidx = getelementptr inbounds double, ptr %y, i64 %indvars.iv
474   %0 = load double, ptr %arrayidx, align 8
475   %call = tail call double @llvm.log2.f64(double %0)
476   %arrayidx2 = getelementptr inbounds double, ptr %x, i64 %indvars.iv
477   store double %call, ptr %arrayidx2, align 8
478   %indvars.iv.next = add i64 %indvars.iv, 1
479   %lftr.wideiv = trunc i64 %indvars.iv.next to i32
480   %exitcond = icmp eq i32 %lftr.wideiv, %n
481   br i1 %exitcond, label %for.end, label %for.body
483 for.end:                                          ; preds = %for.body, %entry
484   ret void
487 declare double @llvm.log2.f64(double)
489 define void @fabs_f32(i32 %n, ptr %y, ptr %x) {
490 ; CHECK-LABEL: @fabs_f32(
491 ; CHECK: llvm.fabs.v4f32
492 ; CHECK: ret void
494 entry:
495   %cmp6 = icmp sgt i32 %n, 0
496   br i1 %cmp6, label %for.body, label %for.end
498 for.body:                                         ; preds = %entry, %for.body
499   %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
500   %arrayidx = getelementptr inbounds float, ptr %y, i64 %indvars.iv
501   %0 = load float, ptr %arrayidx, align 4
502   %call = tail call float @llvm.fabs.f32(float %0)
503   %arrayidx2 = getelementptr inbounds float, ptr %x, i64 %indvars.iv
504   store float %call, ptr %arrayidx2, align 4
505   %indvars.iv.next = add i64 %indvars.iv, 1
506   %lftr.wideiv = trunc i64 %indvars.iv.next to i32
507   %exitcond = icmp eq i32 %lftr.wideiv, %n
508   br i1 %exitcond, label %for.end, label %for.body
510 for.end:                                          ; preds = %for.body, %entry
511   ret void
514 declare float @llvm.fabs.f32(float)
516 define void @fabs_f64(i32 %n, ptr %y, ptr %x) {
517 ; CHECK-LABEL: @fabs_f64(
518 ; CHECK: llvm.fabs.v4f64
519 ; CHECK: ret void
521 entry:
522   %cmp6 = icmp sgt i32 %n, 0
523   br i1 %cmp6, label %for.body, label %for.end
525 for.body:                                         ; preds = %entry, %for.body
526   %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
527   %arrayidx = getelementptr inbounds double, ptr %y, i64 %indvars.iv
528   %0 = load double, ptr %arrayidx, align 8
529   %call = tail call double @llvm.fabs(double %0)
530   %arrayidx2 = getelementptr inbounds double, ptr %x, i64 %indvars.iv
531   store double %call, ptr %arrayidx2, align 8
532   %indvars.iv.next = add i64 %indvars.iv, 1
533   %lftr.wideiv = trunc i64 %indvars.iv.next to i32
534   %exitcond = icmp eq i32 %lftr.wideiv, %n
535   br i1 %exitcond, label %for.end, label %for.body
537 for.end:                                          ; preds = %for.body, %entry
538   ret void
541 declare double @llvm.fabs(double)
543 define void @copysign_f32(i32 %n, ptr %y, ptr %x, ptr %z) {
544 ; CHECK-LABEL: @copysign_f32(
545 ; CHECK: llvm.copysign.v4f32
546 ; CHECK: ret void
548 entry:
549   %cmp6 = icmp sgt i32 %n, 0
550   br i1 %cmp6, label %for.body, label %for.end
552 for.body:                                         ; preds = %entry, %for.body
553   %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
554   %arrayidx = getelementptr inbounds float, ptr %y, i64 %indvars.iv
555   %0 = load float, ptr %arrayidx, align 4
556   %arrayidx1 = getelementptr inbounds float, ptr %z, i64 %indvars.iv
557   %1 = load float, ptr %arrayidx1, align 4
558   %call = tail call float @llvm.copysign.f32(float %0, float %1)
559   %arrayidx2 = getelementptr inbounds float, ptr %x, i64 %indvars.iv
560   store float %call, ptr %arrayidx2, align 4
561   %indvars.iv.next = add i64 %indvars.iv, 1
562   %lftr.wideiv = trunc i64 %indvars.iv.next to i32
563   %exitcond = icmp eq i32 %lftr.wideiv, %n
564   br i1 %exitcond, label %for.end, label %for.body
566 for.end:                                          ; preds = %for.body, %entry
567   ret void
570 declare float @llvm.copysign.f32(float, float)
572 define void @copysign_f64(i32 %n, ptr %y, ptr %x, ptr %z) {
573 ; CHECK-LABEL: @copysign_f64(
574 ; CHECK: llvm.copysign.v4f64
575 ; CHECK: ret void
577 entry:
578   %cmp6 = icmp sgt i32 %n, 0
579   br i1 %cmp6, label %for.body, label %for.end
581 for.body:                                         ; preds = %entry, %for.body
582   %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
583   %arrayidx = getelementptr inbounds double, ptr %y, i64 %indvars.iv
584   %0 = load double, ptr %arrayidx, align 8
585   %arrayidx1 = getelementptr inbounds double, ptr %z, i64 %indvars.iv
586   %1 = load double, ptr %arrayidx1, align 8
587   %call = tail call double @llvm.copysign(double %0, double %1)
588   %arrayidx2 = getelementptr inbounds double, ptr %x, i64 %indvars.iv
589   store double %call, ptr %arrayidx2, align 8
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
596   ret void
599 declare double @llvm.copysign(double, double)
601 define void @floor_f32(i32 %n, ptr %y, ptr %x) {
602 ; CHECK-LABEL: @floor_f32(
603 ; CHECK: llvm.floor.v4f32
604 ; CHECK: ret void
606 entry:
607   %cmp6 = icmp sgt i32 %n, 0
608   br i1 %cmp6, label %for.body, label %for.end
610 for.body:                                         ; preds = %entry, %for.body
611   %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
612   %arrayidx = getelementptr inbounds float, ptr %y, i64 %indvars.iv
613   %0 = load float, ptr %arrayidx, align 4
614   %call = tail call float @llvm.floor.f32(float %0)
615   %arrayidx2 = getelementptr inbounds float, ptr %x, i64 %indvars.iv
616   store float %call, ptr %arrayidx2, align 4
617   %indvars.iv.next = add i64 %indvars.iv, 1
618   %lftr.wideiv = trunc i64 %indvars.iv.next to i32
619   %exitcond = icmp eq i32 %lftr.wideiv, %n
620   br i1 %exitcond, label %for.end, label %for.body
622 for.end:                                          ; preds = %for.body, %entry
623   ret void
626 declare float @llvm.floor.f32(float)
628 define void @floor_f64(i32 %n, ptr %y, ptr %x) {
629 ; CHECK-LABEL: @floor_f64(
630 ; CHECK: llvm.floor.v4f64
631 ; CHECK: ret void
633 entry:
634   %cmp6 = icmp sgt i32 %n, 0
635   br i1 %cmp6, label %for.body, label %for.end
637 for.body:                                         ; preds = %entry, %for.body
638   %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
639   %arrayidx = getelementptr inbounds double, ptr %y, i64 %indvars.iv
640   %0 = load double, ptr %arrayidx, align 8
641   %call = tail call double @llvm.floor.f64(double %0)
642   %arrayidx2 = getelementptr inbounds double, ptr %x, i64 %indvars.iv
643   store double %call, ptr %arrayidx2, align 8
644   %indvars.iv.next = add i64 %indvars.iv, 1
645   %lftr.wideiv = trunc i64 %indvars.iv.next to i32
646   %exitcond = icmp eq i32 %lftr.wideiv, %n
647   br i1 %exitcond, label %for.end, label %for.body
649 for.end:                                          ; preds = %for.body, %entry
650   ret void
653 declare double @llvm.floor.f64(double)
655 define void @ceil_f32(i32 %n, ptr %y, ptr %x) {
656 ; CHECK-LABEL: @ceil_f32(
657 ; CHECK: llvm.ceil.v4f32
658 ; CHECK: ret void
660 entry:
661   %cmp6 = icmp sgt i32 %n, 0
662   br i1 %cmp6, label %for.body, label %for.end
664 for.body:                                         ; preds = %entry, %for.body
665   %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
666   %arrayidx = getelementptr inbounds float, ptr %y, i64 %indvars.iv
667   %0 = load float, ptr %arrayidx, align 4
668   %call = tail call float @llvm.ceil.f32(float %0)
669   %arrayidx2 = getelementptr inbounds float, ptr %x, i64 %indvars.iv
670   store float %call, ptr %arrayidx2, align 4
671   %indvars.iv.next = add i64 %indvars.iv, 1
672   %lftr.wideiv = trunc i64 %indvars.iv.next to i32
673   %exitcond = icmp eq i32 %lftr.wideiv, %n
674   br i1 %exitcond, label %for.end, label %for.body
676 for.end:                                          ; preds = %for.body, %entry
677   ret void
680 declare float @llvm.ceil.f32(float)
682 define void @ceil_f64(i32 %n, ptr %y, ptr %x) {
683 ; CHECK-LABEL: @ceil_f64(
684 ; CHECK: llvm.ceil.v4f64
685 ; CHECK: ret void
687 entry:
688   %cmp6 = icmp sgt i32 %n, 0
689   br i1 %cmp6, label %for.body, label %for.end
691 for.body:                                         ; preds = %entry, %for.body
692   %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
693   %arrayidx = getelementptr inbounds double, ptr %y, i64 %indvars.iv
694   %0 = load double, ptr %arrayidx, align 8
695   %call = tail call double @llvm.ceil.f64(double %0)
696   %arrayidx2 = getelementptr inbounds double, ptr %x, i64 %indvars.iv
697   store double %call, ptr %arrayidx2, align 8
698   %indvars.iv.next = add i64 %indvars.iv, 1
699   %lftr.wideiv = trunc i64 %indvars.iv.next to i32
700   %exitcond = icmp eq i32 %lftr.wideiv, %n
701   br i1 %exitcond, label %for.end, label %for.body
703 for.end:                                          ; preds = %for.body, %entry
704   ret void
707 declare double @llvm.ceil.f64(double)
709 define void @trunc_f32(i32 %n, ptr %y, ptr %x) {
710 ; CHECK-LABEL: @trunc_f32(
711 ; CHECK: llvm.trunc.v4f32
712 ; CHECK: ret void
714 entry:
715   %cmp6 = icmp sgt i32 %n, 0
716   br i1 %cmp6, label %for.body, label %for.end
718 for.body:                                         ; preds = %entry, %for.body
719   %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
720   %arrayidx = getelementptr inbounds float, ptr %y, i64 %indvars.iv
721   %0 = load float, ptr %arrayidx, align 4
722   %call = tail call float @llvm.trunc.f32(float %0)
723   %arrayidx2 = getelementptr inbounds float, ptr %x, i64 %indvars.iv
724   store float %call, ptr %arrayidx2, align 4
725   %indvars.iv.next = add i64 %indvars.iv, 1
726   %lftr.wideiv = trunc i64 %indvars.iv.next to i32
727   %exitcond = icmp eq i32 %lftr.wideiv, %n
728   br i1 %exitcond, label %for.end, label %for.body
730 for.end:                                          ; preds = %for.body, %entry
731   ret void
734 declare float @llvm.trunc.f32(float)
736 define void @trunc_f64(i32 %n, ptr %y, ptr %x) {
737 ; CHECK-LABEL: @trunc_f64(
738 ; CHECK: llvm.trunc.v4f64
739 ; CHECK: ret void
741 entry:
742   %cmp6 = icmp sgt i32 %n, 0
743   br i1 %cmp6, label %for.body, label %for.end
745 for.body:                                         ; preds = %entry, %for.body
746   %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
747   %arrayidx = getelementptr inbounds double, ptr %y, i64 %indvars.iv
748   %0 = load double, ptr %arrayidx, align 8
749   %call = tail call double @llvm.trunc.f64(double %0)
750   %arrayidx2 = getelementptr inbounds double, ptr %x, i64 %indvars.iv
751   store double %call, ptr %arrayidx2, align 8
752   %indvars.iv.next = add i64 %indvars.iv, 1
753   %lftr.wideiv = trunc i64 %indvars.iv.next to i32
754   %exitcond = icmp eq i32 %lftr.wideiv, %n
755   br i1 %exitcond, label %for.end, label %for.body
757 for.end:                                          ; preds = %for.body, %entry
758   ret void
761 declare double @llvm.trunc.f64(double)
763 define void @rint_f32(i32 %n, ptr %y, ptr %x) {
764 ; CHECK-LABEL: @rint_f32(
765 ; CHECK: llvm.rint.v4f32
766 ; CHECK: ret void
768 entry:
769   %cmp6 = icmp sgt i32 %n, 0
770   br i1 %cmp6, label %for.body, label %for.end
772 for.body:                                         ; preds = %entry, %for.body
773   %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
774   %arrayidx = getelementptr inbounds float, ptr %y, i64 %indvars.iv
775   %0 = load float, ptr %arrayidx, align 4
776   %call = tail call float @llvm.rint.f32(float %0)
777   %arrayidx2 = getelementptr inbounds float, ptr %x, i64 %indvars.iv
778   store float %call, ptr %arrayidx2, align 4
779   %indvars.iv.next = add i64 %indvars.iv, 1
780   %lftr.wideiv = trunc i64 %indvars.iv.next to i32
781   %exitcond = icmp eq i32 %lftr.wideiv, %n
782   br i1 %exitcond, label %for.end, label %for.body
784 for.end:                                          ; preds = %for.body, %entry
785   ret void
788 declare float @llvm.rint.f32(float)
790 define void @rint_f64(i32 %n, ptr %y, ptr %x) {
791 ; CHECK-LABEL: @rint_f64(
792 ; CHECK: llvm.rint.v4f64
793 ; CHECK: ret void
795 entry:
796   %cmp6 = icmp sgt i32 %n, 0
797   br i1 %cmp6, 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 double, ptr %y, i64 %indvars.iv
802   %0 = load double, ptr %arrayidx, align 8
803   %call = tail call double @llvm.rint.f64(double %0)
804   %arrayidx2 = getelementptr inbounds double, ptr %x, i64 %indvars.iv
805   store double %call, ptr %arrayidx2, align 8
806   %indvars.iv.next = add i64 %indvars.iv, 1
807   %lftr.wideiv = trunc i64 %indvars.iv.next to i32
808   %exitcond = icmp eq i32 %lftr.wideiv, %n
809   br i1 %exitcond, label %for.end, label %for.body
811 for.end:                                          ; preds = %for.body, %entry
812   ret void
815 declare double @llvm.rint.f64(double)
817 define void @nearbyint_f32(i32 %n, ptr %y, ptr %x) {
818 ; CHECK-LABEL: @nearbyint_f32(
819 ; CHECK: llvm.nearbyint.v4f32
820 ; CHECK: ret void
822 entry:
823   %cmp6 = icmp sgt i32 %n, 0
824   br i1 %cmp6, label %for.body, label %for.end
826 for.body:                                         ; preds = %entry, %for.body
827   %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
828   %arrayidx = getelementptr inbounds float, ptr %y, i64 %indvars.iv
829   %0 = load float, ptr %arrayidx, align 4
830   %call = tail call float @llvm.nearbyint.f32(float %0)
831   %arrayidx2 = getelementptr inbounds float, ptr %x, i64 %indvars.iv
832   store float %call, ptr %arrayidx2, align 4
833   %indvars.iv.next = add i64 %indvars.iv, 1
834   %lftr.wideiv = trunc i64 %indvars.iv.next to i32
835   %exitcond = icmp eq i32 %lftr.wideiv, %n
836   br i1 %exitcond, label %for.end, label %for.body
838 for.end:                                          ; preds = %for.body, %entry
839   ret void
842 declare float @llvm.nearbyint.f32(float)
844 define void @nearbyint_f64(i32 %n, ptr %y, ptr %x) {
845 ; CHECK-LABEL: @nearbyint_f64(
846 ; CHECK: llvm.nearbyint.v4f64
847 ; CHECK: ret void
849 entry:
850   %cmp6 = icmp sgt i32 %n, 0
851   br i1 %cmp6, label %for.body, label %for.end
853 for.body:                                         ; preds = %entry, %for.body
854   %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
855   %arrayidx = getelementptr inbounds double, ptr %y, i64 %indvars.iv
856   %0 = load double, ptr %arrayidx, align 8
857   %call = tail call double @llvm.nearbyint.f64(double %0)
858   %arrayidx2 = getelementptr inbounds double, ptr %x, i64 %indvars.iv
859   store double %call, ptr %arrayidx2, align 8
860   %indvars.iv.next = add i64 %indvars.iv, 1
861   %lftr.wideiv = trunc i64 %indvars.iv.next to i32
862   %exitcond = icmp eq i32 %lftr.wideiv, %n
863   br i1 %exitcond, label %for.end, label %for.body
865 for.end:                                          ; preds = %for.body, %entry
866   ret void
869 declare double @llvm.nearbyint.f64(double)
871 define void @round_f32(i32 %n, ptr %y, ptr %x) {
872 ; CHECK-LABEL: @round_f32(
873 ; CHECK: llvm.round.v4f32
874 ; CHECK: ret void
876 entry:
877   %cmp6 = icmp sgt i32 %n, 0
878   br i1 %cmp6, label %for.body, label %for.end
880 for.body:                                         ; preds = %entry, %for.body
881   %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
882   %arrayidx = getelementptr inbounds float, ptr %y, i64 %indvars.iv
883   %0 = load float, ptr %arrayidx, align 4
884   %call = tail call float @llvm.round.f32(float %0)
885   %arrayidx2 = getelementptr inbounds float, ptr %x, i64 %indvars.iv
886   store float %call, ptr %arrayidx2, align 4
887   %indvars.iv.next = add i64 %indvars.iv, 1
888   %lftr.wideiv = trunc i64 %indvars.iv.next to i32
889   %exitcond = icmp eq i32 %lftr.wideiv, %n
890   br i1 %exitcond, label %for.end, label %for.body
892 for.end:                                          ; preds = %for.body, %entry
893   ret void
896 declare float @llvm.round.f32(float)
898 define void @round_f64(i32 %n, ptr %y, ptr %x) {
899 ; CHECK-LABEL: @round_f64(
900 ; CHECK: llvm.round.v4f64
901 ; CHECK: ret void
903 entry:
904   %cmp6 = icmp sgt i32 %n, 0
905   br i1 %cmp6, label %for.body, label %for.end
907 for.body:                                         ; preds = %entry, %for.body
908   %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
909   %arrayidx = getelementptr inbounds double, ptr %y, i64 %indvars.iv
910   %0 = load double, ptr %arrayidx, align 8
911   %call = tail call double @llvm.round.f64(double %0)
912   %arrayidx2 = getelementptr inbounds double, ptr %x, i64 %indvars.iv
913   store double %call, ptr %arrayidx2, align 8
914   %indvars.iv.next = add i64 %indvars.iv, 1
915   %lftr.wideiv = trunc i64 %indvars.iv.next to i32
916   %exitcond = icmp eq i32 %lftr.wideiv, %n
917   br i1 %exitcond, label %for.end, label %for.body
919 for.end:                                          ; preds = %for.body, %entry
920   ret void
923 declare double @llvm.round.f64(double)
925 define void @roundeven_f32(i32 %n, ptr %y, ptr %x) {
926 ; CHECK-LABEL: @roundeven_f32(
927 ; CHECK: llvm.roundeven.v4f32
928 ; CHECK: ret void
930 entry:
931   %cmp6 = icmp sgt i32 %n, 0
932   br i1 %cmp6, label %for.body, label %for.end
934 for.body:                                         ; preds = %entry, %for.body
935   %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
936   %arrayidx = getelementptr inbounds float, ptr %y, i64 %indvars.iv
937   %0 = load float, ptr %arrayidx, align 4
938   %call = tail call float @llvm.roundeven.f32(float %0)
939   %arrayidx2 = getelementptr inbounds float, ptr %x, i64 %indvars.iv
940   store float %call, ptr %arrayidx2, align 4
941   %indvars.iv.next = add i64 %indvars.iv, 1
942   %lftr.wideiv = trunc i64 %indvars.iv.next to i32
943   %exitcond = icmp eq i32 %lftr.wideiv, %n
944   br i1 %exitcond, label %for.end, label %for.body
946 for.end:                                          ; preds = %for.body, %entry
947   ret void
950 declare float @llvm.roundeven.f32(float)
952 define void @roundeven_f64(i32 %n, ptr %y, ptr %x) {
953 ; CHECK-LABEL: @roundeven_f64(
954 ; CHECK: llvm.roundeven.v4f64
955 ; CHECK: ret void
957 entry:
958   %cmp6 = icmp sgt i32 %n, 0
959   br i1 %cmp6, label %for.body, label %for.end
961 for.body:                                         ; preds = %entry, %for.body
962   %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
963   %arrayidx = getelementptr inbounds double, ptr %y, i64 %indvars.iv
964   %0 = load double, ptr %arrayidx, align 8
965   %call = tail call double @llvm.roundeven.f64(double %0)
966   %arrayidx2 = getelementptr inbounds double, ptr %x, i64 %indvars.iv
967   store double %call, ptr %arrayidx2, align 8
968   %indvars.iv.next = add i64 %indvars.iv, 1
969   %lftr.wideiv = trunc i64 %indvars.iv.next to i32
970   %exitcond = icmp eq i32 %lftr.wideiv, %n
971   br i1 %exitcond, label %for.end, label %for.body
973 for.end:                                          ; preds = %for.body, %entry
974   ret void
977 declare double @llvm.roundeven.f64(double)
979 define void @fma_f32(i32 %n, ptr %y, ptr %x, ptr %z, ptr %w) {
980 ; CHECK-LABEL: @fma_f32(
981 ; CHECK: llvm.fma.v4f32
982 ; CHECK: ret void
984 entry:
985   %cmp12 = icmp sgt i32 %n, 0
986   br i1 %cmp12, label %for.body, label %for.end
988 for.body:                                         ; preds = %entry, %for.body
989   %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
990   %arrayidx = getelementptr inbounds float, ptr %y, i64 %indvars.iv
991   %0 = load float, ptr %arrayidx, align 4
992   %arrayidx2 = getelementptr inbounds float, ptr %w, i64 %indvars.iv
993   %1 = load float, ptr %arrayidx2, align 4
994   %arrayidx4 = getelementptr inbounds float, ptr %z, i64 %indvars.iv
995   %2 = load float, ptr %arrayidx4, align 4
996   %3 = tail call float @llvm.fma.f32(float %0, float %2, float %1)
997   %arrayidx6 = getelementptr inbounds float, ptr %x, i64 %indvars.iv
998   store float %3, ptr %arrayidx6, align 4
999   %indvars.iv.next = add i64 %indvars.iv, 1
1000   %lftr.wideiv = trunc i64 %indvars.iv.next to i32
1001   %exitcond = icmp eq i32 %lftr.wideiv, %n
1002   br i1 %exitcond, label %for.end, label %for.body
1004 for.end:                                          ; preds = %for.body, %entry
1005   ret void
1008 declare float @llvm.fma.f32(float, float, float)
1010 define void @fma_f64(i32 %n, ptr %y, ptr %x, ptr %z, ptr %w) {
1011 ; CHECK-LABEL: @fma_f64(
1012 ; CHECK: llvm.fma.v4f64
1013 ; CHECK: ret void
1015 entry:
1016   %cmp12 = icmp sgt i32 %n, 0
1017   br i1 %cmp12, label %for.body, label %for.end
1019 for.body:                                         ; preds = %entry, %for.body
1020   %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
1021   %arrayidx = getelementptr inbounds double, ptr %y, i64 %indvars.iv
1022   %0 = load double, ptr %arrayidx, align 8
1023   %arrayidx2 = getelementptr inbounds double, ptr %w, i64 %indvars.iv
1024   %1 = load double, ptr %arrayidx2, align 8
1025   %arrayidx4 = getelementptr inbounds double, ptr %z, i64 %indvars.iv
1026   %2 = load double, ptr %arrayidx4, align 8
1027   %3 = tail call double @llvm.fma.f64(double %0, double %2, double %1)
1028   %arrayidx6 = getelementptr inbounds double, ptr %x, i64 %indvars.iv
1029   store double %3, ptr %arrayidx6, align 8
1030   %indvars.iv.next = add i64 %indvars.iv, 1
1031   %lftr.wideiv = trunc i64 %indvars.iv.next to i32
1032   %exitcond = icmp eq i32 %lftr.wideiv, %n
1033   br i1 %exitcond, label %for.end, label %for.body
1035 for.end:                                          ; preds = %for.body, %entry
1036   ret void
1039 declare double @llvm.fma.f64(double, double, double)
1041 define void @fmuladd_f32(i32 %n, ptr %y, ptr %x, ptr %z, ptr %w) {
1042 ; CHECK-LABEL: @fmuladd_f32(
1043 ; CHECK: llvm.fmuladd.v4f32
1044 ; CHECK: ret void
1046 entry:
1047   %cmp12 = icmp sgt i32 %n, 0
1048   br i1 %cmp12, label %for.body, label %for.end
1050 for.body:                                         ; preds = %entry, %for.body
1051   %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
1052   %arrayidx = getelementptr inbounds float, ptr %y, i64 %indvars.iv
1053   %0 = load float, ptr %arrayidx, align 4
1054   %arrayidx2 = getelementptr inbounds float, ptr %w, i64 %indvars.iv
1055   %1 = load float, ptr %arrayidx2, align 4
1056   %arrayidx4 = getelementptr inbounds float, ptr %z, i64 %indvars.iv
1057   %2 = load float, ptr %arrayidx4, align 4
1058   %3 = tail call float @llvm.fmuladd.f32(float %0, float %2, float %1)
1059   %arrayidx6 = getelementptr inbounds float, ptr %x, i64 %indvars.iv
1060   store float %3, ptr %arrayidx6, align 4
1061   %indvars.iv.next = add i64 %indvars.iv, 1
1062   %lftr.wideiv = trunc i64 %indvars.iv.next to i32
1063   %exitcond = icmp eq i32 %lftr.wideiv, %n
1064   br i1 %exitcond, label %for.end, label %for.body
1066 for.end:                                          ; preds = %for.body, %entry
1067   ret void
1070 declare float @llvm.fmuladd.f32(float, float, float)
1072 define void @fmuladd_f64(i32 %n, ptr %y, ptr %x, ptr %z, ptr %w) {
1073 ; CHECK-LABEL: @fmuladd_f64(
1074 ; CHECK: llvm.fmuladd.v4f64
1075 ; CHECK: ret void
1077 entry:
1078   %cmp12 = icmp sgt i32 %n, 0
1079   br i1 %cmp12, label %for.body, label %for.end
1081 for.body:                                         ; preds = %entry, %for.body
1082   %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
1083   %arrayidx = getelementptr inbounds double, ptr %y, i64 %indvars.iv
1084   %0 = load double, ptr %arrayidx, align 8
1085   %arrayidx2 = getelementptr inbounds double, ptr %w, i64 %indvars.iv
1086   %1 = load double, ptr %arrayidx2, align 8
1087   %arrayidx4 = getelementptr inbounds double, ptr %z, i64 %indvars.iv
1088   %2 = load double, ptr %arrayidx4, align 8
1089   %3 = tail call double @llvm.fmuladd.f64(double %0, double %2, double %1)
1090   %arrayidx6 = getelementptr inbounds double, ptr %x, i64 %indvars.iv
1091   store double %3, ptr %arrayidx6, align 8
1092   %indvars.iv.next = add i64 %indvars.iv, 1
1093   %lftr.wideiv = trunc i64 %indvars.iv.next to i32
1094   %exitcond = icmp eq i32 %lftr.wideiv, %n
1095   br i1 %exitcond, label %for.end, label %for.body
1097 for.end:                                          ; preds = %for.body, %entry
1098   ret void
1101 declare double @llvm.fmuladd.f64(double, double, double)
1103 define void @pow_f32(i32 %n, ptr %y, ptr %x, ptr %z) {
1104 ; CHECK-LABEL: @pow_f32(
1105 ; CHECK: llvm.pow.v4f32
1106 ; CHECK: ret void
1108 entry:
1109   %cmp9 = icmp sgt i32 %n, 0
1110   br i1 %cmp9, label %for.body, label %for.end
1112 for.body:                                         ; preds = %entry, %for.body
1113   %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
1114   %arrayidx = getelementptr inbounds float, ptr %y, i64 %indvars.iv
1115   %0 = load float, ptr %arrayidx, align 4
1116   %arrayidx2 = getelementptr inbounds float, ptr %z, i64 %indvars.iv
1117   %1 = load float, ptr %arrayidx2, align 4
1118   %call = tail call float @llvm.pow.f32(float %0, float %1)
1119   %arrayidx4 = getelementptr inbounds float, ptr %x, i64 %indvars.iv
1120   store float %call, ptr %arrayidx4, align 4
1121   %indvars.iv.next = add i64 %indvars.iv, 1
1122   %lftr.wideiv = trunc i64 %indvars.iv.next to i32
1123   %exitcond = icmp eq i32 %lftr.wideiv, %n
1124   br i1 %exitcond, label %for.end, label %for.body
1126 for.end:                                          ; preds = %for.body, %entry
1127   ret void
1130 declare float @llvm.pow.f32(float, float)
1132 define void @pow_f64(i32 %n, ptr %y, ptr %x, ptr %z) {
1133 ; CHECK-LABEL: @pow_f64(
1134 ; CHECK: llvm.pow.v4f64
1135 ; CHECK: ret void
1137 entry:
1138   %cmp9 = icmp sgt i32 %n, 0
1139   br i1 %cmp9, label %for.body, label %for.end
1141 for.body:                                         ; preds = %entry, %for.body
1142   %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
1143   %arrayidx = getelementptr inbounds double, ptr %y, i64 %indvars.iv
1144   %0 = load double, ptr %arrayidx, align 8
1145   %arrayidx2 = getelementptr inbounds double, ptr %z, i64 %indvars.iv
1146   %1 = load double, ptr %arrayidx2, align 8
1147   %call = tail call double @llvm.pow.f64(double %0, double %1)
1148   %arrayidx4 = getelementptr inbounds double, ptr %x, i64 %indvars.iv
1149   store double %call, ptr %arrayidx4, align 8
1150   %indvars.iv.next = add i64 %indvars.iv, 1
1151   %lftr.wideiv = trunc i64 %indvars.iv.next to i32
1152   %exitcond = icmp eq i32 %lftr.wideiv, %n
1153   br i1 %exitcond, label %for.end, label %for.body
1155 for.end:                                          ; preds = %for.body, %entry
1156   ret void
1159 define void @fabs_libm(ptr %x) {
1160 ; CHECK: fabs_libm
1161 ; CHECK: call <4 x float> @llvm.fabs.v4f32
1162 ; CHECK: ret void
1164 entry:
1165   br label %for.body
1167 for.body:                                         ; preds = %entry, %for.body
1168   %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.body ]
1169   %arrayidx = getelementptr inbounds float, ptr %x, i64 %indvars.iv
1170   %0 = load float, ptr %arrayidx, align 4
1171   %call = tail call float @fabsf(float %0) nounwind readnone
1172   store float %call, ptr %arrayidx, align 4
1173   %indvars.iv.next = add i64 %indvars.iv, 1
1174   %lftr.wideiv = trunc i64 %indvars.iv.next to i32
1175   %exitcond = icmp eq i32 %lftr.wideiv, 1024
1176   br i1 %exitcond, label %for.end, label %for.body
1178 for.end:                                          ; preds = %for.body
1179   ret void
1182 declare float @fabsf(float) nounwind readnone
1184 declare double @llvm.pow.f64(double, double)
1186 ; Make sure we don't replace calls to functions with standard library function
1187 ; signatures but defined with internal linkage.
1189 define internal float @roundf(float %x) {
1190   ret float 0.00000000
1192 define void @internal_round(ptr %x) {
1193 ; CHECK-LABEL: internal_round
1194 ; CHECK-NOT:  load <4 x float>
1195 ; CHECK: ret void
1197 entry:
1198   br label %for.body
1200 for.body:                                         ; preds = %entry, %for.body
1201   %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.body ]
1202   %arrayidx = getelementptr inbounds float, ptr %x, i64 %indvars.iv
1203   %0 = load float, ptr %arrayidx, align 4
1204   %call = tail call float @roundf(float %0)
1205   store float %call, ptr %arrayidx, align 4
1206   %indvars.iv.next = add i64 %indvars.iv, 1
1207   %lftr.wideiv = trunc i64 %indvars.iv.next to i32
1208   %exitcond = icmp eq i32 %lftr.wideiv, 1024
1209   br i1 %exitcond, label %for.end, label %for.body
1211 for.end:                                          ; preds = %for.body
1212   ret void
1215 ; Make sure we don't replace calls to functions with standard library names but
1216 ; different signatures.
1218 declare void @round(double %f)
1220 define void @wrong_signature(ptr %x) {
1221 ; CHECK-LABEL: wrong_signature
1222 ; CHECK-NOT:  load <4 x double>
1223 ; CHECK: ret void
1225 entry:
1226   br label %for.body
1228 for.body:                                         ; preds = %entry, %for.body
1229   %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.body ]
1230   %arrayidx = getelementptr inbounds double, ptr %x, i64 %indvars.iv
1231   %0 = load double, ptr %arrayidx, align 4
1232   store double %0, ptr %arrayidx, align 4
1233   tail call void @round(double %0)
1234   %indvars.iv.next = add i64 %indvars.iv, 1
1235   %lftr.wideiv = trunc i64 %indvars.iv.next to i32
1236   %exitcond = icmp eq i32 %lftr.wideiv, 1024
1237   br i1 %exitcond, label %for.end, label %for.body
1239 for.end:                                          ; preds = %for.body
1240   ret void
1243 declare double @llvm.powi.f64.i32(double %Val, i32 %power)
1245 define void @powi_f64(i32 %n, ptr %y, ptr %x, i32 %P) {
1246 ; CHECK-LABEL: @powi_f64(
1247 ; CHECK: llvm.powi.v4f64
1248 ; CHECK: ret void
1250 entry:
1251   %cmp9 = icmp sgt i32 %n, 0
1252   br i1 %cmp9, label %for.body, label %for.end
1254 for.body:                                         ; preds = %entry, %for.body
1255   %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
1256   %arrayidx = getelementptr inbounds double, ptr %y, i64 %indvars.iv
1257   %0 = load double, ptr %arrayidx, align 8
1258   %call = tail call double @llvm.powi.f64.i32(double %0, i32  %P)
1259   %arrayidx4 = getelementptr inbounds double, ptr %x, i64 %indvars.iv
1260   store double %call, ptr %arrayidx4, align 8
1261   %indvars.iv.next = add i64 %indvars.iv, 1
1262   %lftr.wideiv = trunc i64 %indvars.iv.next to i32
1263   %exitcond = icmp eq i32 %lftr.wideiv, %n
1264   br i1 %exitcond, label %for.end, label %for.body
1266 for.end:                                          ; preds = %for.body, %entry
1267   ret void
1270 define void @powi_f64_neg(i32 %n, ptr %y, ptr %x) {
1271 ; CHECK-LABEL: @powi_f64_neg(
1272 ; CHECK-NOT: llvm.powi.v4f64
1273 ; CHECK: ret void
1275 entry:
1276   %cmp9 = icmp sgt i32 %n, 0
1277   br i1 %cmp9, label %for.body, label %for.end
1279 for.body:                                         ; preds = %entry, %for.body
1280   %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
1281   %arrayidx = getelementptr inbounds double, ptr %y, i64 %indvars.iv
1282   %0 = load double, ptr %arrayidx, align 8
1283   %1 = trunc i64 %indvars.iv to i32
1284   %call = tail call double @llvm.powi.f64.i32(double %0, i32  %1)
1285   %arrayidx4 = getelementptr inbounds double, ptr %x, i64 %indvars.iv
1286   store double %call, ptr %arrayidx4, align 8
1287   %indvars.iv.next = add i64 %indvars.iv, 1
1288   %lftr.wideiv = trunc i64 %indvars.iv.next to i32
1289   %exitcond = icmp eq i32 %lftr.wideiv, %n
1290   br i1 %exitcond, label %for.end, label %for.body
1292 for.end:                                          ; preds = %for.body, %entry
1293   ret void
1296 declare i64  @llvm.cttz.i64 (i64, i1)
1298 define void @cttz_f64(i32 %n, ptr %y, ptr %x) {
1299 ; CHECK-LABEL: @cttz_f64(
1300 ; CHECK: llvm.cttz.v4i64
1301 ; CHECK: ret void
1303 entry:
1304   %cmp9 = icmp sgt i32 %n, 0
1305   br i1 %cmp9, label %for.body, label %for.end
1307 for.body:                                         ; preds = %entry, %for.body
1308   %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
1309   %arrayidx = getelementptr inbounds i64, ptr %y, i64 %indvars.iv
1310   %0 = load i64, ptr %arrayidx, align 8
1311   %call = tail call i64 @llvm.cttz.i64(i64 %0, i1 true)
1312   %arrayidx4 = getelementptr inbounds i64, ptr %x, i64 %indvars.iv
1313   store i64 %call, ptr %arrayidx4, align 8
1314   %indvars.iv.next = add i64 %indvars.iv, 1
1315   %lftr.wideiv = trunc i64 %indvars.iv.next to i32
1316   %exitcond = icmp eq i32 %lftr.wideiv, %n
1317   br i1 %exitcond, label %for.end, label %for.body
1319 for.end:                                          ; preds = %for.body, %entry
1320   ret void
1323 declare i64  @llvm.ctlz.i64 (i64, i1)
1325 define void @ctlz_f64(i32 %n, ptr %y, ptr %x) {
1326 ; CHECK-LABEL: @ctlz_f64(
1327 ; CHECK: llvm.ctlz.v4i64
1328 ; CHECK: ret void
1330 entry:
1331   %cmp9 = icmp sgt i32 %n, 0
1332   br i1 %cmp9, label %for.body, label %for.end
1334 for.body:                                         ; preds = %entry, %for.body
1335   %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
1336   %arrayidx = getelementptr inbounds i64, ptr %y, i64 %indvars.iv
1337   %0 = load i64, ptr %arrayidx, align 8
1338   %call = tail call i64 @llvm.ctlz.i64(i64 %0, i1 true)
1339   %arrayidx4 = getelementptr inbounds i64, ptr %x, i64 %indvars.iv
1340   store i64 %call, ptr %arrayidx4, align 8
1341   %indvars.iv.next = add i64 %indvars.iv, 1
1342   %lftr.wideiv = trunc i64 %indvars.iv.next to i32
1343   %exitcond = icmp eq i32 %lftr.wideiv, %n
1344   br i1 %exitcond, label %for.end, label %for.body
1346 for.end:                                          ; preds = %for.body, %entry
1347   ret void
1350 declare i64 @llvm.abs.i64 (i64, i1)
1352 define void @abs_i64(i32 %n, ptr %y, ptr %x) {
1353 ; CHECK-LABEL: @abs_i64(
1354 ; CHECK: llvm.abs.v4i64(<4 x i64> [[WIDE_LOADX:%.*]], i1 true)
1355 ; CHECK: ret void
1357 entry:
1358   %cmp9 = icmp sgt i32 %n, 0
1359   br i1 %cmp9, label %for.body, label %for.end
1361 for.body:                                         ; preds = %entry, %for.body
1362   %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
1363   %arrayidx = getelementptr inbounds i64, ptr %y, i64 %indvars.iv
1364   %0 = load i64, ptr %arrayidx, align 8
1365   %call = tail call i64 @llvm.abs.i64(i64 %0, i1 true)
1366   %arrayidx4 = getelementptr inbounds i64, ptr %x, i64 %indvars.iv
1367   store i64 %call, ptr %arrayidx4, align 8
1368   %indvars.iv.next = add i64 %indvars.iv, 1
1369   %lftr.wideiv = trunc i64 %indvars.iv.next to i32
1370   %exitcond = icmp eq i32 %lftr.wideiv, %n
1371   br i1 %exitcond, label %for.end, label %for.body
1373 for.end:                                          ; preds = %for.body, %entry
1374   ret void
1377 declare i32 @llvm.smin.i32 (i32, i32)
1379 define void @smin_i32(i32 %n, ptr %x, ptr %y) {
1380 ; CHECK-LABEL: @smin_i32(
1381 ; CHECK:         call <4 x i32> @llvm.smin.v4i32(<4 x i32> [[WIDE_LOADX:%.*]], <4 x i32> [[WIDE_LOADY:%.*]])
1382 ; CHECK:         ret void
1384 entry:
1385   %cmp = icmp sgt i32 %n, 0
1386   br i1 %cmp, label %loop, label %end
1388 loop:
1389   %iv = phi i32 [ %iv.next, %loop ], [ 0, %entry ]
1390   %xi = getelementptr inbounds i32, ptr %x, i32 %iv
1391   %yi = getelementptr inbounds i32, ptr %y, i32 %iv
1392   %xld = load i32, ptr %xi, align 4
1393   %yld = load i32, ptr %yi, align 4
1394   %call = tail call i32 @llvm.smin.i32(i32 %xld, i32 %yld)
1395   store i32 %call, ptr %xi, align 4
1396   %iv.next = add i32 %iv, 1
1397   %exitcond = icmp eq i32 %iv.next, %n
1398   br i1 %exitcond, label %end, label %loop
1400 end:
1401   ret void
1404 declare i32 @llvm.smax.i32 (i32, i32)
1406 define void @smax_i32(i32 %n, ptr %x, ptr %y) {
1407 ; CHECK-LABEL: @smax_i32(
1408 ; CHECK:         call <4 x i32> @llvm.smax.v4i32(<4 x i32> [[WIDE_LOADX:%.*]], <4 x i32> [[WIDE_LOADY:%.*]])
1409 ; CHECK:         ret void
1411 entry:
1412   %cmp = icmp sgt i32 %n, 0
1413   br i1 %cmp, label %loop, label %end
1415 loop:
1416   %iv = phi i32 [ %iv.next, %loop ], [ 0, %entry ]
1417   %xi = getelementptr inbounds i32, ptr %x, i32 %iv
1418   %yi = getelementptr inbounds i32, ptr %y, i32 %iv
1419   %xld = load i32, ptr %xi, align 4
1420   %yld = load i32, ptr %yi, align 4
1421   %call = tail call i32 @llvm.smax.i32(i32 %xld, i32 %yld)
1422   store i32 %call, ptr %xi, align 4
1423   %iv.next = add i32 %iv, 1
1424   %exitcond = icmp eq i32 %iv.next, %n
1425   br i1 %exitcond, label %end, label %loop
1427 end:
1428   ret void
1431 declare i32 @llvm.umin.i32 (i32, i32)
1433 define void @umin_i32(i32 %n, ptr %x, ptr %y) {
1434 ; CHECK-LABEL: @umin_i32(
1435 ; CHECK:         call <4 x i32> @llvm.umin.v4i32(<4 x i32> [[WIDE_LOADX:%.*]], <4 x i32> [[WIDE_LOADY:%.*]])
1436 ; CHECK:         ret void
1438 entry:
1439   %cmp = icmp sgt i32 %n, 0
1440   br i1 %cmp, label %loop, label %end
1442 loop:
1443   %iv = phi i32 [ %iv.next, %loop ], [ 0, %entry ]
1444   %xi = getelementptr inbounds i32, ptr %x, i32 %iv
1445   %yi = getelementptr inbounds i32, ptr %y, i32 %iv
1446   %xld = load i32, ptr %xi, align 4
1447   %yld = load i32, ptr %yi, align 4
1448   %call = tail call i32 @llvm.umin.i32(i32 %xld, i32 %yld)
1449   store i32 %call, ptr %xi, align 4
1450   %iv.next = add i32 %iv, 1
1451   %exitcond = icmp eq i32 %iv.next, %n
1452   br i1 %exitcond, label %end, label %loop
1454 end:
1455   ret void
1458 declare i32 @llvm.umax.i32 (i32, i32)
1460 define void @umax_i32(i32 %n, ptr %x, ptr %y) {
1461 ; CHECK-LABEL: @umax_i32(
1462 ; CHECK:         call <4 x i32> @llvm.umax.v4i32(<4 x i32> [[WIDE_LOADX:%.*]], <4 x i32> [[WIDE_LOADY:%.*]])
1463 ; CHECK:         ret void
1465 entry:
1466   %cmp = icmp sgt i32 %n, 0
1467   br i1 %cmp, label %loop, label %end
1469 loop:
1470   %iv = phi i32 [ %iv.next, %loop ], [ 0, %entry ]
1471   %xi = getelementptr inbounds i32, ptr %x, i32 %iv
1472   %yi = getelementptr inbounds i32, ptr %y, i32 %iv
1473   %xld = load i32, ptr %xi, align 4
1474   %yld = load i32, ptr %yi, align 4
1475   %call = tail call i32 @llvm.umax.i32(i32 %xld, i32 %yld)
1476   store i32 %call, ptr %xi, align 4
1477   %iv.next = add i32 %iv, 1
1478   %exitcond = icmp eq i32 %iv.next, %n
1479   br i1 %exitcond, label %end, label %loop
1481 end:
1482   ret void
1485 declare i32 @llvm.fshl.i32 (i32, i32, i32)
1487 define void @fshl_i32(i32 %n, ptr %x, ptr %y, i32 %shAmt) {
1488 ; CHECK-LABEL: @fshl_i32(
1489 ; CHECK:         call <4 x i32> @llvm.fshl.v4i32(<4 x i32> [[WIDE_LOADX:%.*]], <4 x i32> [[WIDE_LOADY:%.*]], <4 x i32> [[SPLAT:%.*]])
1490 ; CHECK:         ret void
1492 entry:
1493   %cmp = icmp sgt i32 %n, 0
1494   br i1 %cmp, label %loop, label %end
1496 loop:
1497   %iv = phi i32 [ %iv.next, %loop ], [ 0, %entry ]
1498   %xi = getelementptr inbounds i32, ptr %x, i32 %iv
1499   %yi = getelementptr inbounds i32, ptr %y, i32 %iv
1500   %xld = load i32, ptr %xi, align 4
1501   %yld = load i32, ptr %yi, align 4
1502   %call = tail call i32 @llvm.fshl.i32(i32 %xld, i32 %yld, i32 %shAmt)
1503   store i32 %call, ptr %xi, align 4
1504   %iv.next = add i32 %iv, 1
1505   %exitcond = icmp eq i32 %iv.next, %n
1506   br i1 %exitcond, label %end, label %loop
1508 end:
1509   ret void
1512 declare i32 @llvm.fshr.i32 (i32, i32, i32)
1514 define void @fshr_i32(i32 %n, ptr %x, ptr %y, i32 %shAmt) {
1515 ; CHECK-LABEL: @fshr_i32(
1516 ; CHECK:         call <4 x i32> @llvm.fshr.v4i32(<4 x i32> [[WIDE_LOADX:%.*]], <4 x i32> [[WIDE_LOADY:%.*]], <4 x i32> [[SPLAT:%.*]])
1517 ; CHECK:         ret void
1519 entry:
1520   %cmp = icmp sgt i32 %n, 0
1521   br i1 %cmp, label %loop, label %end
1523 loop:
1524   %iv = phi i32 [ %iv.next, %loop ], [ 0, %entry ]
1525   %xi = getelementptr inbounds i32, ptr %x, i32 %iv
1526   %yi = getelementptr inbounds i32, ptr %y, i32 %iv
1527   %xld = load i32, ptr %xi, align 4
1528   %yld = load i32, ptr %yi, align 4
1529   %call = tail call i32 @llvm.fshr.i32(i32 %xld, i32 %yld, i32 %shAmt)
1530   store i32 %call, ptr %xi, align 4
1531   %iv.next = add i32 %iv, 1
1532   %exitcond = icmp eq i32 %iv.next, %n
1533   br i1 %exitcond, label %end, label %loop
1535 end:
1536   ret void
1539 declare float @llvm.minnum.f32(float, float)
1541 define void @minnum_f32(i32 %n, ptr %y, ptr %x, ptr %z) {
1542 ; CHECK-LABEL: @minnum_f32(
1543 ; CHECK: llvm.minnum.v4f32
1544 ; CHECK: ret void
1546 entry:
1547   %cmp9 = icmp sgt i32 %n, 0
1548   br i1 %cmp9, label %for.body, label %for.end
1550 for.body:                                         ; preds = %entry, %for.body
1551   %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
1552   %arrayidx = getelementptr inbounds float, ptr %y, i64 %indvars.iv
1553   %0 = load float, ptr %arrayidx, align 4
1554   %arrayidx2 = getelementptr inbounds float, ptr %z, i64 %indvars.iv
1555   %1 = load float, ptr %arrayidx2, align 4
1556   %call = tail call float @llvm.minnum.f32(float %0, float %1)
1557   %arrayidx4 = getelementptr inbounds float, ptr %x, i64 %indvars.iv
1558   store float %call, ptr %arrayidx4, align 4
1559   %indvars.iv.next = add i64 %indvars.iv, 1
1560   %lftr.wideiv = trunc i64 %indvars.iv.next to i32
1561   %exitcond = icmp eq i32 %lftr.wideiv, %n
1562   br i1 %exitcond, label %for.end, label %for.body
1564 for.end:                                          ; preds = %for.body, %entry
1565   ret void
1568 declare float @llvm.maxnum.f32(float, float)
1570 define void @maxnum_f32(i32 %n, ptr %y, ptr %x, ptr %z) {
1571 ; CHECK-LABEL: @maxnum_f32(
1572 ; CHECK: llvm.maxnum.v4f32
1573 ; CHECK: ret void
1575 entry:
1576   %cmp9 = icmp sgt i32 %n, 0
1577   br i1 %cmp9, label %for.body, label %for.end
1579 for.body:                                         ; preds = %entry, %for.body
1580   %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
1581   %arrayidx = getelementptr inbounds float, ptr %y, i64 %indvars.iv
1582   %0 = load float, ptr %arrayidx, align 4
1583   %arrayidx2 = getelementptr inbounds float, ptr %z, i64 %indvars.iv
1584   %1 = load float, ptr %arrayidx2, align 4
1585   %call = tail call float @llvm.maxnum.f32(float %0, float %1)
1586   %arrayidx4 = getelementptr inbounds float, ptr %x, i64 %indvars.iv
1587   store float %call, ptr %arrayidx4, align 4
1588   %indvars.iv.next = add i64 %indvars.iv, 1
1589   %lftr.wideiv = trunc i64 %indvars.iv.next to i32
1590   %exitcond = icmp eq i32 %lftr.wideiv, %n
1591   br i1 %exitcond, label %for.end, label %for.body
1593 for.end:                                          ; preds = %for.body, %entry
1594   ret void
1597 declare float @llvm.minimum.f32(float, float)
1599 define void @minimum_f32(i32 %n, ptr %y, ptr %x, ptr %z) {
1600 ; CHECK-LABEL: @minimum_f32(
1601 ; CHECK: llvm.minimum.v4f32
1602 ; CHECK: ret void
1604 entry:
1605   %cmp9 = icmp sgt i32 %n, 0
1606   br i1 %cmp9, label %for.body, label %for.end
1608 for.body:                                         ; preds = %entry, %for.body
1609   %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
1610   %arrayidx = getelementptr inbounds float, ptr %y, i64 %indvars.iv
1611   %0 = load float, ptr %arrayidx, align 4
1612   %arrayidx2 = getelementptr inbounds float, ptr %z, i64 %indvars.iv
1613   %1 = load float, ptr %arrayidx2, align 4
1614   %call = tail call float @llvm.minimum.f32(float %0, float %1)
1615   %arrayidx4 = getelementptr inbounds float, ptr %x, i64 %indvars.iv
1616   store float %call, ptr %arrayidx4, align 4
1617   %indvars.iv.next = add i64 %indvars.iv, 1
1618   %lftr.wideiv = trunc i64 %indvars.iv.next to i32
1619   %exitcond = icmp eq i32 %lftr.wideiv, %n
1620   br i1 %exitcond, label %for.end, label %for.body
1622 for.end:                                          ; preds = %for.body, %entry
1623   ret void
1626 declare float @llvm.maximum.f32(float, float)
1628 define void @maximum_f32(i32 %n, ptr %y, ptr %x, ptr %z) {
1629 ; CHECK-LABEL: @maximum_f32(
1630 ; CHECK: llvm.maximum.v4f32
1631 ; CHECK: ret void
1633 entry:
1634   %cmp9 = icmp sgt i32 %n, 0
1635   br i1 %cmp9, label %for.body, label %for.end
1637 for.body:                                         ; preds = %entry, %for.body
1638   %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
1639   %arrayidx = getelementptr inbounds float, ptr %y, i64 %indvars.iv
1640   %0 = load float, ptr %arrayidx, align 4
1641   %arrayidx2 = getelementptr inbounds float, ptr %z, i64 %indvars.iv
1642   %1 = load float, ptr %arrayidx2, align 4
1643   %call = tail call float @llvm.maximum.f32(float %0, float %1)
1644   %arrayidx4 = getelementptr inbounds float, ptr %x, i64 %indvars.iv
1645   store float %call, ptr %arrayidx4, align 4
1646   %indvars.iv.next = add i64 %indvars.iv, 1
1647   %lftr.wideiv = trunc i64 %indvars.iv.next to i32
1648   %exitcond = icmp eq i32 %lftr.wideiv, %n
1649   br i1 %exitcond, label %for.end, label %for.body
1651 for.end:                                          ; preds = %for.body, %entry
1652   ret void
1655 declare i32 @llvm.lrint.i32.f32(float)
1657 define void @lrint_i32_f32(ptr %x, ptr %y, i64 %n) {
1658 ; CHECK-LABEL: @lrint_i32_f32(
1659 ; CHECK: llvm.lrint.v4i32.v4f32
1660 ; CHECK: ret void
1662 entry:
1663   %cmp = icmp sgt i64 %n, 0
1664   br i1 %cmp, label %for.body, label %exit
1666 for.body:                                         ; preds = %entry, %for.body
1667   %iv = phi i64 [ 0, %entry ], [ %iv.next, %for.body ]
1668   %gep.load = getelementptr inbounds float, ptr %x, i64 %iv
1669   %0 = load float, ptr %gep.load, align 4
1670   %1 = tail call i32 @llvm.lrint.i32.f32(float %0)
1671   %gep.store = getelementptr inbounds i32, ptr %y, i64 %iv
1672   store i32 %1, ptr %gep.store, align 4
1673   %iv.next = add nuw nsw i64 %iv, 1
1674   %exitcond = icmp eq i64 %iv.next, %n
1675   br i1 %exitcond, label %exit, label %for.body
1677 exit:                                            ; preds = %for.body, %entry
1678   ret void
1681 declare i64 @llvm.llrint.i64.f32(float)
1683 define void @llrint_i64_f32(ptr %x, ptr %y, i64 %n) {
1684 ; CHECK-LABEL: @llrint_i64_f32(
1685 ; CHECK: llvm.llrint.v4i64.v4f32
1686 ; CHECK: ret void
1688 entry:
1689   %cmp = icmp sgt i64 %n, 0
1690   br i1 %cmp, label %for.body, label %exit
1692 for.body:                                         ; preds = %entry, %for.body
1693   %iv = phi i64 [ 0, %entry ], [ %iv.next, %for.body ]
1694   %gep.load = getelementptr inbounds float, ptr %x, i64 %iv
1695   %0 = load float, ptr %gep.load, align 4
1696   %1 = tail call i64 @llvm.llrint.i64.f32(float %0)
1697   %gep.store = getelementptr inbounds i64, ptr %y, i64 %iv
1698   store i64 %1, ptr %gep.store, align 4
1699   %iv.next = add nuw nsw i64 %iv, 1
1700   %exitcond = icmp eq i64 %iv.next, %n
1701   br i1 %exitcond, label %exit, label %for.body
1703 exit:                                            ; preds = %for.body, %entry
1704   ret void