80149d23a467c94b739f5d44b977c3ead314dec7
[oota-llvm.git] / test / Transforms / LoopVectorize / intrinsic.ll
1 ; RUN: opt < %s  -loop-vectorize -force-vector-interleave=1 -force-vector-width=4 -dce -instcombine -S | FileCheck %s
2
3 target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128"
4 target triple = "x86_64-unknown-linux-gnu"
5
6 ;CHECK-LABEL: @sqrt_f32(
7 ;CHECK: llvm.sqrt.v4f32
8 ;CHECK: ret void
9 define void @sqrt_f32(i32 %n, float* noalias %y, float* noalias %x) nounwind uwtable {
10 entry:
11   %cmp6 = icmp sgt i32 %n, 0
12   br i1 %cmp6, label %for.body, label %for.end
13
14 for.body:                                         ; preds = %entry, %for.body
15   %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
16   %arrayidx = getelementptr inbounds float* %y, i64 %indvars.iv
17   %0 = load float* %arrayidx, align 4
18   %call = tail call float @llvm.sqrt.f32(float %0) nounwind readnone
19   %arrayidx2 = getelementptr inbounds float* %x, i64 %indvars.iv
20   store float %call, float* %arrayidx2, align 4
21   %indvars.iv.next = add i64 %indvars.iv, 1
22   %lftr.wideiv = trunc i64 %indvars.iv.next to i32
23   %exitcond = icmp eq i32 %lftr.wideiv, %n
24   br i1 %exitcond, label %for.end, label %for.body
25
26 for.end:                                          ; preds = %for.body, %entry
27   ret void
28 }
29
30 declare float @llvm.sqrt.f32(float) nounwind readnone
31
32 ;CHECK-LABEL: @sqrt_f64(
33 ;CHECK: llvm.sqrt.v4f64
34 ;CHECK: ret void
35 define void @sqrt_f64(i32 %n, double* noalias %y, double* noalias %x) nounwind uwtable {
36 entry:
37   %cmp6 = icmp sgt i32 %n, 0
38   br i1 %cmp6, label %for.body, label %for.end
39
40 for.body:                                         ; preds = %entry, %for.body
41   %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
42   %arrayidx = getelementptr inbounds double* %y, i64 %indvars.iv
43   %0 = load double* %arrayidx, align 8
44   %call = tail call double @llvm.sqrt.f64(double %0) nounwind readnone
45   %arrayidx2 = getelementptr inbounds double* %x, i64 %indvars.iv
46   store double %call, double* %arrayidx2, align 8
47   %indvars.iv.next = add i64 %indvars.iv, 1
48   %lftr.wideiv = trunc i64 %indvars.iv.next to i32
49   %exitcond = icmp eq i32 %lftr.wideiv, %n
50   br i1 %exitcond, label %for.end, label %for.body
51
52 for.end:                                          ; preds = %for.body, %entry
53   ret void
54 }
55
56 declare double @llvm.sqrt.f64(double) nounwind readnone
57
58 ;CHECK-LABEL: @sin_f32(
59 ;CHECK: llvm.sin.v4f32
60 ;CHECK: ret void
61 define void @sin_f32(i32 %n, float* noalias %y, float* noalias %x) nounwind uwtable {
62 entry:
63   %cmp6 = icmp sgt i32 %n, 0
64   br i1 %cmp6, label %for.body, label %for.end
65
66 for.body:                                         ; preds = %entry, %for.body
67   %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
68   %arrayidx = getelementptr inbounds float* %y, i64 %indvars.iv
69   %0 = load float* %arrayidx, align 4
70   %call = tail call float @llvm.sin.f32(float %0) nounwind readnone
71   %arrayidx2 = getelementptr inbounds float* %x, i64 %indvars.iv
72   store float %call, float* %arrayidx2, align 4
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
77
78 for.end:                                          ; preds = %for.body, %entry
79   ret void
80 }
81
82 declare float @llvm.sin.f32(float) nounwind readnone
83
84 ;CHECK-LABEL: @sin_f64(
85 ;CHECK: llvm.sin.v4f64
86 ;CHECK: ret void
87 define void @sin_f64(i32 %n, double* noalias %y, double* noalias %x) nounwind uwtable {
88 entry:
89   %cmp6 = icmp sgt i32 %n, 0
90   br i1 %cmp6, label %for.body, label %for.end
91
92 for.body:                                         ; preds = %entry, %for.body
93   %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
94   %arrayidx = getelementptr inbounds double* %y, i64 %indvars.iv
95   %0 = load double* %arrayidx, align 8
96   %call = tail call double @llvm.sin.f64(double %0) nounwind readnone
97   %arrayidx2 = getelementptr inbounds double* %x, i64 %indvars.iv
98   store double %call, double* %arrayidx2, align 8
99   %indvars.iv.next = add i64 %indvars.iv, 1
100   %lftr.wideiv = trunc i64 %indvars.iv.next to i32
101   %exitcond = icmp eq i32 %lftr.wideiv, %n
102   br i1 %exitcond, label %for.end, label %for.body
103
104 for.end:                                          ; preds = %for.body, %entry
105   ret void
106 }
107
108 declare double @llvm.sin.f64(double) nounwind readnone
109
110 ;CHECK-LABEL: @cos_f32(
111 ;CHECK: llvm.cos.v4f32
112 ;CHECK: ret void
113 define void @cos_f32(i32 %n, float* noalias %y, float* noalias %x) nounwind uwtable {
114 entry:
115   %cmp6 = icmp sgt i32 %n, 0
116   br i1 %cmp6, label %for.body, label %for.end
117
118 for.body:                                         ; preds = %entry, %for.body
119   %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
120   %arrayidx = getelementptr inbounds float* %y, i64 %indvars.iv
121   %0 = load float* %arrayidx, align 4
122   %call = tail call float @llvm.cos.f32(float %0) nounwind readnone
123   %arrayidx2 = getelementptr inbounds float* %x, i64 %indvars.iv
124   store float %call, float* %arrayidx2, align 4
125   %indvars.iv.next = add i64 %indvars.iv, 1
126   %lftr.wideiv = trunc i64 %indvars.iv.next to i32
127   %exitcond = icmp eq i32 %lftr.wideiv, %n
128   br i1 %exitcond, label %for.end, label %for.body
129
130 for.end:                                          ; preds = %for.body, %entry
131   ret void
132 }
133
134 declare float @llvm.cos.f32(float) nounwind readnone
135
136 ;CHECK-LABEL: @cos_f64(
137 ;CHECK: llvm.cos.v4f64
138 ;CHECK: ret void
139 define void @cos_f64(i32 %n, double* noalias %y, double* noalias %x) nounwind uwtable {
140 entry:
141   %cmp6 = icmp sgt i32 %n, 0
142   br i1 %cmp6, label %for.body, label %for.end
143
144 for.body:                                         ; preds = %entry, %for.body
145   %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
146   %arrayidx = getelementptr inbounds double* %y, i64 %indvars.iv
147   %0 = load double* %arrayidx, align 8
148   %call = tail call double @llvm.cos.f64(double %0) nounwind readnone
149   %arrayidx2 = getelementptr inbounds double* %x, i64 %indvars.iv
150   store double %call, double* %arrayidx2, align 8
151   %indvars.iv.next = add i64 %indvars.iv, 1
152   %lftr.wideiv = trunc i64 %indvars.iv.next to i32
153   %exitcond = icmp eq i32 %lftr.wideiv, %n
154   br i1 %exitcond, label %for.end, label %for.body
155
156 for.end:                                          ; preds = %for.body, %entry
157   ret void
158 }
159
160 declare double @llvm.cos.f64(double) nounwind readnone
161
162 ;CHECK-LABEL: @exp_f32(
163 ;CHECK: llvm.exp.v4f32
164 ;CHECK: ret void
165 define void @exp_f32(i32 %n, float* noalias %y, float* noalias %x) nounwind uwtable {
166 entry:
167   %cmp6 = icmp sgt i32 %n, 0
168   br i1 %cmp6, label %for.body, label %for.end
169
170 for.body:                                         ; preds = %entry, %for.body
171   %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
172   %arrayidx = getelementptr inbounds float* %y, i64 %indvars.iv
173   %0 = load float* %arrayidx, align 4
174   %call = tail call float @llvm.exp.f32(float %0) nounwind readnone
175   %arrayidx2 = getelementptr inbounds float* %x, i64 %indvars.iv
176   store float %call, float* %arrayidx2, align 4
177   %indvars.iv.next = add i64 %indvars.iv, 1
178   %lftr.wideiv = trunc i64 %indvars.iv.next to i32
179   %exitcond = icmp eq i32 %lftr.wideiv, %n
180   br i1 %exitcond, label %for.end, label %for.body
181
182 for.end:                                          ; preds = %for.body, %entry
183   ret void
184 }
185
186 declare float @llvm.exp.f32(float) nounwind readnone
187
188 ;CHECK-LABEL: @exp_f64(
189 ;CHECK: llvm.exp.v4f64
190 ;CHECK: ret void
191 define void @exp_f64(i32 %n, double* noalias %y, double* noalias %x) nounwind uwtable {
192 entry:
193   %cmp6 = icmp sgt i32 %n, 0
194   br i1 %cmp6, label %for.body, label %for.end
195
196 for.body:                                         ; preds = %entry, %for.body
197   %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
198   %arrayidx = getelementptr inbounds double* %y, i64 %indvars.iv
199   %0 = load double* %arrayidx, align 8
200   %call = tail call double @llvm.exp.f64(double %0) nounwind readnone
201   %arrayidx2 = getelementptr inbounds double* %x, i64 %indvars.iv
202   store double %call, double* %arrayidx2, align 8
203   %indvars.iv.next = add i64 %indvars.iv, 1
204   %lftr.wideiv = trunc i64 %indvars.iv.next to i32
205   %exitcond = icmp eq i32 %lftr.wideiv, %n
206   br i1 %exitcond, label %for.end, label %for.body
207
208 for.end:                                          ; preds = %for.body, %entry
209   ret void
210 }
211
212 declare double @llvm.exp.f64(double) nounwind readnone
213
214 ;CHECK-LABEL: @exp2_f32(
215 ;CHECK: llvm.exp2.v4f32
216 ;CHECK: ret void
217 define void @exp2_f32(i32 %n, float* noalias %y, float* noalias %x) nounwind uwtable {
218 entry:
219   %cmp6 = icmp sgt i32 %n, 0
220   br i1 %cmp6, label %for.body, label %for.end
221
222 for.body:                                         ; preds = %entry, %for.body
223   %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
224   %arrayidx = getelementptr inbounds float* %y, i64 %indvars.iv
225   %0 = load float* %arrayidx, align 4
226   %call = tail call float @llvm.exp2.f32(float %0) nounwind readnone
227   %arrayidx2 = getelementptr inbounds float* %x, i64 %indvars.iv
228   store float %call, float* %arrayidx2, align 4
229   %indvars.iv.next = add i64 %indvars.iv, 1
230   %lftr.wideiv = trunc i64 %indvars.iv.next to i32
231   %exitcond = icmp eq i32 %lftr.wideiv, %n
232   br i1 %exitcond, label %for.end, label %for.body
233
234 for.end:                                          ; preds = %for.body, %entry
235   ret void
236 }
237
238 declare float @llvm.exp2.f32(float) nounwind readnone
239
240 ;CHECK-LABEL: @exp2_f64(
241 ;CHECK: llvm.exp2.v4f64
242 ;CHECK: ret void
243 define void @exp2_f64(i32 %n, double* noalias %y, double* noalias %x) nounwind uwtable {
244 entry:
245   %cmp6 = icmp sgt i32 %n, 0
246   br i1 %cmp6, label %for.body, label %for.end
247
248 for.body:                                         ; preds = %entry, %for.body
249   %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
250   %arrayidx = getelementptr inbounds double* %y, i64 %indvars.iv
251   %0 = load double* %arrayidx, align 8
252   %call = tail call double @llvm.exp2.f64(double %0) nounwind readnone
253   %arrayidx2 = getelementptr inbounds double* %x, i64 %indvars.iv
254   store double %call, double* %arrayidx2, align 8
255   %indvars.iv.next = add i64 %indvars.iv, 1
256   %lftr.wideiv = trunc i64 %indvars.iv.next to i32
257   %exitcond = icmp eq i32 %lftr.wideiv, %n
258   br i1 %exitcond, label %for.end, label %for.body
259
260 for.end:                                          ; preds = %for.body, %entry
261   ret void
262 }
263
264 declare double @llvm.exp2.f64(double) nounwind readnone
265
266 ;CHECK-LABEL: @log_f32(
267 ;CHECK: llvm.log.v4f32
268 ;CHECK: ret void
269 define void @log_f32(i32 %n, float* noalias %y, float* noalias %x) nounwind uwtable {
270 entry:
271   %cmp6 = icmp sgt i32 %n, 0
272   br i1 %cmp6, label %for.body, label %for.end
273
274 for.body:                                         ; preds = %entry, %for.body
275   %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
276   %arrayidx = getelementptr inbounds float* %y, i64 %indvars.iv
277   %0 = load float* %arrayidx, align 4
278   %call = tail call float @llvm.log.f32(float %0) nounwind readnone
279   %arrayidx2 = getelementptr inbounds float* %x, i64 %indvars.iv
280   store float %call, float* %arrayidx2, align 4
281   %indvars.iv.next = add i64 %indvars.iv, 1
282   %lftr.wideiv = trunc i64 %indvars.iv.next to i32
283   %exitcond = icmp eq i32 %lftr.wideiv, %n
284   br i1 %exitcond, label %for.end, label %for.body
285
286 for.end:                                          ; preds = %for.body, %entry
287   ret void
288 }
289
290 declare float @llvm.log.f32(float) nounwind readnone
291
292 ;CHECK-LABEL: @log_f64(
293 ;CHECK: llvm.log.v4f64
294 ;CHECK: ret void
295 define void @log_f64(i32 %n, double* noalias %y, double* noalias %x) nounwind uwtable {
296 entry:
297   %cmp6 = icmp sgt i32 %n, 0
298   br i1 %cmp6, label %for.body, label %for.end
299
300 for.body:                                         ; preds = %entry, %for.body
301   %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
302   %arrayidx = getelementptr inbounds double* %y, i64 %indvars.iv
303   %0 = load double* %arrayidx, align 8
304   %call = tail call double @llvm.log.f64(double %0) nounwind readnone
305   %arrayidx2 = getelementptr inbounds double* %x, i64 %indvars.iv
306   store double %call, double* %arrayidx2, align 8
307   %indvars.iv.next = add i64 %indvars.iv, 1
308   %lftr.wideiv = trunc i64 %indvars.iv.next to i32
309   %exitcond = icmp eq i32 %lftr.wideiv, %n
310   br i1 %exitcond, label %for.end, label %for.body
311
312 for.end:                                          ; preds = %for.body, %entry
313   ret void
314 }
315
316 declare double @llvm.log.f64(double) nounwind readnone
317
318 ;CHECK-LABEL: @log10_f32(
319 ;CHECK: llvm.log10.v4f32
320 ;CHECK: ret void
321 define void @log10_f32(i32 %n, float* noalias %y, float* noalias %x) nounwind uwtable {
322 entry:
323   %cmp6 = icmp sgt i32 %n, 0
324   br i1 %cmp6, label %for.body, label %for.end
325
326 for.body:                                         ; preds = %entry, %for.body
327   %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
328   %arrayidx = getelementptr inbounds float* %y, i64 %indvars.iv
329   %0 = load float* %arrayidx, align 4
330   %call = tail call float @llvm.log10.f32(float %0) nounwind readnone
331   %arrayidx2 = getelementptr inbounds float* %x, i64 %indvars.iv
332   store float %call, float* %arrayidx2, align 4
333   %indvars.iv.next = add i64 %indvars.iv, 1
334   %lftr.wideiv = trunc i64 %indvars.iv.next to i32
335   %exitcond = icmp eq i32 %lftr.wideiv, %n
336   br i1 %exitcond, label %for.end, label %for.body
337
338 for.end:                                          ; preds = %for.body, %entry
339   ret void
340 }
341
342 declare float @llvm.log10.f32(float) nounwind readnone
343
344 ;CHECK-LABEL: @log10_f64(
345 ;CHECK: llvm.log10.v4f64
346 ;CHECK: ret void
347 define void @log10_f64(i32 %n, double* noalias %y, double* noalias %x) nounwind uwtable {
348 entry:
349   %cmp6 = icmp sgt i32 %n, 0
350   br i1 %cmp6, label %for.body, label %for.end
351
352 for.body:                                         ; preds = %entry, %for.body
353   %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
354   %arrayidx = getelementptr inbounds double* %y, i64 %indvars.iv
355   %0 = load double* %arrayidx, align 8
356   %call = tail call double @llvm.log10.f64(double %0) nounwind readnone
357   %arrayidx2 = getelementptr inbounds double* %x, i64 %indvars.iv
358   store double %call, double* %arrayidx2, align 8
359   %indvars.iv.next = add i64 %indvars.iv, 1
360   %lftr.wideiv = trunc i64 %indvars.iv.next to i32
361   %exitcond = icmp eq i32 %lftr.wideiv, %n
362   br i1 %exitcond, label %for.end, label %for.body
363
364 for.end:                                          ; preds = %for.body, %entry
365   ret void
366 }
367
368 declare double @llvm.log10.f64(double) nounwind readnone
369
370 ;CHECK-LABEL: @log2_f32(
371 ;CHECK: llvm.log2.v4f32
372 ;CHECK: ret void
373 define void @log2_f32(i32 %n, float* noalias %y, float* noalias %x) nounwind uwtable {
374 entry:
375   %cmp6 = icmp sgt i32 %n, 0
376   br i1 %cmp6, label %for.body, label %for.end
377
378 for.body:                                         ; preds = %entry, %for.body
379   %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
380   %arrayidx = getelementptr inbounds float* %y, i64 %indvars.iv
381   %0 = load float* %arrayidx, align 4
382   %call = tail call float @llvm.log2.f32(float %0) nounwind readnone
383   %arrayidx2 = getelementptr inbounds float* %x, i64 %indvars.iv
384   store float %call, float* %arrayidx2, align 4
385   %indvars.iv.next = add i64 %indvars.iv, 1
386   %lftr.wideiv = trunc i64 %indvars.iv.next to i32
387   %exitcond = icmp eq i32 %lftr.wideiv, %n
388   br i1 %exitcond, label %for.end, label %for.body
389
390 for.end:                                          ; preds = %for.body, %entry
391   ret void
392 }
393
394 declare float @llvm.log2.f32(float) nounwind readnone
395
396 ;CHECK-LABEL: @log2_f64(
397 ;CHECK: llvm.log2.v4f64
398 ;CHECK: ret void
399 define void @log2_f64(i32 %n, double* noalias %y, double* noalias %x) nounwind uwtable {
400 entry:
401   %cmp6 = icmp sgt i32 %n, 0
402   br i1 %cmp6, label %for.body, label %for.end
403
404 for.body:                                         ; preds = %entry, %for.body
405   %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
406   %arrayidx = getelementptr inbounds double* %y, i64 %indvars.iv
407   %0 = load double* %arrayidx, align 8
408   %call = tail call double @llvm.log2.f64(double %0) nounwind readnone
409   %arrayidx2 = getelementptr inbounds double* %x, i64 %indvars.iv
410   store double %call, double* %arrayidx2, align 8
411   %indvars.iv.next = add i64 %indvars.iv, 1
412   %lftr.wideiv = trunc i64 %indvars.iv.next to i32
413   %exitcond = icmp eq i32 %lftr.wideiv, %n
414   br i1 %exitcond, label %for.end, label %for.body
415
416 for.end:                                          ; preds = %for.body, %entry
417   ret void
418 }
419
420 declare double @llvm.log2.f64(double) nounwind readnone
421
422 ;CHECK-LABEL: @fabs_f32(
423 ;CHECK: llvm.fabs.v4f32
424 ;CHECK: ret void
425 define void @fabs_f32(i32 %n, float* noalias %y, float* noalias %x) nounwind uwtable {
426 entry:
427   %cmp6 = icmp sgt i32 %n, 0
428   br i1 %cmp6, label %for.body, label %for.end
429
430 for.body:                                         ; preds = %entry, %for.body
431   %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
432   %arrayidx = getelementptr inbounds float* %y, i64 %indvars.iv
433   %0 = load float* %arrayidx, align 4
434   %call = tail call float @llvm.fabs.f32(float %0) nounwind readnone
435   %arrayidx2 = getelementptr inbounds float* %x, i64 %indvars.iv
436   store float %call, float* %arrayidx2, align 4
437   %indvars.iv.next = add i64 %indvars.iv, 1
438   %lftr.wideiv = trunc i64 %indvars.iv.next to i32
439   %exitcond = icmp eq i32 %lftr.wideiv, %n
440   br i1 %exitcond, label %for.end, label %for.body
441
442 for.end:                                          ; preds = %for.body, %entry
443   ret void
444 }
445
446 declare float @llvm.fabs.f32(float) nounwind readnone
447
448 define void @fabs_f64(i32 %n, double* noalias %y, double* noalias %x) nounwind uwtable {
449 entry:
450   %cmp6 = icmp sgt i32 %n, 0
451   br i1 %cmp6, label %for.body, label %for.end
452
453 for.body:                                         ; preds = %entry, %for.body
454   %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
455   %arrayidx = getelementptr inbounds double* %y, i64 %indvars.iv
456   %0 = load double* %arrayidx, align 8
457   %call = tail call double @llvm.fabs(double %0) nounwind readnone
458   %arrayidx2 = getelementptr inbounds double* %x, i64 %indvars.iv
459   store double %call, double* %arrayidx2, align 8
460   %indvars.iv.next = add i64 %indvars.iv, 1
461   %lftr.wideiv = trunc i64 %indvars.iv.next to i32
462   %exitcond = icmp eq i32 %lftr.wideiv, %n
463   br i1 %exitcond, label %for.end, label %for.body
464
465 for.end:                                          ; preds = %for.body, %entry
466   ret void
467 }
468
469 declare double @llvm.fabs(double) nounwind readnone
470
471 ;CHECK-LABEL: @copysign_f32(
472 ;CHECK: llvm.copysign.v4f32
473 ;CHECK: ret void
474 define void @copysign_f32(i32 %n, float* noalias %y, float* noalias %x, float* noalias %z) nounwind uwtable {
475 entry:
476   %cmp6 = icmp sgt i32 %n, 0
477   br i1 %cmp6, label %for.body, label %for.end
478
479 for.body:                                         ; preds = %entry, %for.body
480   %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
481   %arrayidx = getelementptr inbounds float* %y, i64 %indvars.iv
482   %0 = load float* %arrayidx, align 4
483   %arrayidx1 = getelementptr inbounds float* %z, i64 %indvars.iv
484   %1 = load float* %arrayidx1, align 4
485   %call = tail call float @llvm.copysign.f32(float %0, float %1) nounwind readnone
486   %arrayidx2 = getelementptr inbounds float* %x, i64 %indvars.iv
487   store float %call, float* %arrayidx2, align 4
488   %indvars.iv.next = add i64 %indvars.iv, 1
489   %lftr.wideiv = trunc i64 %indvars.iv.next to i32
490   %exitcond = icmp eq i32 %lftr.wideiv, %n
491   br i1 %exitcond, label %for.end, label %for.body
492
493 for.end:                                          ; preds = %for.body, %entry
494   ret void
495 }
496
497 declare float @llvm.copysign.f32(float, float) nounwind readnone
498
499 define void @copysign_f64(i32 %n, double* noalias %y, double* noalias %x, double* noalias %z) nounwind uwtable {
500 entry:
501   %cmp6 = icmp sgt i32 %n, 0
502   br i1 %cmp6, label %for.body, label %for.end
503
504 for.body:                                         ; preds = %entry, %for.body
505   %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
506   %arrayidx = getelementptr inbounds double* %y, i64 %indvars.iv
507   %0 = load double* %arrayidx, align 8
508   %arrayidx1 = getelementptr inbounds double* %z, i64 %indvars.iv
509   %1 = load double* %arrayidx, align 8
510   %call = tail call double @llvm.copysign(double %0, double %1) nounwind readnone
511   %arrayidx2 = getelementptr inbounds double* %x, i64 %indvars.iv
512   store double %call, double* %arrayidx2, align 8
513   %indvars.iv.next = add i64 %indvars.iv, 1
514   %lftr.wideiv = trunc i64 %indvars.iv.next to i32
515   %exitcond = icmp eq i32 %lftr.wideiv, %n
516   br i1 %exitcond, label %for.end, label %for.body
517
518 for.end:                                          ; preds = %for.body, %entry
519   ret void
520 }
521
522 declare double @llvm.copysign(double, double) nounwind readnone
523
524 ;CHECK-LABEL: @floor_f32(
525 ;CHECK: llvm.floor.v4f32
526 ;CHECK: ret void
527 define void @floor_f32(i32 %n, float* noalias %y, float* noalias %x) nounwind uwtable {
528 entry:
529   %cmp6 = icmp sgt i32 %n, 0
530   br i1 %cmp6, label %for.body, label %for.end
531
532 for.body:                                         ; preds = %entry, %for.body
533   %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
534   %arrayidx = getelementptr inbounds float* %y, i64 %indvars.iv
535   %0 = load float* %arrayidx, align 4
536   %call = tail call float @llvm.floor.f32(float %0) nounwind readnone
537   %arrayidx2 = getelementptr inbounds float* %x, i64 %indvars.iv
538   store float %call, float* %arrayidx2, align 4
539   %indvars.iv.next = add i64 %indvars.iv, 1
540   %lftr.wideiv = trunc i64 %indvars.iv.next to i32
541   %exitcond = icmp eq i32 %lftr.wideiv, %n
542   br i1 %exitcond, label %for.end, label %for.body
543
544 for.end:                                          ; preds = %for.body, %entry
545   ret void
546 }
547
548 declare float @llvm.floor.f32(float) nounwind readnone
549
550 ;CHECK-LABEL: @floor_f64(
551 ;CHECK: llvm.floor.v4f64
552 ;CHECK: ret void
553 define void @floor_f64(i32 %n, double* noalias %y, double* noalias %x) nounwind uwtable {
554 entry:
555   %cmp6 = icmp sgt i32 %n, 0
556   br i1 %cmp6, label %for.body, label %for.end
557
558 for.body:                                         ; preds = %entry, %for.body
559   %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
560   %arrayidx = getelementptr inbounds double* %y, i64 %indvars.iv
561   %0 = load double* %arrayidx, align 8
562   %call = tail call double @llvm.floor.f64(double %0) nounwind readnone
563   %arrayidx2 = getelementptr inbounds double* %x, i64 %indvars.iv
564   store double %call, double* %arrayidx2, align 8
565   %indvars.iv.next = add i64 %indvars.iv, 1
566   %lftr.wideiv = trunc i64 %indvars.iv.next to i32
567   %exitcond = icmp eq i32 %lftr.wideiv, %n
568   br i1 %exitcond, label %for.end, label %for.body
569
570 for.end:                                          ; preds = %for.body, %entry
571   ret void
572 }
573
574 declare double @llvm.floor.f64(double) nounwind readnone
575
576 ;CHECK-LABEL: @ceil_f32(
577 ;CHECK: llvm.ceil.v4f32
578 ;CHECK: ret void
579 define void @ceil_f32(i32 %n, float* noalias %y, float* noalias %x) nounwind uwtable {
580 entry:
581   %cmp6 = icmp sgt i32 %n, 0
582   br i1 %cmp6, label %for.body, label %for.end
583
584 for.body:                                         ; preds = %entry, %for.body
585   %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
586   %arrayidx = getelementptr inbounds float* %y, i64 %indvars.iv
587   %0 = load float* %arrayidx, align 4
588   %call = tail call float @llvm.ceil.f32(float %0) nounwind readnone
589   %arrayidx2 = getelementptr inbounds float* %x, i64 %indvars.iv
590   store float %call, float* %arrayidx2, align 4
591   %indvars.iv.next = add i64 %indvars.iv, 1
592   %lftr.wideiv = trunc i64 %indvars.iv.next to i32
593   %exitcond = icmp eq i32 %lftr.wideiv, %n
594   br i1 %exitcond, label %for.end, label %for.body
595
596 for.end:                                          ; preds = %for.body, %entry
597   ret void
598 }
599
600 declare float @llvm.ceil.f32(float) nounwind readnone
601
602 ;CHECK-LABEL: @ceil_f64(
603 ;CHECK: llvm.ceil.v4f64
604 ;CHECK: ret void
605 define void @ceil_f64(i32 %n, double* noalias %y, double* noalias %x) nounwind uwtable {
606 entry:
607   %cmp6 = icmp sgt i32 %n, 0
608   br i1 %cmp6, label %for.body, label %for.end
609
610 for.body:                                         ; preds = %entry, %for.body
611   %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
612   %arrayidx = getelementptr inbounds double* %y, i64 %indvars.iv
613   %0 = load double* %arrayidx, align 8
614   %call = tail call double @llvm.ceil.f64(double %0) nounwind readnone
615   %arrayidx2 = getelementptr inbounds double* %x, i64 %indvars.iv
616   store double %call, double* %arrayidx2, align 8
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
621
622 for.end:                                          ; preds = %for.body, %entry
623   ret void
624 }
625
626 declare double @llvm.ceil.f64(double) nounwind readnone
627
628 ;CHECK-LABEL: @trunc_f32(
629 ;CHECK: llvm.trunc.v4f32
630 ;CHECK: ret void
631 define void @trunc_f32(i32 %n, float* noalias %y, float* noalias %x) nounwind uwtable {
632 entry:
633   %cmp6 = icmp sgt i32 %n, 0
634   br i1 %cmp6, label %for.body, label %for.end
635
636 for.body:                                         ; preds = %entry, %for.body
637   %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
638   %arrayidx = getelementptr inbounds float* %y, i64 %indvars.iv
639   %0 = load float* %arrayidx, align 4
640   %call = tail call float @llvm.trunc.f32(float %0) nounwind readnone
641   %arrayidx2 = getelementptr inbounds float* %x, i64 %indvars.iv
642   store float %call, float* %arrayidx2, align 4
643   %indvars.iv.next = add i64 %indvars.iv, 1
644   %lftr.wideiv = trunc i64 %indvars.iv.next to i32
645   %exitcond = icmp eq i32 %lftr.wideiv, %n
646   br i1 %exitcond, label %for.end, label %for.body
647
648 for.end:                                          ; preds = %for.body, %entry
649   ret void
650 }
651
652 declare float @llvm.trunc.f32(float) nounwind readnone
653
654 ;CHECK-LABEL: @trunc_f64(
655 ;CHECK: llvm.trunc.v4f64
656 ;CHECK: ret void
657 define void @trunc_f64(i32 %n, double* noalias %y, double* noalias %x) nounwind uwtable {
658 entry:
659   %cmp6 = icmp sgt i32 %n, 0
660   br i1 %cmp6, label %for.body, label %for.end
661
662 for.body:                                         ; preds = %entry, %for.body
663   %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
664   %arrayidx = getelementptr inbounds double* %y, i64 %indvars.iv
665   %0 = load double* %arrayidx, align 8
666   %call = tail call double @llvm.trunc.f64(double %0) nounwind readnone
667   %arrayidx2 = getelementptr inbounds double* %x, i64 %indvars.iv
668   store double %call, double* %arrayidx2, align 8
669   %indvars.iv.next = add i64 %indvars.iv, 1
670   %lftr.wideiv = trunc i64 %indvars.iv.next to i32
671   %exitcond = icmp eq i32 %lftr.wideiv, %n
672   br i1 %exitcond, label %for.end, label %for.body
673
674 for.end:                                          ; preds = %for.body, %entry
675   ret void
676 }
677
678 declare double @llvm.trunc.f64(double) nounwind readnone
679
680 ;CHECK-LABEL: @rint_f32(
681 ;CHECK: llvm.rint.v4f32
682 ;CHECK: ret void
683 define void @rint_f32(i32 %n, float* noalias %y, float* noalias %x) nounwind uwtable {
684 entry:
685   %cmp6 = icmp sgt i32 %n, 0
686   br i1 %cmp6, label %for.body, label %for.end
687
688 for.body:                                         ; preds = %entry, %for.body
689   %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
690   %arrayidx = getelementptr inbounds float* %y, i64 %indvars.iv
691   %0 = load float* %arrayidx, align 4
692   %call = tail call float @llvm.rint.f32(float %0) nounwind readnone
693   %arrayidx2 = getelementptr inbounds float* %x, i64 %indvars.iv
694   store float %call, float* %arrayidx2, align 4
695   %indvars.iv.next = add i64 %indvars.iv, 1
696   %lftr.wideiv = trunc i64 %indvars.iv.next to i32
697   %exitcond = icmp eq i32 %lftr.wideiv, %n
698   br i1 %exitcond, label %for.end, label %for.body
699
700 for.end:                                          ; preds = %for.body, %entry
701   ret void
702 }
703
704 declare float @llvm.rint.f32(float) nounwind readnone
705
706 ;CHECK-LABEL: @rint_f64(
707 ;CHECK: llvm.rint.v4f64
708 ;CHECK: ret void
709 define void @rint_f64(i32 %n, double* noalias %y, double* noalias %x) nounwind uwtable {
710 entry:
711   %cmp6 = icmp sgt i32 %n, 0
712   br i1 %cmp6, label %for.body, label %for.end
713
714 for.body:                                         ; preds = %entry, %for.body
715   %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
716   %arrayidx = getelementptr inbounds double* %y, i64 %indvars.iv
717   %0 = load double* %arrayidx, align 8
718   %call = tail call double @llvm.rint.f64(double %0) nounwind readnone
719   %arrayidx2 = getelementptr inbounds double* %x, i64 %indvars.iv
720   store double %call, double* %arrayidx2, align 8
721   %indvars.iv.next = add i64 %indvars.iv, 1
722   %lftr.wideiv = trunc i64 %indvars.iv.next to i32
723   %exitcond = icmp eq i32 %lftr.wideiv, %n
724   br i1 %exitcond, label %for.end, label %for.body
725
726 for.end:                                          ; preds = %for.body, %entry
727   ret void
728 }
729
730 declare double @llvm.rint.f64(double) nounwind readnone
731
732 ;CHECK-LABEL: @nearbyint_f32(
733 ;CHECK: llvm.nearbyint.v4f32
734 ;CHECK: ret void
735 define void @nearbyint_f32(i32 %n, float* noalias %y, float* noalias %x) nounwind uwtable {
736 entry:
737   %cmp6 = icmp sgt i32 %n, 0
738   br i1 %cmp6, label %for.body, label %for.end
739
740 for.body:                                         ; preds = %entry, %for.body
741   %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
742   %arrayidx = getelementptr inbounds float* %y, i64 %indvars.iv
743   %0 = load float* %arrayidx, align 4
744   %call = tail call float @llvm.nearbyint.f32(float %0) nounwind readnone
745   %arrayidx2 = getelementptr inbounds float* %x, i64 %indvars.iv
746   store float %call, float* %arrayidx2, align 4
747   %indvars.iv.next = add i64 %indvars.iv, 1
748   %lftr.wideiv = trunc i64 %indvars.iv.next to i32
749   %exitcond = icmp eq i32 %lftr.wideiv, %n
750   br i1 %exitcond, label %for.end, label %for.body
751
752 for.end:                                          ; preds = %for.body, %entry
753   ret void
754 }
755
756 declare float @llvm.nearbyint.f32(float) nounwind readnone
757
758 ;CHECK-LABEL: @nearbyint_f64(
759 ;CHECK: llvm.nearbyint.v4f64
760 ;CHECK: ret void
761 define void @nearbyint_f64(i32 %n, double* noalias %y, double* noalias %x) nounwind uwtable {
762 entry:
763   %cmp6 = icmp sgt i32 %n, 0
764   br i1 %cmp6, label %for.body, label %for.end
765
766 for.body:                                         ; preds = %entry, %for.body
767   %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
768   %arrayidx = getelementptr inbounds double* %y, i64 %indvars.iv
769   %0 = load double* %arrayidx, align 8
770   %call = tail call double @llvm.nearbyint.f64(double %0) nounwind readnone
771   %arrayidx2 = getelementptr inbounds double* %x, i64 %indvars.iv
772   store double %call, double* %arrayidx2, align 8
773   %indvars.iv.next = add i64 %indvars.iv, 1
774   %lftr.wideiv = trunc i64 %indvars.iv.next to i32
775   %exitcond = icmp eq i32 %lftr.wideiv, %n
776   br i1 %exitcond, label %for.end, label %for.body
777
778 for.end:                                          ; preds = %for.body, %entry
779   ret void
780 }
781
782 declare double @llvm.nearbyint.f64(double) nounwind readnone
783
784 ;CHECK-LABEL: @round_f32(
785 ;CHECK: llvm.round.v4f32
786 ;CHECK: ret void
787 define void @round_f32(i32 %n, float* noalias %y, float* noalias %x) nounwind uwtable {
788 entry:
789   %cmp6 = icmp sgt i32 %n, 0
790   br i1 %cmp6, label %for.body, label %for.end
791
792 for.body:                                         ; preds = %entry, %for.body
793   %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
794   %arrayidx = getelementptr inbounds float* %y, i64 %indvars.iv
795   %0 = load float* %arrayidx, align 4
796   %call = tail call float @llvm.round.f32(float %0) nounwind readnone
797   %arrayidx2 = getelementptr inbounds float* %x, i64 %indvars.iv
798   store float %call, float* %arrayidx2, align 4
799   %indvars.iv.next = add i64 %indvars.iv, 1
800   %lftr.wideiv = trunc i64 %indvars.iv.next to i32
801   %exitcond = icmp eq i32 %lftr.wideiv, %n
802   br i1 %exitcond, label %for.end, label %for.body
803
804 for.end:                                          ; preds = %for.body, %entry
805   ret void
806 }
807
808 declare float @llvm.round.f32(float) nounwind readnone
809
810 ;CHECK-LABEL: @round_f64(
811 ;CHECK: llvm.round.v4f64
812 ;CHECK: ret void
813 define void @round_f64(i32 %n, double* noalias %y, double* noalias %x) nounwind uwtable {
814 entry:
815   %cmp6 = icmp sgt i32 %n, 0
816   br i1 %cmp6, label %for.body, label %for.end
817
818 for.body:                                         ; preds = %entry, %for.body
819   %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
820   %arrayidx = getelementptr inbounds double* %y, i64 %indvars.iv
821   %0 = load double* %arrayidx, align 8
822   %call = tail call double @llvm.round.f64(double %0) nounwind readnone
823   %arrayidx2 = getelementptr inbounds double* %x, i64 %indvars.iv
824   store double %call, double* %arrayidx2, align 8
825   %indvars.iv.next = add i64 %indvars.iv, 1
826   %lftr.wideiv = trunc i64 %indvars.iv.next to i32
827   %exitcond = icmp eq i32 %lftr.wideiv, %n
828   br i1 %exitcond, label %for.end, label %for.body
829
830 for.end:                                          ; preds = %for.body, %entry
831   ret void
832 }
833
834 declare double @llvm.round.f64(double) nounwind readnone
835
836 ;CHECK-LABEL: @fma_f32(
837 ;CHECK: llvm.fma.v4f32
838 ;CHECK: ret void
839 define void @fma_f32(i32 %n, float* noalias %y, float* noalias %x, float* noalias %z, float* noalias %w) nounwind uwtable {
840 entry:
841   %cmp12 = icmp sgt i32 %n, 0
842   br i1 %cmp12, label %for.body, label %for.end
843
844 for.body:                                         ; preds = %entry, %for.body
845   %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
846   %arrayidx = getelementptr inbounds float* %y, i64 %indvars.iv
847   %0 = load float* %arrayidx, align 4
848   %arrayidx2 = getelementptr inbounds float* %w, i64 %indvars.iv
849   %1 = load float* %arrayidx2, align 4
850   %arrayidx4 = getelementptr inbounds float* %z, i64 %indvars.iv
851   %2 = load float* %arrayidx4, align 4
852   %3 = tail call float @llvm.fma.f32(float %0, float %2, float %1)
853   %arrayidx6 = getelementptr inbounds float* %x, i64 %indvars.iv
854   store float %3, float* %arrayidx6, align 4
855   %indvars.iv.next = add i64 %indvars.iv, 1
856   %lftr.wideiv = trunc i64 %indvars.iv.next to i32
857   %exitcond = icmp eq i32 %lftr.wideiv, %n
858   br i1 %exitcond, label %for.end, label %for.body
859
860 for.end:                                          ; preds = %for.body, %entry
861   ret void
862 }
863
864 declare float @llvm.fma.f32(float, float, float) nounwind readnone
865
866 ;CHECK-LABEL: @fma_f64(
867 ;CHECK: llvm.fma.v4f64
868 ;CHECK: ret void
869 define void @fma_f64(i32 %n, double* noalias %y, double* noalias %x, double* noalias %z, double* noalias %w) nounwind uwtable {
870 entry:
871   %cmp12 = icmp sgt i32 %n, 0
872   br i1 %cmp12, label %for.body, label %for.end
873
874 for.body:                                         ; preds = %entry, %for.body
875   %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
876   %arrayidx = getelementptr inbounds double* %y, i64 %indvars.iv
877   %0 = load double* %arrayidx, align 8
878   %arrayidx2 = getelementptr inbounds double* %w, i64 %indvars.iv
879   %1 = load double* %arrayidx2, align 8
880   %arrayidx4 = getelementptr inbounds double* %z, i64 %indvars.iv
881   %2 = load double* %arrayidx4, align 8
882   %3 = tail call double @llvm.fma.f64(double %0, double %2, double %1)
883   %arrayidx6 = getelementptr inbounds double* %x, i64 %indvars.iv
884   store double %3, double* %arrayidx6, align 8
885   %indvars.iv.next = add i64 %indvars.iv, 1
886   %lftr.wideiv = trunc i64 %indvars.iv.next to i32
887   %exitcond = icmp eq i32 %lftr.wideiv, %n
888   br i1 %exitcond, label %for.end, label %for.body
889
890 for.end:                                          ; preds = %for.body, %entry
891   ret void
892 }
893
894 declare double @llvm.fma.f64(double, double, double) nounwind readnone
895
896 ;CHECK-LABEL: @fmuladd_f32(
897 ;CHECK: llvm.fmuladd.v4f32
898 ;CHECK: ret void
899 define void @fmuladd_f32(i32 %n, float* noalias %y, float* noalias %x, float* noalias %z, float* noalias %w) nounwind uwtable {
900 entry:
901   %cmp12 = icmp sgt i32 %n, 0
902   br i1 %cmp12, label %for.body, label %for.end
903
904 for.body:                                         ; preds = %entry, %for.body
905   %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
906   %arrayidx = getelementptr inbounds float* %y, i64 %indvars.iv
907   %0 = load float* %arrayidx, align 4
908   %arrayidx2 = getelementptr inbounds float* %w, i64 %indvars.iv
909   %1 = load float* %arrayidx2, align 4
910   %arrayidx4 = getelementptr inbounds float* %z, i64 %indvars.iv
911   %2 = load float* %arrayidx4, align 4
912   %3 = tail call float @llvm.fmuladd.f32(float %0, float %2, float %1)
913   %arrayidx6 = getelementptr inbounds float* %x, i64 %indvars.iv
914   store float %3, float* %arrayidx6, align 4
915   %indvars.iv.next = add i64 %indvars.iv, 1
916   %lftr.wideiv = trunc i64 %indvars.iv.next to i32
917   %exitcond = icmp eq i32 %lftr.wideiv, %n
918   br i1 %exitcond, label %for.end, label %for.body
919
920 for.end:                                          ; preds = %for.body, %entry
921   ret void
922 }
923
924 declare float @llvm.fmuladd.f32(float, float, float) nounwind readnone
925
926 ;CHECK-LABEL: @fmuladd_f64(
927 ;CHECK: llvm.fmuladd.v4f64
928 ;CHECK: ret void
929 define void @fmuladd_f64(i32 %n, double* noalias %y, double* noalias %x, double* noalias %z, double* noalias %w) nounwind uwtable {
930 entry:
931   %cmp12 = icmp sgt i32 %n, 0
932   br i1 %cmp12, label %for.body, label %for.end
933
934 for.body:                                         ; preds = %entry, %for.body
935   %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
936   %arrayidx = getelementptr inbounds double* %y, i64 %indvars.iv
937   %0 = load double* %arrayidx, align 8
938   %arrayidx2 = getelementptr inbounds double* %w, i64 %indvars.iv
939   %1 = load double* %arrayidx2, align 8
940   %arrayidx4 = getelementptr inbounds double* %z, i64 %indvars.iv
941   %2 = load double* %arrayidx4, align 8
942   %3 = tail call double @llvm.fmuladd.f64(double %0, double %2, double %1)
943   %arrayidx6 = getelementptr inbounds double* %x, i64 %indvars.iv
944   store double %3, double* %arrayidx6, align 8
945   %indvars.iv.next = add i64 %indvars.iv, 1
946   %lftr.wideiv = trunc i64 %indvars.iv.next to i32
947   %exitcond = icmp eq i32 %lftr.wideiv, %n
948   br i1 %exitcond, label %for.end, label %for.body
949
950 for.end:                                          ; preds = %for.body, %entry
951   ret void
952 }
953
954 declare double @llvm.fmuladd.f64(double, double, double) nounwind readnone
955
956 ;CHECK-LABEL: @pow_f32(
957 ;CHECK: llvm.pow.v4f32
958 ;CHECK: ret void
959 define void @pow_f32(i32 %n, float* noalias %y, float* noalias %x, float* noalias %z) nounwind uwtable {
960 entry:
961   %cmp9 = icmp sgt i32 %n, 0
962   br i1 %cmp9, label %for.body, label %for.end
963
964 for.body:                                         ; preds = %entry, %for.body
965   %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
966   %arrayidx = getelementptr inbounds float* %y, i64 %indvars.iv
967   %0 = load float* %arrayidx, align 4
968   %arrayidx2 = getelementptr inbounds float* %z, i64 %indvars.iv
969   %1 = load float* %arrayidx2, align 4
970   %call = tail call float @llvm.pow.f32(float %0, float %1) nounwind readnone
971   %arrayidx4 = getelementptr inbounds float* %x, i64 %indvars.iv
972   store float %call, float* %arrayidx4, align 4
973   %indvars.iv.next = add i64 %indvars.iv, 1
974   %lftr.wideiv = trunc i64 %indvars.iv.next to i32
975   %exitcond = icmp eq i32 %lftr.wideiv, %n
976   br i1 %exitcond, label %for.end, label %for.body
977
978 for.end:                                          ; preds = %for.body, %entry
979   ret void
980 }
981
982 declare float @llvm.pow.f32(float, float) nounwind readnone
983
984 ;CHECK-LABEL: @pow_f64(
985 ;CHECK: llvm.pow.v4f64
986 ;CHECK: ret void
987 define void @pow_f64(i32 %n, double* noalias %y, double* noalias %x, double* noalias %z) nounwind uwtable {
988 entry:
989   %cmp9 = icmp sgt i32 %n, 0
990   br i1 %cmp9, label %for.body, label %for.end
991
992 for.body:                                         ; preds = %entry, %for.body
993   %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
994   %arrayidx = getelementptr inbounds double* %y, i64 %indvars.iv
995   %0 = load double* %arrayidx, align 8
996   %arrayidx2 = getelementptr inbounds double* %z, i64 %indvars.iv
997   %1 = load double* %arrayidx2, align 8
998   %call = tail call double @llvm.pow.f64(double %0, double %1) nounwind readnone
999   %arrayidx4 = getelementptr inbounds double* %x, i64 %indvars.iv
1000   store double %call, double* %arrayidx4, align 8
1001   %indvars.iv.next = add i64 %indvars.iv, 1
1002   %lftr.wideiv = trunc i64 %indvars.iv.next to i32
1003   %exitcond = icmp eq i32 %lftr.wideiv, %n
1004   br i1 %exitcond, label %for.end, label %for.body
1005
1006 for.end:                                          ; preds = %for.body, %entry
1007   ret void
1008 }
1009
1010 ; CHECK: fabs_libm
1011 ; CHECK:  call <4 x float> @llvm.fabs.v4f32
1012 ; CHECK: ret void
1013 define void @fabs_libm(float* nocapture %x) nounwind {
1014 entry:
1015   br label %for.body
1016
1017 for.body:                                         ; preds = %entry, %for.body
1018   %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.body ]
1019   %arrayidx = getelementptr inbounds float* %x, i64 %indvars.iv
1020   %0 = load float* %arrayidx, align 4
1021   %call = tail call float @fabsf(float %0) nounwind readnone
1022   store float %call, float* %arrayidx, align 4
1023   %indvars.iv.next = add i64 %indvars.iv, 1
1024   %lftr.wideiv = trunc i64 %indvars.iv.next to i32
1025   %exitcond = icmp eq i32 %lftr.wideiv, 1024
1026   br i1 %exitcond, label %for.end, label %for.body
1027
1028 for.end:                                          ; preds = %for.body
1029   ret void
1030 }
1031
1032 declare float @fabsf(float) nounwind readnone
1033
1034 declare double @llvm.pow.f64(double, double) nounwind readnone
1035
1036
1037
1038 ; Make sure we don't replace calls to functions with standard library function
1039 ; signatures but defined with internal linkage.
1040
1041 define internal float @roundf(float %x) nounwind readnone {
1042   ret float 0.00000000
1043 }
1044 ; CHECK-LABEL: internal_round
1045 ; CHECK-NOT:  load <4 x float>
1046
1047 define void @internal_round(float* nocapture %x) nounwind {
1048 entry:
1049   br label %for.body
1050
1051 for.body:                                         ; preds = %entry, %for.body
1052   %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.body ]
1053   %arrayidx = getelementptr inbounds float* %x, i64 %indvars.iv
1054   %0 = load float* %arrayidx, align 4
1055   %call = tail call float @roundf(float %0) nounwind readnone
1056   store float %call, float* %arrayidx, align 4
1057   %indvars.iv.next = add i64 %indvars.iv, 1
1058   %lftr.wideiv = trunc i64 %indvars.iv.next to i32
1059   %exitcond = icmp eq i32 %lftr.wideiv, 1024
1060   br i1 %exitcond, label %for.end, label %for.body
1061
1062 for.end:                                          ; preds = %for.body
1063   ret void
1064 }
1065
1066 ; Make sure we don't replace calls to functions with standard library names but
1067 ; different signatures.
1068
1069 declare void @round(double %f)
1070
1071 ; CHECK-LABEL: wrong_signature
1072 ; CHECK-NOT:  load <4 x double>
1073
1074 define void @wrong_signature(double* nocapture %x) nounwind {
1075 entry:
1076   br label %for.body
1077
1078 for.body:                                         ; preds = %entry, %for.body
1079   %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.body ]
1080   %arrayidx = getelementptr inbounds double* %x, i64 %indvars.iv
1081   %0 = load double* %arrayidx, align 4
1082   store double %0, double* %arrayidx, align 4
1083   tail call void @round(double %0) nounwind readnone
1084   %indvars.iv.next = add i64 %indvars.iv, 1
1085   %lftr.wideiv = trunc i64 %indvars.iv.next to i32
1086   %exitcond = icmp eq i32 %lftr.wideiv, 1024
1087   br i1 %exitcond, label %for.end, label %for.body
1088
1089 for.end:                                          ; preds = %for.body
1090   ret void
1091 }
1092
1093 declare double @llvm.powi.f64(double %Val, i32 %power) nounwind readnone
1094
1095 ;CHECK-LABEL: @powi_f64(
1096 ;CHECK: llvm.powi.v4f64
1097 ;CHECK: ret void
1098 define void @powi_f64(i32 %n, double* noalias %y, double* noalias %x, i32 %P) nounwind uwtable {
1099 entry:
1100   %cmp9 = icmp sgt i32 %n, 0
1101   br i1 %cmp9, label %for.body, label %for.end
1102
1103 for.body:                                         ; preds = %entry, %for.body
1104   %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
1105   %arrayidx = getelementptr inbounds double* %y, i64 %indvars.iv
1106   %0 = load double* %arrayidx, align 8
1107   %call = tail call double @llvm.powi.f64(double %0, i32  %P) nounwind readnone
1108   %arrayidx4 = getelementptr inbounds double* %x, i64 %indvars.iv
1109   store double %call, double* %arrayidx4, align 8
1110   %indvars.iv.next = add i64 %indvars.iv, 1
1111   %lftr.wideiv = trunc i64 %indvars.iv.next to i32
1112   %exitcond = icmp eq i32 %lftr.wideiv, %n
1113   br i1 %exitcond, label %for.end, label %for.body
1114
1115 for.end:                                          ; preds = %for.body, %entry
1116   ret void
1117 }
1118
1119 ;CHECK-LABEL: @powi_f64_neg(
1120 ;CHECK-NOT: llvm.powi.v4f64
1121 ;CHECK: ret void
1122 define void @powi_f64_neg(i32 %n, double* noalias %y, double* noalias %x) nounwind uwtable {
1123 entry:
1124   %cmp9 = icmp sgt i32 %n, 0
1125   br i1 %cmp9, label %for.body, label %for.end
1126
1127 for.body:                                         ; preds = %entry, %for.body
1128   %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
1129   %arrayidx = getelementptr inbounds double* %y, i64 %indvars.iv
1130   %0 = load double* %arrayidx, align 8
1131   %1 = trunc i64 %indvars.iv to i32
1132   %call = tail call double @llvm.powi.f64(double %0, i32  %1) nounwind readnone
1133   %arrayidx4 = getelementptr inbounds double* %x, i64 %indvars.iv
1134   store double %call, double* %arrayidx4, align 8
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, %n
1138   br i1 %exitcond, label %for.end, label %for.body
1139
1140 for.end:                                          ; preds = %for.body, %entry
1141   ret void
1142 }
1143
1144 declare i64  @llvm.cttz.i64 (i64, i1) nounwind readnone
1145
1146 ;CHECK-LABEL: @cttz_f64(
1147 ;CHECK: llvm.cttz.v4i64
1148 ;CHECK: ret void
1149 define void @cttz_f64(i32 %n, i64* noalias %y, i64* noalias %x) nounwind uwtable {
1150 entry:
1151   %cmp9 = icmp sgt i32 %n, 0
1152   br i1 %cmp9, label %for.body, label %for.end
1153
1154 for.body:                                         ; preds = %entry, %for.body
1155   %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
1156   %arrayidx = getelementptr inbounds i64* %y, i64 %indvars.iv
1157   %0 = load i64* %arrayidx, align 8
1158   %call = tail call i64 @llvm.cttz.i64(i64 %0, i1 true) nounwind readnone
1159   %arrayidx4 = getelementptr inbounds i64* %x, i64 %indvars.iv
1160   store i64 %call, i64* %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
1165
1166 for.end:                                          ; preds = %for.body, %entry
1167   ret void
1168 }
1169
1170 declare i64  @llvm.ctlz.i64 (i64, i1) nounwind readnone
1171
1172 ;CHECK-LABEL: @ctlz_f64(
1173 ;CHECK: llvm.ctlz.v4i64
1174 ;CHECK: ret void
1175 define void @ctlz_f64(i32 %n, i64* noalias %y, i64* noalias %x) nounwind uwtable {
1176 entry:
1177   %cmp9 = icmp sgt i32 %n, 0
1178   br i1 %cmp9, label %for.body, label %for.end
1179
1180 for.body:                                         ; preds = %entry, %for.body
1181   %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
1182   %arrayidx = getelementptr inbounds i64* %y, i64 %indvars.iv
1183   %0 = load i64* %arrayidx, align 8
1184   %call = tail call i64 @llvm.ctlz.i64(i64 %0, i1 true) nounwind readnone
1185   %arrayidx4 = getelementptr inbounds i64* %x, i64 %indvars.iv
1186   store i64 %call, i64* %arrayidx4, align 8
1187   %indvars.iv.next = add i64 %indvars.iv, 1
1188   %lftr.wideiv = trunc i64 %indvars.iv.next to i32
1189   %exitcond = icmp eq i32 %lftr.wideiv, %n
1190   br i1 %exitcond, label %for.end, label %for.body
1191
1192 for.end:                                          ; preds = %for.body, %entry
1193   ret void
1194 }