[DAGCombiner] Add target hook function to decide folding (mul (add x, c1), c2)
[llvm-project.git] / llvm / test / Transforms / LoopVectorize / intrinsic.ll
bloba4c900772219cce72bed3af347bf74af6854e696
1 ; RUN: opt < %s  -loop-vectorize -force-vector-interleave=1 -force-vector-width=4 -dce -instcombine -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"
5 ;CHECK-LABEL: @sqrt_f32(
6 ;CHECK: llvm.sqrt.v4f32
7 ;CHECK: ret void
8 define void @sqrt_f32(i32 %n, float* noalias %y, float* noalias %x) nounwind uwtable {
9 entry:
10   %cmp6 = icmp sgt i32 %n, 0
11   br i1 %cmp6, label %for.body, label %for.end
13 for.body:                                         ; preds = %entry, %for.body
14   %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
15   %arrayidx = getelementptr inbounds float, float* %y, i64 %indvars.iv
16   %0 = load float, float* %arrayidx, align 4
17   %call = tail call float @llvm.sqrt.f32(float %0) nounwind readnone
18   %arrayidx2 = getelementptr inbounds float, float* %x, i64 %indvars.iv
19   store float %call, float* %arrayidx2, align 4
20   %indvars.iv.next = add i64 %indvars.iv, 1
21   %lftr.wideiv = trunc i64 %indvars.iv.next to i32
22   %exitcond = icmp eq i32 %lftr.wideiv, %n
23   br i1 %exitcond, label %for.end, label %for.body
25 for.end:                                          ; preds = %for.body, %entry
26   ret void
29 declare float @llvm.sqrt.f32(float) nounwind readnone
31 ;CHECK-LABEL: @sqrt_f64(
32 ;CHECK: llvm.sqrt.v4f64
33 ;CHECK: ret void
34 define void @sqrt_f64(i32 %n, double* noalias %y, double* noalias %x) nounwind uwtable {
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, double* %y, i64 %indvars.iv
42   %0 = load double, double* %arrayidx, align 8
43   %call = tail call double @llvm.sqrt.f64(double %0) nounwind readnone
44   %arrayidx2 = getelementptr inbounds double, double* %x, i64 %indvars.iv
45   store double %call, double* %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) nounwind readnone
57 ;CHECK-LABEL: @sin_f32(
58 ;CHECK: llvm.sin.v4f32
59 ;CHECK: ret void
60 define void @sin_f32(i32 %n, float* noalias %y, float* noalias %x) nounwind uwtable {
61 entry:
62   %cmp6 = icmp sgt i32 %n, 0
63   br i1 %cmp6, label %for.body, label %for.end
65 for.body:                                         ; preds = %entry, %for.body
66   %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
67   %arrayidx = getelementptr inbounds float, float* %y, i64 %indvars.iv
68   %0 = load float, float* %arrayidx, align 4
69   %call = tail call float @llvm.sin.f32(float %0) nounwind readnone
70   %arrayidx2 = getelementptr inbounds float, float* %x, i64 %indvars.iv
71   store float %call, float* %arrayidx2, align 4
72   %indvars.iv.next = add i64 %indvars.iv, 1
73   %lftr.wideiv = trunc i64 %indvars.iv.next to i32
74   %exitcond = icmp eq i32 %lftr.wideiv, %n
75   br i1 %exitcond, label %for.end, label %for.body
77 for.end:                                          ; preds = %for.body, %entry
78   ret void
81 declare float @llvm.sin.f32(float) nounwind readnone
83 ;CHECK-LABEL: @sin_f64(
84 ;CHECK: llvm.sin.v4f64
85 ;CHECK: ret void
86 define void @sin_f64(i32 %n, double* noalias %y, double* noalias %x) nounwind uwtable {
87 entry:
88   %cmp6 = icmp sgt i32 %n, 0
89   br i1 %cmp6, label %for.body, label %for.end
91 for.body:                                         ; preds = %entry, %for.body
92   %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
93   %arrayidx = getelementptr inbounds double, double* %y, i64 %indvars.iv
94   %0 = load double, double* %arrayidx, align 8
95   %call = tail call double @llvm.sin.f64(double %0) nounwind readnone
96   %arrayidx2 = getelementptr inbounds double, double* %x, i64 %indvars.iv
97   store double %call, double* %arrayidx2, align 8
98   %indvars.iv.next = add i64 %indvars.iv, 1
99   %lftr.wideiv = trunc i64 %indvars.iv.next to i32
100   %exitcond = icmp eq i32 %lftr.wideiv, %n
101   br i1 %exitcond, label %for.end, label %for.body
103 for.end:                                          ; preds = %for.body, %entry
104   ret void
107 declare double @llvm.sin.f64(double) nounwind readnone
109 ;CHECK-LABEL: @cos_f32(
110 ;CHECK: llvm.cos.v4f32
111 ;CHECK: ret void
112 define void @cos_f32(i32 %n, float* noalias %y, float* noalias %x) nounwind uwtable {
113 entry:
114   %cmp6 = icmp sgt i32 %n, 0
115   br i1 %cmp6, label %for.body, label %for.end
117 for.body:                                         ; preds = %entry, %for.body
118   %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
119   %arrayidx = getelementptr inbounds float, float* %y, i64 %indvars.iv
120   %0 = load float, float* %arrayidx, align 4
121   %call = tail call float @llvm.cos.f32(float %0) nounwind readnone
122   %arrayidx2 = getelementptr inbounds float, float* %x, i64 %indvars.iv
123   store float %call, float* %arrayidx2, align 4
124   %indvars.iv.next = add i64 %indvars.iv, 1
125   %lftr.wideiv = trunc i64 %indvars.iv.next to i32
126   %exitcond = icmp eq i32 %lftr.wideiv, %n
127   br i1 %exitcond, label %for.end, label %for.body
129 for.end:                                          ; preds = %for.body, %entry
130   ret void
133 declare float @llvm.cos.f32(float) nounwind readnone
135 ;CHECK-LABEL: @cos_f64(
136 ;CHECK: llvm.cos.v4f64
137 ;CHECK: ret void
138 define void @cos_f64(i32 %n, double* noalias %y, double* noalias %x) nounwind uwtable {
139 entry:
140   %cmp6 = icmp sgt i32 %n, 0
141   br i1 %cmp6, label %for.body, label %for.end
143 for.body:                                         ; preds = %entry, %for.body
144   %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
145   %arrayidx = getelementptr inbounds double, double* %y, i64 %indvars.iv
146   %0 = load double, double* %arrayidx, align 8
147   %call = tail call double @llvm.cos.f64(double %0) nounwind readnone
148   %arrayidx2 = getelementptr inbounds double, double* %x, i64 %indvars.iv
149   store double %call, double* %arrayidx2, align 8
150   %indvars.iv.next = add i64 %indvars.iv, 1
151   %lftr.wideiv = trunc i64 %indvars.iv.next to i32
152   %exitcond = icmp eq i32 %lftr.wideiv, %n
153   br i1 %exitcond, label %for.end, label %for.body
155 for.end:                                          ; preds = %for.body, %entry
156   ret void
159 declare double @llvm.cos.f64(double) nounwind readnone
161 ;CHECK-LABEL: @exp_f32(
162 ;CHECK: llvm.exp.v4f32
163 ;CHECK: ret void
164 define void @exp_f32(i32 %n, float* noalias %y, float* noalias %x) nounwind uwtable {
165 entry:
166   %cmp6 = icmp sgt i32 %n, 0
167   br i1 %cmp6, label %for.body, label %for.end
169 for.body:                                         ; preds = %entry, %for.body
170   %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
171   %arrayidx = getelementptr inbounds float, float* %y, i64 %indvars.iv
172   %0 = load float, float* %arrayidx, align 4
173   %call = tail call float @llvm.exp.f32(float %0) nounwind readnone
174   %arrayidx2 = getelementptr inbounds float, float* %x, i64 %indvars.iv
175   store float %call, float* %arrayidx2, align 4
176   %indvars.iv.next = add i64 %indvars.iv, 1
177   %lftr.wideiv = trunc i64 %indvars.iv.next to i32
178   %exitcond = icmp eq i32 %lftr.wideiv, %n
179   br i1 %exitcond, label %for.end, label %for.body
181 for.end:                                          ; preds = %for.body, %entry
182   ret void
185 declare float @llvm.exp.f32(float) nounwind readnone
187 ;CHECK-LABEL: @exp_f64(
188 ;CHECK: llvm.exp.v4f64
189 ;CHECK: ret void
190 define void @exp_f64(i32 %n, double* noalias %y, double* noalias %x) nounwind uwtable {
191 entry:
192   %cmp6 = icmp sgt i32 %n, 0
193   br i1 %cmp6, label %for.body, label %for.end
195 for.body:                                         ; preds = %entry, %for.body
196   %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
197   %arrayidx = getelementptr inbounds double, double* %y, i64 %indvars.iv
198   %0 = load double, double* %arrayidx, align 8
199   %call = tail call double @llvm.exp.f64(double %0) nounwind readnone
200   %arrayidx2 = getelementptr inbounds double, double* %x, i64 %indvars.iv
201   store double %call, double* %arrayidx2, align 8
202   %indvars.iv.next = add i64 %indvars.iv, 1
203   %lftr.wideiv = trunc i64 %indvars.iv.next to i32
204   %exitcond = icmp eq i32 %lftr.wideiv, %n
205   br i1 %exitcond, label %for.end, label %for.body
207 for.end:                                          ; preds = %for.body, %entry
208   ret void
211 declare double @llvm.exp.f64(double) nounwind readnone
213 ;CHECK-LABEL: @exp2_f32(
214 ;CHECK: llvm.exp2.v4f32
215 ;CHECK: ret void
216 define void @exp2_f32(i32 %n, float* noalias %y, float* noalias %x) nounwind uwtable {
217 entry:
218   %cmp6 = icmp sgt i32 %n, 0
219   br i1 %cmp6, label %for.body, label %for.end
221 for.body:                                         ; preds = %entry, %for.body
222   %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
223   %arrayidx = getelementptr inbounds float, float* %y, i64 %indvars.iv
224   %0 = load float, float* %arrayidx, align 4
225   %call = tail call float @llvm.exp2.f32(float %0) nounwind readnone
226   %arrayidx2 = getelementptr inbounds float, float* %x, i64 %indvars.iv
227   store float %call, float* %arrayidx2, align 4
228   %indvars.iv.next = add i64 %indvars.iv, 1
229   %lftr.wideiv = trunc i64 %indvars.iv.next to i32
230   %exitcond = icmp eq i32 %lftr.wideiv, %n
231   br i1 %exitcond, label %for.end, label %for.body
233 for.end:                                          ; preds = %for.body, %entry
234   ret void
237 declare float @llvm.exp2.f32(float) nounwind readnone
239 ;CHECK-LABEL: @exp2_f64(
240 ;CHECK: llvm.exp2.v4f64
241 ;CHECK: ret void
242 define void @exp2_f64(i32 %n, double* noalias %y, double* noalias %x) nounwind uwtable {
243 entry:
244   %cmp6 = icmp sgt i32 %n, 0
245   br i1 %cmp6, label %for.body, label %for.end
247 for.body:                                         ; preds = %entry, %for.body
248   %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
249   %arrayidx = getelementptr inbounds double, double* %y, i64 %indvars.iv
250   %0 = load double, double* %arrayidx, align 8
251   %call = tail call double @llvm.exp2.f64(double %0) nounwind readnone
252   %arrayidx2 = getelementptr inbounds double, double* %x, i64 %indvars.iv
253   store double %call, double* %arrayidx2, align 8
254   %indvars.iv.next = add i64 %indvars.iv, 1
255   %lftr.wideiv = trunc i64 %indvars.iv.next to i32
256   %exitcond = icmp eq i32 %lftr.wideiv, %n
257   br i1 %exitcond, label %for.end, label %for.body
259 for.end:                                          ; preds = %for.body, %entry
260   ret void
263 declare double @llvm.exp2.f64(double) nounwind readnone
265 ;CHECK-LABEL: @log_f32(
266 ;CHECK: llvm.log.v4f32
267 ;CHECK: ret void
268 define void @log_f32(i32 %n, float* noalias %y, float* noalias %x) nounwind uwtable {
269 entry:
270   %cmp6 = icmp sgt i32 %n, 0
271   br i1 %cmp6, label %for.body, label %for.end
273 for.body:                                         ; preds = %entry, %for.body
274   %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
275   %arrayidx = getelementptr inbounds float, float* %y, i64 %indvars.iv
276   %0 = load float, float* %arrayidx, align 4
277   %call = tail call float @llvm.log.f32(float %0) nounwind readnone
278   %arrayidx2 = getelementptr inbounds float, float* %x, i64 %indvars.iv
279   store float %call, float* %arrayidx2, align 4
280   %indvars.iv.next = add i64 %indvars.iv, 1
281   %lftr.wideiv = trunc i64 %indvars.iv.next to i32
282   %exitcond = icmp eq i32 %lftr.wideiv, %n
283   br i1 %exitcond, label %for.end, label %for.body
285 for.end:                                          ; preds = %for.body, %entry
286   ret void
289 declare float @llvm.log.f32(float) nounwind readnone
291 ;CHECK-LABEL: @log_f64(
292 ;CHECK: llvm.log.v4f64
293 ;CHECK: ret void
294 define void @log_f64(i32 %n, double* noalias %y, double* noalias %x) nounwind uwtable {
295 entry:
296   %cmp6 = icmp sgt i32 %n, 0
297   br i1 %cmp6, label %for.body, label %for.end
299 for.body:                                         ; preds = %entry, %for.body
300   %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
301   %arrayidx = getelementptr inbounds double, double* %y, i64 %indvars.iv
302   %0 = load double, double* %arrayidx, align 8
303   %call = tail call double @llvm.log.f64(double %0) nounwind readnone
304   %arrayidx2 = getelementptr inbounds double, double* %x, i64 %indvars.iv
305   store double %call, double* %arrayidx2, align 8
306   %indvars.iv.next = add i64 %indvars.iv, 1
307   %lftr.wideiv = trunc i64 %indvars.iv.next to i32
308   %exitcond = icmp eq i32 %lftr.wideiv, %n
309   br i1 %exitcond, label %for.end, label %for.body
311 for.end:                                          ; preds = %for.body, %entry
312   ret void
315 declare double @llvm.log.f64(double) nounwind readnone
317 ;CHECK-LABEL: @log10_f32(
318 ;CHECK: llvm.log10.v4f32
319 ;CHECK: ret void
320 define void @log10_f32(i32 %n, float* noalias %y, float* noalias %x) nounwind uwtable {
321 entry:
322   %cmp6 = icmp sgt i32 %n, 0
323   br i1 %cmp6, label %for.body, label %for.end
325 for.body:                                         ; preds = %entry, %for.body
326   %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
327   %arrayidx = getelementptr inbounds float, float* %y, i64 %indvars.iv
328   %0 = load float, float* %arrayidx, align 4
329   %call = tail call float @llvm.log10.f32(float %0) nounwind readnone
330   %arrayidx2 = getelementptr inbounds float, float* %x, i64 %indvars.iv
331   store float %call, float* %arrayidx2, align 4
332   %indvars.iv.next = add i64 %indvars.iv, 1
333   %lftr.wideiv = trunc i64 %indvars.iv.next to i32
334   %exitcond = icmp eq i32 %lftr.wideiv, %n
335   br i1 %exitcond, label %for.end, label %for.body
337 for.end:                                          ; preds = %for.body, %entry
338   ret void
341 declare float @llvm.log10.f32(float) nounwind readnone
343 ;CHECK-LABEL: @log10_f64(
344 ;CHECK: llvm.log10.v4f64
345 ;CHECK: ret void
346 define void @log10_f64(i32 %n, double* noalias %y, double* noalias %x) nounwind uwtable {
347 entry:
348   %cmp6 = icmp sgt i32 %n, 0
349   br i1 %cmp6, label %for.body, label %for.end
351 for.body:                                         ; preds = %entry, %for.body
352   %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
353   %arrayidx = getelementptr inbounds double, double* %y, i64 %indvars.iv
354   %0 = load double, double* %arrayidx, align 8
355   %call = tail call double @llvm.log10.f64(double %0) nounwind readnone
356   %arrayidx2 = getelementptr inbounds double, double* %x, i64 %indvars.iv
357   store double %call, double* %arrayidx2, align 8
358   %indvars.iv.next = add i64 %indvars.iv, 1
359   %lftr.wideiv = trunc i64 %indvars.iv.next to i32
360   %exitcond = icmp eq i32 %lftr.wideiv, %n
361   br i1 %exitcond, label %for.end, label %for.body
363 for.end:                                          ; preds = %for.body, %entry
364   ret void
367 declare double @llvm.log10.f64(double) nounwind readnone
369 ;CHECK-LABEL: @log2_f32(
370 ;CHECK: llvm.log2.v4f32
371 ;CHECK: ret void
372 define void @log2_f32(i32 %n, float* noalias %y, float* noalias %x) nounwind uwtable {
373 entry:
374   %cmp6 = icmp sgt i32 %n, 0
375   br i1 %cmp6, label %for.body, label %for.end
377 for.body:                                         ; preds = %entry, %for.body
378   %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
379   %arrayidx = getelementptr inbounds float, float* %y, i64 %indvars.iv
380   %0 = load float, float* %arrayidx, align 4
381   %call = tail call float @llvm.log2.f32(float %0) nounwind readnone
382   %arrayidx2 = getelementptr inbounds float, float* %x, i64 %indvars.iv
383   store float %call, float* %arrayidx2, align 4
384   %indvars.iv.next = add i64 %indvars.iv, 1
385   %lftr.wideiv = trunc i64 %indvars.iv.next to i32
386   %exitcond = icmp eq i32 %lftr.wideiv, %n
387   br i1 %exitcond, label %for.end, label %for.body
389 for.end:                                          ; preds = %for.body, %entry
390   ret void
393 declare float @llvm.log2.f32(float) nounwind readnone
395 ;CHECK-LABEL: @log2_f64(
396 ;CHECK: llvm.log2.v4f64
397 ;CHECK: ret void
398 define void @log2_f64(i32 %n, double* noalias %y, double* noalias %x) nounwind uwtable {
399 entry:
400   %cmp6 = icmp sgt i32 %n, 0
401   br i1 %cmp6, label %for.body, label %for.end
403 for.body:                                         ; preds = %entry, %for.body
404   %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
405   %arrayidx = getelementptr inbounds double, double* %y, i64 %indvars.iv
406   %0 = load double, double* %arrayidx, align 8
407   %call = tail call double @llvm.log2.f64(double %0) nounwind readnone
408   %arrayidx2 = getelementptr inbounds double, double* %x, i64 %indvars.iv
409   store double %call, double* %arrayidx2, align 8
410   %indvars.iv.next = add i64 %indvars.iv, 1
411   %lftr.wideiv = trunc i64 %indvars.iv.next to i32
412   %exitcond = icmp eq i32 %lftr.wideiv, %n
413   br i1 %exitcond, label %for.end, label %for.body
415 for.end:                                          ; preds = %for.body, %entry
416   ret void
419 declare double @llvm.log2.f64(double) nounwind readnone
421 ;CHECK-LABEL: @fabs_f32(
422 ;CHECK: llvm.fabs.v4f32
423 ;CHECK: ret void
424 define void @fabs_f32(i32 %n, float* noalias %y, float* noalias %x) nounwind uwtable {
425 entry:
426   %cmp6 = icmp sgt i32 %n, 0
427   br i1 %cmp6, label %for.body, label %for.end
429 for.body:                                         ; preds = %entry, %for.body
430   %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
431   %arrayidx = getelementptr inbounds float, float* %y, i64 %indvars.iv
432   %0 = load float, float* %arrayidx, align 4
433   %call = tail call float @llvm.fabs.f32(float %0) nounwind readnone
434   %arrayidx2 = getelementptr inbounds float, float* %x, i64 %indvars.iv
435   store float %call, float* %arrayidx2, align 4
436   %indvars.iv.next = add i64 %indvars.iv, 1
437   %lftr.wideiv = trunc i64 %indvars.iv.next to i32
438   %exitcond = icmp eq i32 %lftr.wideiv, %n
439   br i1 %exitcond, label %for.end, label %for.body
441 for.end:                                          ; preds = %for.body, %entry
442   ret void
445 declare float @llvm.fabs.f32(float) nounwind readnone
447 define void @fabs_f64(i32 %n, double* noalias %y, double* noalias %x) nounwind uwtable {
448 entry:
449   %cmp6 = icmp sgt i32 %n, 0
450   br i1 %cmp6, label %for.body, label %for.end
452 for.body:                                         ; preds = %entry, %for.body
453   %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
454   %arrayidx = getelementptr inbounds double, double* %y, i64 %indvars.iv
455   %0 = load double, double* %arrayidx, align 8
456   %call = tail call double @llvm.fabs(double %0) nounwind readnone
457   %arrayidx2 = getelementptr inbounds double, double* %x, i64 %indvars.iv
458   store double %call, double* %arrayidx2, align 8
459   %indvars.iv.next = add i64 %indvars.iv, 1
460   %lftr.wideiv = trunc i64 %indvars.iv.next to i32
461   %exitcond = icmp eq i32 %lftr.wideiv, %n
462   br i1 %exitcond, label %for.end, label %for.body
464 for.end:                                          ; preds = %for.body, %entry
465   ret void
468 declare double @llvm.fabs(double) nounwind readnone
470 ;CHECK-LABEL: @copysign_f32(
471 ;CHECK: llvm.copysign.v4f32
472 ;CHECK: ret void
473 define void @copysign_f32(i32 %n, float* noalias %y, float* noalias %x, float* noalias %z) nounwind uwtable {
474 entry:
475   %cmp6 = icmp sgt i32 %n, 0
476   br i1 %cmp6, label %for.body, label %for.end
478 for.body:                                         ; preds = %entry, %for.body
479   %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
480   %arrayidx = getelementptr inbounds float, float* %y, i64 %indvars.iv
481   %0 = load float, float* %arrayidx, align 4
482   %arrayidx1 = getelementptr inbounds float, float* %z, i64 %indvars.iv
483   %1 = load float, float* %arrayidx1, align 4
484   %call = tail call float @llvm.copysign.f32(float %0, float %1) nounwind readnone
485   %arrayidx2 = getelementptr inbounds float, float* %x, i64 %indvars.iv
486   store float %call, float* %arrayidx2, align 4
487   %indvars.iv.next = add i64 %indvars.iv, 1
488   %lftr.wideiv = trunc i64 %indvars.iv.next to i32
489   %exitcond = icmp eq i32 %lftr.wideiv, %n
490   br i1 %exitcond, label %for.end, label %for.body
492 for.end:                                          ; preds = %for.body, %entry
493   ret void
496 declare float @llvm.copysign.f32(float, float) nounwind readnone
498 define void @copysign_f64(i32 %n, double* noalias %y, double* noalias %x, double* noalias %z) nounwind uwtable {
499 entry:
500   %cmp6 = icmp sgt i32 %n, 0
501   br i1 %cmp6, label %for.body, label %for.end
503 for.body:                                         ; preds = %entry, %for.body
504   %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
505   %arrayidx = getelementptr inbounds double, double* %y, i64 %indvars.iv
506   %0 = load double, double* %arrayidx, align 8
507   %arrayidx1 = getelementptr inbounds double, double* %z, i64 %indvars.iv
508   %1 = load double, double* %arrayidx, align 8
509   %call = tail call double @llvm.copysign(double %0, double %1) nounwind readnone
510   %arrayidx2 = getelementptr inbounds double, double* %x, i64 %indvars.iv
511   store double %call, double* %arrayidx2, align 8
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
518   ret void
521 declare double @llvm.copysign(double, double) nounwind readnone
523 ;CHECK-LABEL: @floor_f32(
524 ;CHECK: llvm.floor.v4f32
525 ;CHECK: ret void
526 define void @floor_f32(i32 %n, float* noalias %y, float* noalias %x) nounwind uwtable {
527 entry:
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, float* %y, i64 %indvars.iv
534   %0 = load float, float* %arrayidx, align 4
535   %call = tail call float @llvm.floor.f32(float %0) nounwind readnone
536   %arrayidx2 = getelementptr inbounds float, float* %x, i64 %indvars.iv
537   store float %call, float* %arrayidx2, align 4
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
544   ret void
547 declare float @llvm.floor.f32(float) nounwind readnone
549 ;CHECK-LABEL: @floor_f64(
550 ;CHECK: llvm.floor.v4f64
551 ;CHECK: ret void
552 define void @floor_f64(i32 %n, double* noalias %y, double* noalias %x) nounwind uwtable {
553 entry:
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, double* %y, i64 %indvars.iv
560   %0 = load double, double* %arrayidx, align 8
561   %call = tail call double @llvm.floor.f64(double %0) nounwind readnone
562   %arrayidx2 = getelementptr inbounds double, double* %x, i64 %indvars.iv
563   store double %call, double* %arrayidx2, align 8
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
570   ret void
573 declare double @llvm.floor.f64(double) nounwind readnone
575 ;CHECK-LABEL: @ceil_f32(
576 ;CHECK: llvm.ceil.v4f32
577 ;CHECK: ret void
578 define void @ceil_f32(i32 %n, float* noalias %y, float* noalias %x) nounwind uwtable {
579 entry:
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, float* %y, i64 %indvars.iv
586   %0 = load float, float* %arrayidx, align 4
587   %call = tail call float @llvm.ceil.f32(float %0) nounwind readnone
588   %arrayidx2 = getelementptr inbounds float, float* %x, i64 %indvars.iv
589   store float %call, float* %arrayidx2, align 4
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 float @llvm.ceil.f32(float) nounwind readnone
601 ;CHECK-LABEL: @ceil_f64(
602 ;CHECK: llvm.ceil.v4f64
603 ;CHECK: ret void
604 define void @ceil_f64(i32 %n, double* noalias %y, double* noalias %x) nounwind uwtable {
605 entry:
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, double* %y, i64 %indvars.iv
612   %0 = load double, double* %arrayidx, align 8
613   %call = tail call double @llvm.ceil.f64(double %0) nounwind readnone
614   %arrayidx2 = getelementptr inbounds double, double* %x, i64 %indvars.iv
615   store double %call, double* %arrayidx2, align 8
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
622   ret void
625 declare double @llvm.ceil.f64(double) nounwind readnone
627 ;CHECK-LABEL: @trunc_f32(
628 ;CHECK: llvm.trunc.v4f32
629 ;CHECK: ret void
630 define void @trunc_f32(i32 %n, float* noalias %y, float* noalias %x) nounwind uwtable {
631 entry:
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, float* %y, i64 %indvars.iv
638   %0 = load float, float* %arrayidx, align 4
639   %call = tail call float @llvm.trunc.f32(float %0) nounwind readnone
640   %arrayidx2 = getelementptr inbounds float, float* %x, i64 %indvars.iv
641   store float %call, float* %arrayidx2, align 4
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
648   ret void
651 declare float @llvm.trunc.f32(float) nounwind readnone
653 ;CHECK-LABEL: @trunc_f64(
654 ;CHECK: llvm.trunc.v4f64
655 ;CHECK: ret void
656 define void @trunc_f64(i32 %n, double* noalias %y, double* noalias %x) nounwind uwtable {
657 entry:
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, double* %y, i64 %indvars.iv
664   %0 = load double, double* %arrayidx, align 8
665   %call = tail call double @llvm.trunc.f64(double %0) nounwind readnone
666   %arrayidx2 = getelementptr inbounds double, double* %x, i64 %indvars.iv
667   store double %call, double* %arrayidx2, align 8
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
674   ret void
677 declare double @llvm.trunc.f64(double) nounwind readnone
679 ;CHECK-LABEL: @rint_f32(
680 ;CHECK: llvm.rint.v4f32
681 ;CHECK: ret void
682 define void @rint_f32(i32 %n, float* noalias %y, float* noalias %x) nounwind uwtable {
683 entry:
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, float* %y, i64 %indvars.iv
690   %0 = load float, float* %arrayidx, align 4
691   %call = tail call float @llvm.rint.f32(float %0) nounwind readnone
692   %arrayidx2 = getelementptr inbounds float, float* %x, i64 %indvars.iv
693   store float %call, float* %arrayidx2, align 4
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
700   ret void
703 declare float @llvm.rint.f32(float) nounwind readnone
705 ;CHECK-LABEL: @rint_f64(
706 ;CHECK: llvm.rint.v4f64
707 ;CHECK: ret void
708 define void @rint_f64(i32 %n, double* noalias %y, double* noalias %x) nounwind uwtable {
709 entry:
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, double* %y, i64 %indvars.iv
716   %0 = load double, double* %arrayidx, align 8
717   %call = tail call double @llvm.rint.f64(double %0) nounwind readnone
718   %arrayidx2 = getelementptr inbounds double, double* %x, i64 %indvars.iv
719   store double %call, double* %arrayidx2, align 8
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
726   ret void
729 declare double @llvm.rint.f64(double) nounwind readnone
731 ;CHECK-LABEL: @nearbyint_f32(
732 ;CHECK: llvm.nearbyint.v4f32
733 ;CHECK: ret void
734 define void @nearbyint_f32(i32 %n, float* noalias %y, float* noalias %x) nounwind uwtable {
735 entry:
736   %cmp6 = icmp sgt i32 %n, 0
737   br i1 %cmp6, 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, float* %y, i64 %indvars.iv
742   %0 = load float, float* %arrayidx, align 4
743   %call = tail call float @llvm.nearbyint.f32(float %0) nounwind readnone
744   %arrayidx2 = getelementptr inbounds float, float* %x, i64 %indvars.iv
745   store float %call, float* %arrayidx2, align 4
746   %indvars.iv.next = add i64 %indvars.iv, 1
747   %lftr.wideiv = trunc i64 %indvars.iv.next to i32
748   %exitcond = icmp eq i32 %lftr.wideiv, %n
749   br i1 %exitcond, label %for.end, label %for.body
751 for.end:                                          ; preds = %for.body, %entry
752   ret void
755 declare float @llvm.nearbyint.f32(float) nounwind readnone
757 ;CHECK-LABEL: @nearbyint_f64(
758 ;CHECK: llvm.nearbyint.v4f64
759 ;CHECK: ret void
760 define void @nearbyint_f64(i32 %n, double* noalias %y, double* noalias %x) nounwind uwtable {
761 entry:
762   %cmp6 = icmp sgt i32 %n, 0
763   br i1 %cmp6, label %for.body, label %for.end
765 for.body:                                         ; preds = %entry, %for.body
766   %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
767   %arrayidx = getelementptr inbounds double, double* %y, i64 %indvars.iv
768   %0 = load double, double* %arrayidx, align 8
769   %call = tail call double @llvm.nearbyint.f64(double %0) nounwind readnone
770   %arrayidx2 = getelementptr inbounds double, double* %x, i64 %indvars.iv
771   store double %call, double* %arrayidx2, align 8
772   %indvars.iv.next = add i64 %indvars.iv, 1
773   %lftr.wideiv = trunc i64 %indvars.iv.next to i32
774   %exitcond = icmp eq i32 %lftr.wideiv, %n
775   br i1 %exitcond, label %for.end, label %for.body
777 for.end:                                          ; preds = %for.body, %entry
778   ret void
781 declare double @llvm.nearbyint.f64(double) nounwind readnone
783 ;CHECK-LABEL: @round_f32(
784 ;CHECK: llvm.round.v4f32
785 ;CHECK: ret void
786 define void @round_f32(i32 %n, float* noalias %y, float* noalias %x) nounwind uwtable {
787 entry:
788   %cmp6 = icmp sgt i32 %n, 0
789   br i1 %cmp6, label %for.body, label %for.end
791 for.body:                                         ; preds = %entry, %for.body
792   %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
793   %arrayidx = getelementptr inbounds float, float* %y, i64 %indvars.iv
794   %0 = load float, float* %arrayidx, align 4
795   %call = tail call float @llvm.round.f32(float %0) nounwind readnone
796   %arrayidx2 = getelementptr inbounds float, float* %x, i64 %indvars.iv
797   store float %call, float* %arrayidx2, align 4
798   %indvars.iv.next = add i64 %indvars.iv, 1
799   %lftr.wideiv = trunc i64 %indvars.iv.next to i32
800   %exitcond = icmp eq i32 %lftr.wideiv, %n
801   br i1 %exitcond, label %for.end, label %for.body
803 for.end:                                          ; preds = %for.body, %entry
804   ret void
807 declare float @llvm.round.f32(float) nounwind readnone
809 ;CHECK-LABEL: @round_f64(
810 ;CHECK: llvm.round.v4f64
811 ;CHECK: ret void
812 define void @round_f64(i32 %n, double* noalias %y, double* noalias %x) nounwind uwtable {
813 entry:
814   %cmp6 = icmp sgt i32 %n, 0
815   br i1 %cmp6, label %for.body, label %for.end
817 for.body:                                         ; preds = %entry, %for.body
818   %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
819   %arrayidx = getelementptr inbounds double, double* %y, i64 %indvars.iv
820   %0 = load double, double* %arrayidx, align 8
821   %call = tail call double @llvm.round.f64(double %0) nounwind readnone
822   %arrayidx2 = getelementptr inbounds double, double* %x, i64 %indvars.iv
823   store double %call, double* %arrayidx2, align 8
824   %indvars.iv.next = add i64 %indvars.iv, 1
825   %lftr.wideiv = trunc i64 %indvars.iv.next to i32
826   %exitcond = icmp eq i32 %lftr.wideiv, %n
827   br i1 %exitcond, label %for.end, label %for.body
829 for.end:                                          ; preds = %for.body, %entry
830   ret void
833 declare double @llvm.round.f64(double) nounwind readnone
835 ;CHECK-LABEL: @roundeven_f32(
836 ;CHECK: llvm.roundeven.v4f32
837 ;CHECK: ret void
838 define void @roundeven_f32(i32 %n, float* noalias %y, float* noalias %x) nounwind uwtable {
839 entry:
840   %cmp6 = icmp sgt i32 %n, 0
841   br i1 %cmp6, label %for.body, label %for.end
843 for.body:                                         ; preds = %entry, %for.body
844   %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
845   %arrayidx = getelementptr inbounds float, float* %y, i64 %indvars.iv
846   %0 = load float, float* %arrayidx, align 4
847   %call = tail call float @llvm.roundeven.f32(float %0) nounwind readnone
848   %arrayidx2 = getelementptr inbounds float, float* %x, i64 %indvars.iv
849   store float %call, float* %arrayidx2, align 4
850   %indvars.iv.next = add i64 %indvars.iv, 1
851   %lftr.wideiv = trunc i64 %indvars.iv.next to i32
852   %exitcond = icmp eq i32 %lftr.wideiv, %n
853   br i1 %exitcond, label %for.end, label %for.body
855 for.end:                                          ; preds = %for.body, %entry
856   ret void
859 declare float @llvm.roundeven.f32(float) nounwind readnone
861 ;CHECK-LABEL: @roundeven_f64(
862 ;CHECK: llvm.roundeven.v4f64
863 ;CHECK: ret void
864 define void @roundeven_f64(i32 %n, double* noalias %y, double* noalias %x) nounwind uwtable {
865 entry:
866   %cmp6 = icmp sgt i32 %n, 0
867   br i1 %cmp6, label %for.body, label %for.end
869 for.body:                                         ; preds = %entry, %for.body
870   %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
871   %arrayidx = getelementptr inbounds double, double* %y, i64 %indvars.iv
872   %0 = load double, double* %arrayidx, align 8
873   %call = tail call double @llvm.roundeven.f64(double %0) nounwind readnone
874   %arrayidx2 = getelementptr inbounds double, double* %x, i64 %indvars.iv
875   store double %call, double* %arrayidx2, align 8
876   %indvars.iv.next = add i64 %indvars.iv, 1
877   %lftr.wideiv = trunc i64 %indvars.iv.next to i32
878   %exitcond = icmp eq i32 %lftr.wideiv, %n
879   br i1 %exitcond, label %for.end, label %for.body
881 for.end:                                          ; preds = %for.body, %entry
882   ret void
885 declare double @llvm.roundeven.f64(double) nounwind readnone
887 ;CHECK-LABEL: @fma_f32(
888 ;CHECK: llvm.fma.v4f32
889 ;CHECK: ret void
890 define void @fma_f32(i32 %n, float* noalias %y, float* noalias %x, float* noalias %z, float* noalias %w) nounwind uwtable {
891 entry:
892   %cmp12 = icmp sgt i32 %n, 0
893   br i1 %cmp12, label %for.body, label %for.end
895 for.body:                                         ; preds = %entry, %for.body
896   %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
897   %arrayidx = getelementptr inbounds float, float* %y, i64 %indvars.iv
898   %0 = load float, float* %arrayidx, align 4
899   %arrayidx2 = getelementptr inbounds float, float* %w, i64 %indvars.iv
900   %1 = load float, float* %arrayidx2, align 4
901   %arrayidx4 = getelementptr inbounds float, float* %z, i64 %indvars.iv
902   %2 = load float, float* %arrayidx4, align 4
903   %3 = tail call float @llvm.fma.f32(float %0, float %2, float %1)
904   %arrayidx6 = getelementptr inbounds float, float* %x, i64 %indvars.iv
905   store float %3, float* %arrayidx6, align 4
906   %indvars.iv.next = add i64 %indvars.iv, 1
907   %lftr.wideiv = trunc i64 %indvars.iv.next to i32
908   %exitcond = icmp eq i32 %lftr.wideiv, %n
909   br i1 %exitcond, label %for.end, label %for.body
911 for.end:                                          ; preds = %for.body, %entry
912   ret void
915 declare float @llvm.fma.f32(float, float, float) nounwind readnone
917 ;CHECK-LABEL: @fma_f64(
918 ;CHECK: llvm.fma.v4f64
919 ;CHECK: ret void
920 define void @fma_f64(i32 %n, double* noalias %y, double* noalias %x, double* noalias %z, double* noalias %w) nounwind uwtable {
921 entry:
922   %cmp12 = icmp sgt i32 %n, 0
923   br i1 %cmp12, label %for.body, label %for.end
925 for.body:                                         ; preds = %entry, %for.body
926   %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
927   %arrayidx = getelementptr inbounds double, double* %y, i64 %indvars.iv
928   %0 = load double, double* %arrayidx, align 8
929   %arrayidx2 = getelementptr inbounds double, double* %w, i64 %indvars.iv
930   %1 = load double, double* %arrayidx2, align 8
931   %arrayidx4 = getelementptr inbounds double, double* %z, i64 %indvars.iv
932   %2 = load double, double* %arrayidx4, align 8
933   %3 = tail call double @llvm.fma.f64(double %0, double %2, double %1)
934   %arrayidx6 = getelementptr inbounds double, double* %x, i64 %indvars.iv
935   store double %3, double* %arrayidx6, align 8
936   %indvars.iv.next = add i64 %indvars.iv, 1
937   %lftr.wideiv = trunc i64 %indvars.iv.next to i32
938   %exitcond = icmp eq i32 %lftr.wideiv, %n
939   br i1 %exitcond, label %for.end, label %for.body
941 for.end:                                          ; preds = %for.body, %entry
942   ret void
945 declare double @llvm.fma.f64(double, double, double) nounwind readnone
947 ;CHECK-LABEL: @fmuladd_f32(
948 ;CHECK: llvm.fmuladd.v4f32
949 ;CHECK: ret void
950 define void @fmuladd_f32(i32 %n, float* noalias %y, float* noalias %x, float* noalias %z, float* noalias %w) nounwind uwtable {
951 entry:
952   %cmp12 = icmp sgt i32 %n, 0
953   br i1 %cmp12, label %for.body, label %for.end
955 for.body:                                         ; preds = %entry, %for.body
956   %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
957   %arrayidx = getelementptr inbounds float, float* %y, i64 %indvars.iv
958   %0 = load float, float* %arrayidx, align 4
959   %arrayidx2 = getelementptr inbounds float, float* %w, i64 %indvars.iv
960   %1 = load float, float* %arrayidx2, align 4
961   %arrayidx4 = getelementptr inbounds float, float* %z, i64 %indvars.iv
962   %2 = load float, float* %arrayidx4, align 4
963   %3 = tail call float @llvm.fmuladd.f32(float %0, float %2, float %1)
964   %arrayidx6 = getelementptr inbounds float, float* %x, i64 %indvars.iv
965   store float %3, float* %arrayidx6, align 4
966   %indvars.iv.next = add i64 %indvars.iv, 1
967   %lftr.wideiv = trunc i64 %indvars.iv.next to i32
968   %exitcond = icmp eq i32 %lftr.wideiv, %n
969   br i1 %exitcond, label %for.end, label %for.body
971 for.end:                                          ; preds = %for.body, %entry
972   ret void
975 declare float @llvm.fmuladd.f32(float, float, float) nounwind readnone
977 ;CHECK-LABEL: @fmuladd_f64(
978 ;CHECK: llvm.fmuladd.v4f64
979 ;CHECK: ret void
980 define void @fmuladd_f64(i32 %n, double* noalias %y, double* noalias %x, double* noalias %z, double* noalias %w) nounwind uwtable {
981 entry:
982   %cmp12 = icmp sgt i32 %n, 0
983   br i1 %cmp12, label %for.body, label %for.end
985 for.body:                                         ; preds = %entry, %for.body
986   %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
987   %arrayidx = getelementptr inbounds double, double* %y, i64 %indvars.iv
988   %0 = load double, double* %arrayidx, align 8
989   %arrayidx2 = getelementptr inbounds double, double* %w, i64 %indvars.iv
990   %1 = load double, double* %arrayidx2, align 8
991   %arrayidx4 = getelementptr inbounds double, double* %z, i64 %indvars.iv
992   %2 = load double, double* %arrayidx4, align 8
993   %3 = tail call double @llvm.fmuladd.f64(double %0, double %2, double %1)
994   %arrayidx6 = getelementptr inbounds double, double* %x, i64 %indvars.iv
995   store double %3, double* %arrayidx6, align 8
996   %indvars.iv.next = add i64 %indvars.iv, 1
997   %lftr.wideiv = trunc i64 %indvars.iv.next to i32
998   %exitcond = icmp eq i32 %lftr.wideiv, %n
999   br i1 %exitcond, label %for.end, label %for.body
1001 for.end:                                          ; preds = %for.body, %entry
1002   ret void
1005 declare double @llvm.fmuladd.f64(double, double, double) nounwind readnone
1007 ;CHECK-LABEL: @pow_f32(
1008 ;CHECK: llvm.pow.v4f32
1009 ;CHECK: ret void
1010 define void @pow_f32(i32 %n, float* noalias %y, float* noalias %x, float* noalias %z) nounwind uwtable {
1011 entry:
1012   %cmp9 = icmp sgt i32 %n, 0
1013   br i1 %cmp9, label %for.body, label %for.end
1015 for.body:                                         ; preds = %entry, %for.body
1016   %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
1017   %arrayidx = getelementptr inbounds float, float* %y, i64 %indvars.iv
1018   %0 = load float, float* %arrayidx, align 4
1019   %arrayidx2 = getelementptr inbounds float, float* %z, i64 %indvars.iv
1020   %1 = load float, float* %arrayidx2, align 4
1021   %call = tail call float @llvm.pow.f32(float %0, float %1) nounwind readnone
1022   %arrayidx4 = getelementptr inbounds float, float* %x, i64 %indvars.iv
1023   store float %call, float* %arrayidx4, align 4
1024   %indvars.iv.next = add i64 %indvars.iv, 1
1025   %lftr.wideiv = trunc i64 %indvars.iv.next to i32
1026   %exitcond = icmp eq i32 %lftr.wideiv, %n
1027   br i1 %exitcond, label %for.end, label %for.body
1029 for.end:                                          ; preds = %for.body, %entry
1030   ret void
1033 declare float @llvm.pow.f32(float, float) nounwind readnone
1035 ;CHECK-LABEL: @pow_f64(
1036 ;CHECK: llvm.pow.v4f64
1037 ;CHECK: ret void
1038 define void @pow_f64(i32 %n, double* noalias %y, double* noalias %x, double* noalias %z) nounwind uwtable {
1039 entry:
1040   %cmp9 = icmp sgt i32 %n, 0
1041   br i1 %cmp9, label %for.body, label %for.end
1043 for.body:                                         ; preds = %entry, %for.body
1044   %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
1045   %arrayidx = getelementptr inbounds double, double* %y, i64 %indvars.iv
1046   %0 = load double, double* %arrayidx, align 8
1047   %arrayidx2 = getelementptr inbounds double, double* %z, i64 %indvars.iv
1048   %1 = load double, double* %arrayidx2, align 8
1049   %call = tail call double @llvm.pow.f64(double %0, double %1) nounwind readnone
1050   %arrayidx4 = getelementptr inbounds double, double* %x, i64 %indvars.iv
1051   store double %call, double* %arrayidx4, align 8
1052   %indvars.iv.next = add i64 %indvars.iv, 1
1053   %lftr.wideiv = trunc i64 %indvars.iv.next to i32
1054   %exitcond = icmp eq i32 %lftr.wideiv, %n
1055   br i1 %exitcond, label %for.end, label %for.body
1057 for.end:                                          ; preds = %for.body, %entry
1058   ret void
1061 ; CHECK: fabs_libm
1062 ; CHECK:  call <4 x float> @llvm.fabs.v4f32
1063 ; CHECK: ret void
1064 define void @fabs_libm(float* nocapture %x) nounwind {
1065 entry:
1066   br label %for.body
1068 for.body:                                         ; preds = %entry, %for.body
1069   %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.body ]
1070   %arrayidx = getelementptr inbounds float, float* %x, i64 %indvars.iv
1071   %0 = load float, float* %arrayidx, align 4
1072   %call = tail call float @fabsf(float %0) nounwind readnone
1073   store float %call, float* %arrayidx, align 4
1074   %indvars.iv.next = add i64 %indvars.iv, 1
1075   %lftr.wideiv = trunc i64 %indvars.iv.next to i32
1076   %exitcond = icmp eq i32 %lftr.wideiv, 1024
1077   br i1 %exitcond, label %for.end, label %for.body
1079 for.end:                                          ; preds = %for.body
1080   ret void
1083 declare float @fabsf(float) nounwind readnone
1085 declare double @llvm.pow.f64(double, double) nounwind readnone
1089 ; Make sure we don't replace calls to functions with standard library function
1090 ; signatures but defined with internal linkage.
1092 define internal float @roundf(float %x) nounwind readnone {
1093   ret float 0.00000000
1095 ; CHECK-LABEL: internal_round
1096 ; CHECK-NOT:  load <4 x float>
1098 define void @internal_round(float* nocapture %x) nounwind {
1099 entry:
1100   br label %for.body
1102 for.body:                                         ; preds = %entry, %for.body
1103   %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.body ]
1104   %arrayidx = getelementptr inbounds float, float* %x, i64 %indvars.iv
1105   %0 = load float, float* %arrayidx, align 4
1106   %call = tail call float @roundf(float %0) nounwind readnone
1107   store float %call, float* %arrayidx, align 4
1108   %indvars.iv.next = add i64 %indvars.iv, 1
1109   %lftr.wideiv = trunc i64 %indvars.iv.next to i32
1110   %exitcond = icmp eq i32 %lftr.wideiv, 1024
1111   br i1 %exitcond, label %for.end, label %for.body
1113 for.end:                                          ; preds = %for.body
1114   ret void
1117 ; Make sure we don't replace calls to functions with standard library names but
1118 ; different signatures.
1120 declare void @round(double %f)
1122 ; CHECK-LABEL: wrong_signature
1123 ; CHECK-NOT:  load <4 x double>
1125 define void @wrong_signature(double* nocapture %x) nounwind {
1126 entry:
1127   br label %for.body
1129 for.body:                                         ; preds = %entry, %for.body
1130   %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.body ]
1131   %arrayidx = getelementptr inbounds double, double* %x, i64 %indvars.iv
1132   %0 = load double, double* %arrayidx, align 4
1133   store double %0, double* %arrayidx, align 4
1134   tail call void @round(double %0) nounwind readnone
1135   %indvars.iv.next = add i64 %indvars.iv, 1
1136   %lftr.wideiv = trunc i64 %indvars.iv.next to i32
1137   %exitcond = icmp eq i32 %lftr.wideiv, 1024
1138   br i1 %exitcond, label %for.end, label %for.body
1140 for.end:                                          ; preds = %for.body
1141   ret void
1144 declare double @llvm.powi.f64.i32(double %Val, i32 %power) nounwind readnone
1146 ;CHECK-LABEL: @powi_f64(
1147 ;CHECK: llvm.powi.v4f64
1148 ;CHECK: ret void
1149 define void @powi_f64(i32 %n, double* noalias %y, double* noalias %x, i32 %P) nounwind uwtable {
1150 entry:
1151   %cmp9 = icmp sgt i32 %n, 0
1152   br i1 %cmp9, label %for.body, label %for.end
1154 for.body:                                         ; preds = %entry, %for.body
1155   %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
1156   %arrayidx = getelementptr inbounds double, double* %y, i64 %indvars.iv
1157   %0 = load double, double* %arrayidx, align 8
1158   %call = tail call double @llvm.powi.f64.i32(double %0, i32  %P) nounwind readnone
1159   %arrayidx4 = getelementptr inbounds double, double* %x, i64 %indvars.iv
1160   store double %call, double* %arrayidx4, align 8
1161   %indvars.iv.next = add i64 %indvars.iv, 1
1162   %lftr.wideiv = trunc i64 %indvars.iv.next to i32
1163   %exitcond = icmp eq i32 %lftr.wideiv, %n
1164   br i1 %exitcond, label %for.end, label %for.body
1166 for.end:                                          ; preds = %for.body, %entry
1167   ret void
1170 ;CHECK-LABEL: @powi_f64_neg(
1171 ;CHECK-NOT: llvm.powi.v4f64
1172 ;CHECK: ret void
1173 define void @powi_f64_neg(i32 %n, double* noalias %y, double* noalias %x) nounwind uwtable {
1174 entry:
1175   %cmp9 = icmp sgt i32 %n, 0
1176   br i1 %cmp9, label %for.body, label %for.end
1178 for.body:                                         ; preds = %entry, %for.body
1179   %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
1180   %arrayidx = getelementptr inbounds double, double* %y, i64 %indvars.iv
1181   %0 = load double, double* %arrayidx, align 8
1182   %1 = trunc i64 %indvars.iv to i32
1183   %call = tail call double @llvm.powi.f64.i32(double %0, i32  %1) nounwind readnone
1184   %arrayidx4 = getelementptr inbounds double, double* %x, i64 %indvars.iv
1185   store double %call, double* %arrayidx4, align 8
1186   %indvars.iv.next = add i64 %indvars.iv, 1
1187   %lftr.wideiv = trunc i64 %indvars.iv.next to i32
1188   %exitcond = icmp eq i32 %lftr.wideiv, %n
1189   br i1 %exitcond, label %for.end, label %for.body
1191 for.end:                                          ; preds = %for.body, %entry
1192   ret void
1195 declare i64  @llvm.cttz.i64 (i64, i1) nounwind readnone
1197 ;CHECK-LABEL: @cttz_f64(
1198 ;CHECK: llvm.cttz.v4i64
1199 ;CHECK: ret void
1200 define void @cttz_f64(i32 %n, i64* noalias %y, i64* noalias %x) nounwind uwtable {
1201 entry:
1202   %cmp9 = icmp sgt i32 %n, 0
1203   br i1 %cmp9, label %for.body, label %for.end
1205 for.body:                                         ; preds = %entry, %for.body
1206   %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
1207   %arrayidx = getelementptr inbounds i64, i64* %y, i64 %indvars.iv
1208   %0 = load i64, i64* %arrayidx, align 8
1209   %call = tail call i64 @llvm.cttz.i64(i64 %0, i1 true) nounwind readnone
1210   %arrayidx4 = getelementptr inbounds i64, i64* %x, i64 %indvars.iv
1211   store i64 %call, i64* %arrayidx4, align 8
1212   %indvars.iv.next = add i64 %indvars.iv, 1
1213   %lftr.wideiv = trunc i64 %indvars.iv.next to i32
1214   %exitcond = icmp eq i32 %lftr.wideiv, %n
1215   br i1 %exitcond, label %for.end, label %for.body
1217 for.end:                                          ; preds = %for.body, %entry
1218   ret void
1221 declare i64  @llvm.ctlz.i64 (i64, i1) nounwind readnone
1223 ;CHECK-LABEL: @ctlz_f64(
1224 ;CHECK: llvm.ctlz.v4i64
1225 ;CHECK: ret void
1226 define void @ctlz_f64(i32 %n, i64* noalias %y, i64* noalias %x) nounwind uwtable {
1227 entry:
1228   %cmp9 = icmp sgt i32 %n, 0
1229   br i1 %cmp9, label %for.body, label %for.end
1231 for.body:                                         ; preds = %entry, %for.body
1232   %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
1233   %arrayidx = getelementptr inbounds i64, i64* %y, i64 %indvars.iv
1234   %0 = load i64, i64* %arrayidx, align 8
1235   %call = tail call i64 @llvm.ctlz.i64(i64 %0, i1 true) nounwind readnone
1236   %arrayidx4 = getelementptr inbounds i64, i64* %x, i64 %indvars.iv
1237   store i64 %call, i64* %arrayidx4, align 8
1238   %indvars.iv.next = add i64 %indvars.iv, 1
1239   %lftr.wideiv = trunc i64 %indvars.iv.next to i32
1240   %exitcond = icmp eq i32 %lftr.wideiv, %n
1241   br i1 %exitcond, label %for.end, label %for.body
1243 for.end:                                          ; preds = %for.body, %entry
1244   ret void
1247 declare i64 @llvm.abs.i64 (i64, i1) nounwind readnone
1249 define void @abs_i64(i32 %n, i64* noalias %y, i64* noalias %x) nounwind uwtable {
1250 ;CHECK-LABEL: @abs_i64(
1251 ;CHECK: llvm.abs.v4i64(<4 x i64> [[WIDE_LOADX:%.*]], i1 true)
1252 ;CHECK: ret void
1253 entry:
1254   %cmp9 = icmp sgt i32 %n, 0
1255   br i1 %cmp9, label %for.body, label %for.end
1257 for.body:                                         ; preds = %entry, %for.body
1258   %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
1259   %arrayidx = getelementptr inbounds i64, i64* %y, i64 %indvars.iv
1260   %0 = load i64, i64* %arrayidx, align 8
1261   %call = tail call i64 @llvm.abs.i64(i64 %0, i1 true) nounwind readnone
1262   %arrayidx4 = getelementptr inbounds i64, i64* %x, i64 %indvars.iv
1263   store i64 %call, i64* %arrayidx4, align 8
1264   %indvars.iv.next = add i64 %indvars.iv, 1
1265   %lftr.wideiv = trunc i64 %indvars.iv.next to i32
1266   %exitcond = icmp eq i32 %lftr.wideiv, %n
1267   br i1 %exitcond, label %for.end, label %for.body
1269 for.end:                                          ; preds = %for.body, %entry
1270   ret void
1273 declare i32 @llvm.smin.i32 (i32, i32)
1275 define void @smin_i32(i32 %n, i32* noalias %x, i32* noalias %y) {
1276 ; CHECK-LABEL: @smin_i32(
1277 ; CHECK:         call <4 x i32> @llvm.smin.v4i32(<4 x i32> [[WIDE_LOADX:%.*]], <4 x i32> [[WIDE_LOADY:%.*]])
1278 ; CHECK:         ret void
1279 entry:
1280   %cmp = icmp sgt i32 %n, 0
1281   br i1 %cmp, label %loop, label %end
1283 loop:
1284   %iv = phi i32 [ %iv.next, %loop ], [ 0, %entry ]
1285   %xi = getelementptr inbounds i32, i32* %x, i32 %iv
1286   %yi = getelementptr inbounds i32, i32* %y, i32 %iv
1287   %xld = load i32, i32* %xi, align 4
1288   %yld = load i32, i32* %yi, align 4
1289   %call = tail call i32 @llvm.smin.i32(i32 %xld, i32 %yld)
1290   store i32 %call, i32* %xi, align 4
1291   %iv.next = add i32 %iv, 1
1292   %exitcond = icmp eq i32 %iv.next, %n
1293   br i1 %exitcond, label %end, label %loop
1295 end:
1296   ret void
1299 declare i32 @llvm.smax.i32 (i32, i32)
1301 define void @smax_i32(i32 %n, i32* noalias %x, i32* noalias %y) {
1302 ; CHECK-LABEL: @smax_i32(
1303 ; CHECK:         call <4 x i32> @llvm.smax.v4i32(<4 x i32> [[WIDE_LOADX:%.*]], <4 x i32> [[WIDE_LOADY:%.*]])
1304 ; CHECK:         ret void
1305 entry:
1306   %cmp = icmp sgt i32 %n, 0
1307   br i1 %cmp, label %loop, label %end
1309 loop:
1310   %iv = phi i32 [ %iv.next, %loop ], [ 0, %entry ]
1311   %xi = getelementptr inbounds i32, i32* %x, i32 %iv
1312   %yi = getelementptr inbounds i32, i32* %y, i32 %iv
1313   %xld = load i32, i32* %xi, align 4
1314   %yld = load i32, i32* %yi, align 4
1315   %call = tail call i32 @llvm.smax.i32(i32 %xld, i32 %yld)
1316   store i32 %call, i32* %xi, align 4
1317   %iv.next = add i32 %iv, 1
1318   %exitcond = icmp eq i32 %iv.next, %n
1319   br i1 %exitcond, label %end, label %loop
1321 end:
1322   ret void
1325 declare i32 @llvm.umin.i32 (i32, i32)
1327 define void @umin_i32(i32 %n, i32* noalias %x, i32* noalias %y) {
1328 ; CHECK-LABEL: @umin_i32(
1329 ; CHECK:         call <4 x i32> @llvm.umin.v4i32(<4 x i32> [[WIDE_LOADX:%.*]], <4 x i32> [[WIDE_LOADY:%.*]])
1330 ; CHECK:         ret void
1331 entry:
1332   %cmp = icmp sgt i32 %n, 0
1333   br i1 %cmp, label %loop, label %end
1335 loop:
1336   %iv = phi i32 [ %iv.next, %loop ], [ 0, %entry ]
1337   %xi = getelementptr inbounds i32, i32* %x, i32 %iv
1338   %yi = getelementptr inbounds i32, i32* %y, i32 %iv
1339   %xld = load i32, i32* %xi, align 4
1340   %yld = load i32, i32* %yi, align 4
1341   %call = tail call i32 @llvm.umin.i32(i32 %xld, i32 %yld)
1342   store i32 %call, i32* %xi, align 4
1343   %iv.next = add i32 %iv, 1
1344   %exitcond = icmp eq i32 %iv.next, %n
1345   br i1 %exitcond, label %end, label %loop
1347 end:
1348   ret void
1351 declare i32 @llvm.umax.i32 (i32, i32)
1353 define void @umax_i32(i32 %n, i32* noalias %x, i32* noalias %y) {
1354 ; CHECK-LABEL: @umax_i32(
1355 ; CHECK:         call <4 x i32> @llvm.umax.v4i32(<4 x i32> [[WIDE_LOADX:%.*]], <4 x i32> [[WIDE_LOADY:%.*]])
1356 ; CHECK:         ret void
1357 entry:
1358   %cmp = icmp sgt i32 %n, 0
1359   br i1 %cmp, label %loop, label %end
1361 loop:
1362   %iv = phi i32 [ %iv.next, %loop ], [ 0, %entry ]
1363   %xi = getelementptr inbounds i32, i32* %x, i32 %iv
1364   %yi = getelementptr inbounds i32, i32* %y, i32 %iv
1365   %xld = load i32, i32* %xi, align 4
1366   %yld = load i32, i32* %yi, align 4
1367   %call = tail call i32 @llvm.umax.i32(i32 %xld, i32 %yld)
1368   store i32 %call, i32* %xi, align 4
1369   %iv.next = add i32 %iv, 1
1370   %exitcond = icmp eq i32 %iv.next, %n
1371   br i1 %exitcond, label %end, label %loop
1373 end:
1374   ret void
1377 declare i32 @llvm.fshl.i32 (i32, i32, i32)
1379 define void @fshl_i32(i32 %n, i32* noalias %x, i32* noalias %y, i32 %shAmt) {
1380 ; CHECK-LABEL: @fshl_i32(
1381 ; CHECK:         call <4 x i32> @llvm.fshl.v4i32(<4 x i32> [[WIDE_LOADX:%.*]], <4 x i32> [[WIDE_LOADY:%.*]], <4 x i32> [[SPLAT:%.*]])
1382 ; CHECK:         ret void
1383 entry:
1384   %cmp = icmp sgt i32 %n, 0
1385   br i1 %cmp, label %loop, label %end
1387 loop:
1388   %iv = phi i32 [ %iv.next, %loop ], [ 0, %entry ]
1389   %xi = getelementptr inbounds i32, i32* %x, i32 %iv
1390   %yi = getelementptr inbounds i32, i32* %y, i32 %iv
1391   %xld = load i32, i32* %xi, align 4
1392   %yld = load i32, i32* %yi, align 4
1393   %call = tail call i32 @llvm.fshl.i32(i32 %xld, i32 %yld, i32 %shAmt)
1394   store i32 %call, i32* %xi, align 4
1395   %iv.next = add i32 %iv, 1
1396   %exitcond = icmp eq i32 %iv.next, %n
1397   br i1 %exitcond, label %end, label %loop
1399 end:
1400   ret void
1403 declare i32 @llvm.fshr.i32 (i32, i32, i32)
1405 define void @fshr_i32(i32 %n, i32* noalias %x, i32* noalias %y, i32 %shAmt) {
1406 ; CHECK-LABEL: @fshr_i32(
1407 ; CHECK:         call <4 x i32> @llvm.fshr.v4i32(<4 x i32> [[WIDE_LOADX:%.*]], <4 x i32> [[WIDE_LOADY:%.*]], <4 x i32> [[SPLAT:%.*]])
1408 ; CHECK:         ret void
1409 entry:
1410   %cmp = icmp sgt i32 %n, 0
1411   br i1 %cmp, label %loop, label %end
1413 loop:
1414   %iv = phi i32 [ %iv.next, %loop ], [ 0, %entry ]
1415   %xi = getelementptr inbounds i32, i32* %x, i32 %iv
1416   %yi = getelementptr inbounds i32, i32* %y, i32 %iv
1417   %xld = load i32, i32* %xi, align 4
1418   %yld = load i32, i32* %yi, align 4
1419   %call = tail call i32 @llvm.fshr.i32(i32 %xld, i32 %yld, i32 %shAmt)
1420   store i32 %call, i32* %xi, align 4
1421   %iv.next = add i32 %iv, 1
1422   %exitcond = icmp eq i32 %iv.next, %n
1423   br i1 %exitcond, label %end, label %loop
1425 end:
1426   ret void
1429 declare float @llvm.minnum.f32(float, float) nounwind readnone
1431 ;CHECK-LABEL: @minnum_f32(
1432 ;CHECK: llvm.minnum.v4f32
1433 ;CHECK: ret void
1434 define void @minnum_f32(i32 %n, float* noalias %y, float* noalias %x, float* noalias %z) nounwind uwtable {
1435 entry:
1436   %cmp9 = icmp sgt i32 %n, 0
1437   br i1 %cmp9, label %for.body, label %for.end
1439 for.body:                                         ; preds = %entry, %for.body
1440   %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
1441   %arrayidx = getelementptr inbounds float, float* %y, i64 %indvars.iv
1442   %0 = load float, float* %arrayidx, align 4
1443   %arrayidx2 = getelementptr inbounds float, float* %z, i64 %indvars.iv
1444   %1 = load float, float* %arrayidx2, align 4
1445   %call = tail call float @llvm.minnum.f32(float %0, float %1) nounwind readnone
1446   %arrayidx4 = getelementptr inbounds float, float* %x, i64 %indvars.iv
1447   store float %call, float* %arrayidx4, align 4
1448   %indvars.iv.next = add i64 %indvars.iv, 1
1449   %lftr.wideiv = trunc i64 %indvars.iv.next to i32
1450   %exitcond = icmp eq i32 %lftr.wideiv, %n
1451   br i1 %exitcond, label %for.end, label %for.body
1453 for.end:                                          ; preds = %for.body, %entry
1454   ret void
1457 declare float @llvm.maxnum.f32(float, float) nounwind readnone
1459 ;CHECK-LABEL: @maxnum_f32(
1460 ;CHECK: llvm.maxnum.v4f32
1461 ;CHECK: ret void
1462 define void @maxnum_f32(i32 %n, float* noalias %y, float* noalias %x, float* noalias %z) nounwind uwtable {
1463 entry:
1464   %cmp9 = icmp sgt i32 %n, 0
1465   br i1 %cmp9, label %for.body, label %for.end
1467 for.body:                                         ; preds = %entry, %for.body
1468   %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
1469   %arrayidx = getelementptr inbounds float, float* %y, i64 %indvars.iv
1470   %0 = load float, float* %arrayidx, align 4
1471   %arrayidx2 = getelementptr inbounds float, float* %z, i64 %indvars.iv
1472   %1 = load float, float* %arrayidx2, align 4
1473   %call = tail call float @llvm.maxnum.f32(float %0, float %1) nounwind readnone
1474   %arrayidx4 = getelementptr inbounds float, float* %x, i64 %indvars.iv
1475   store float %call, float* %arrayidx4, align 4
1476   %indvars.iv.next = add i64 %indvars.iv, 1
1477   %lftr.wideiv = trunc i64 %indvars.iv.next to i32
1478   %exitcond = icmp eq i32 %lftr.wideiv, %n
1479   br i1 %exitcond, label %for.end, label %for.body
1481 for.end:                                          ; preds = %for.body, %entry
1482   ret void
1485 declare float @llvm.minimum.f32(float, float) nounwind readnone
1487 ;CHECK-LABEL: @minimum_f32(
1488 ;CHECK: llvm.minimum.v4f32
1489 ;CHECK: ret void
1490 define void @minimum_f32(i32 %n, float* noalias %y, float* noalias %x, float* noalias %z) nounwind uwtable {
1491 entry:
1492   %cmp9 = icmp sgt i32 %n, 0
1493   br i1 %cmp9, label %for.body, label %for.end
1495 for.body:                                         ; preds = %entry, %for.body
1496   %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
1497   %arrayidx = getelementptr inbounds float, float* %y, i64 %indvars.iv
1498   %0 = load float, float* %arrayidx, align 4
1499   %arrayidx2 = getelementptr inbounds float, float* %z, i64 %indvars.iv
1500   %1 = load float, float* %arrayidx2, align 4
1501   %call = tail call float @llvm.minimum.f32(float %0, float %1) nounwind readnone
1502   %arrayidx4 = getelementptr inbounds float, float* %x, i64 %indvars.iv
1503   store float %call, float* %arrayidx4, align 4
1504   %indvars.iv.next = add i64 %indvars.iv, 1
1505   %lftr.wideiv = trunc i64 %indvars.iv.next to i32
1506   %exitcond = icmp eq i32 %lftr.wideiv, %n
1507   br i1 %exitcond, label %for.end, label %for.body
1509 for.end:                                          ; preds = %for.body, %entry
1510   ret void
1513 declare float @llvm.maximum.f32(float, float) nounwind readnone
1515 ;CHECK-LABEL: @maximum_f32(
1516 ;CHECK: llvm.maximum.v4f32
1517 ;CHECK: ret void
1518 define void @maximum_f32(i32 %n, float* noalias %y, float* noalias %x, float* noalias %z) nounwind uwtable {
1519 entry:
1520   %cmp9 = icmp sgt i32 %n, 0
1521   br i1 %cmp9, label %for.body, label %for.end
1523 for.body:                                         ; preds = %entry, %for.body
1524   %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
1525   %arrayidx = getelementptr inbounds float, float* %y, i64 %indvars.iv
1526   %0 = load float, float* %arrayidx, align 4
1527   %arrayidx2 = getelementptr inbounds float, float* %z, i64 %indvars.iv
1528   %1 = load float, float* %arrayidx2, align 4
1529   %call = tail call float @llvm.maximum.f32(float %0, float %1) nounwind readnone
1530   %arrayidx4 = getelementptr inbounds float, float* %x, i64 %indvars.iv
1531   store float %call, float* %arrayidx4, align 4
1532   %indvars.iv.next = add i64 %indvars.iv, 1
1533   %lftr.wideiv = trunc i64 %indvars.iv.next to i32
1534   %exitcond = icmp eq i32 %lftr.wideiv, %n
1535   br i1 %exitcond, label %for.end, label %for.body
1537 for.end:                                          ; preds = %for.body, %entry
1538   ret void