xref: /llvm-project/llvm/test/Transforms/LoopVectorize/intrinsic.ll (revision 6355fb45a5433d90a3f1a342920ff56a7fee7e16)
1; RUN: opt < %s -passes=loop-vectorize,dce,instcombine -force-vector-interleave=1 -force-vector-width=4 -S | FileCheck %s
2
3define void @sqrt_f32(i32 %n, ptr %y, ptr %x) {
4; CHECK-LABEL: @sqrt_f32(
5; CHECK: llvm.sqrt.v4f32
6; CHECK: ret void
7;
8entry:
9  %cmp6 = icmp sgt i32 %n, 0
10  br i1 %cmp6, label %for.body, label %for.end
11
12for.body:                                         ; preds = %entry, %for.body
13  %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
14  %arrayidx = getelementptr inbounds float, ptr %y, i64 %indvars.iv
15  %0 = load float, ptr %arrayidx, align 4
16  %call = tail call float @llvm.sqrt.f32(float %0)
17  %arrayidx2 = getelementptr inbounds float, ptr %x, i64 %indvars.iv
18  store float %call, ptr %arrayidx2, align 4
19  %indvars.iv.next = add i64 %indvars.iv, 1
20  %lftr.wideiv = trunc i64 %indvars.iv.next to i32
21  %exitcond = icmp eq i32 %lftr.wideiv, %n
22  br i1 %exitcond, label %for.end, label %for.body
23
24for.end:                                          ; preds = %for.body, %entry
25  ret void
26}
27
28declare float @llvm.sqrt.f32(float)
29
30define void @sqrt_f64(i32 %n, ptr %y, ptr %x) {
31; CHECK-LABEL: @sqrt_f64(
32; CHECK: llvm.sqrt.v4f64
33; CHECK: ret void
34;
35entry:
36  %cmp6 = icmp sgt i32 %n, 0
37  br i1 %cmp6, label %for.body, label %for.end
38
39for.body:                                         ; preds = %entry, %for.body
40  %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
41  %arrayidx = getelementptr inbounds double, ptr %y, i64 %indvars.iv
42  %0 = load double, ptr %arrayidx, align 8
43  %call = tail call double @llvm.sqrt.f64(double %0)
44  %arrayidx2 = getelementptr inbounds double, ptr %x, i64 %indvars.iv
45  store double %call, ptr %arrayidx2, align 8
46  %indvars.iv.next = add i64 %indvars.iv, 1
47  %lftr.wideiv = trunc i64 %indvars.iv.next to i32
48  %exitcond = icmp eq i32 %lftr.wideiv, %n
49  br i1 %exitcond, label %for.end, label %for.body
50
51for.end:                                          ; preds = %for.body, %entry
52  ret void
53}
54
55declare double @llvm.sqrt.f64(double)
56
57define void @sin_f32(i32 %n, ptr %y, ptr %x) {
58; CHECK-LABEL: @sin_f32(
59; CHECK: llvm.sin.v4f32
60; CHECK: ret void
61;
62entry:
63  %cmp6 = icmp sgt i32 %n, 0
64  br i1 %cmp6, label %for.body, label %for.end
65
66for.body:                                         ; preds = %entry, %for.body
67  %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
68  %arrayidx = getelementptr inbounds float, ptr %y, i64 %indvars.iv
69  %0 = load float, ptr %arrayidx, align 4
70  %call = tail call float @llvm.sin.f32(float %0)
71  %arrayidx2 = getelementptr inbounds float, ptr %x, i64 %indvars.iv
72  store float %call, ptr %arrayidx2, align 4
73  %indvars.iv.next = add i64 %indvars.iv, 1
74  %lftr.wideiv = trunc i64 %indvars.iv.next to i32
75  %exitcond = icmp eq i32 %lftr.wideiv, %n
76  br i1 %exitcond, label %for.end, label %for.body
77
78for.end:                                          ; preds = %for.body, %entry
79  ret void
80}
81
82declare float @llvm.sin.f32(float)
83
84define void @sin_f64(i32 %n, ptr %y, ptr %x) {
85; CHECK-LABEL: @sin_f64(
86; CHECK: llvm.sin.v4f64
87; CHECK: ret void
88;
89entry:
90  %cmp6 = icmp sgt i32 %n, 0
91  br i1 %cmp6, label %for.body, label %for.end
92
93for.body:                                         ; preds = %entry, %for.body
94  %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
95  %arrayidx = getelementptr inbounds double, ptr %y, i64 %indvars.iv
96  %0 = load double, ptr %arrayidx, align 8
97  %call = tail call double @llvm.sin.f64(double %0)
98  %arrayidx2 = getelementptr inbounds double, ptr %x, i64 %indvars.iv
99  store double %call, ptr %arrayidx2, align 8
100  %indvars.iv.next = add i64 %indvars.iv, 1
101  %lftr.wideiv = trunc i64 %indvars.iv.next to i32
102  %exitcond = icmp eq i32 %lftr.wideiv, %n
103  br i1 %exitcond, label %for.end, label %for.body
104
105for.end:                                          ; preds = %for.body, %entry
106  ret void
107}
108
109declare double @llvm.sin.f64(double)
110
111define void @cos_f32(i32 %n, ptr %y, ptr %x) {
112; CHECK-LABEL: @cos_f32(
113; CHECK: llvm.cos.v4f32
114; CHECK: ret void
115;
116entry:
117  %cmp6 = icmp sgt i32 %n, 0
118  br i1 %cmp6, label %for.body, label %for.end
119
120for.body:                                         ; preds = %entry, %for.body
121  %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
122  %arrayidx = getelementptr inbounds float, ptr %y, i64 %indvars.iv
123  %0 = load float, ptr %arrayidx, align 4
124  %call = tail call float @llvm.cos.f32(float %0)
125  %arrayidx2 = getelementptr inbounds float, ptr %x, i64 %indvars.iv
126  store float %call, ptr %arrayidx2, align 4
127  %indvars.iv.next = add i64 %indvars.iv, 1
128  %lftr.wideiv = trunc i64 %indvars.iv.next to i32
129  %exitcond = icmp eq i32 %lftr.wideiv, %n
130  br i1 %exitcond, label %for.end, label %for.body
131
132for.end:                                          ; preds = %for.body, %entry
133  ret void
134}
135
136declare float @llvm.cos.f32(float)
137
138define void @cos_f64(i32 %n, ptr %y, ptr %x) {
139; CHECK-LABEL: @cos_f64(
140; CHECK: llvm.cos.v4f64
141; CHECK: ret void
142;
143entry:
144  %cmp6 = icmp sgt i32 %n, 0
145  br i1 %cmp6, label %for.body, label %for.end
146
147for.body:                                         ; preds = %entry, %for.body
148  %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
149  %arrayidx = getelementptr inbounds double, ptr %y, i64 %indvars.iv
150  %0 = load double, ptr %arrayidx, align 8
151  %call = tail call double @llvm.cos.f64(double %0)
152  %arrayidx2 = getelementptr inbounds double, ptr %x, i64 %indvars.iv
153  store double %call, ptr %arrayidx2, align 8
154  %indvars.iv.next = add i64 %indvars.iv, 1
155  %lftr.wideiv = trunc i64 %indvars.iv.next to i32
156  %exitcond = icmp eq i32 %lftr.wideiv, %n
157  br i1 %exitcond, label %for.end, label %for.body
158
159for.end:                                          ; preds = %for.body, %entry
160  ret void
161}
162
163declare double @llvm.cos.f64(double)
164
165define void @tan_f32(i32 %n, ptr %y, ptr %x) {
166; CHECK-LABEL: @tan_f32(
167; CHECK: llvm.tan.v4f32
168; CHECK: ret void
169;
170entry:
171  %cmp6 = icmp sgt i32 %n, 0
172  br i1 %cmp6, label %for.body, label %for.end
173
174for.body:                                         ; preds = %entry, %for.body
175  %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
176  %arrayidx = getelementptr inbounds float, ptr %y, i64 %indvars.iv
177  %0 = load float, ptr %arrayidx, align 4
178  %call = tail call float @llvm.tan.f32(float %0)
179  %arrayidx2 = getelementptr inbounds float, ptr %x, i64 %indvars.iv
180  store float %call, ptr %arrayidx2, align 4
181  %indvars.iv.next = add i64 %indvars.iv, 1
182  %lftr.wideiv = trunc i64 %indvars.iv.next to i32
183  %exitcond = icmp eq i32 %lftr.wideiv, %n
184  br i1 %exitcond, label %for.end, label %for.body
185
186for.end:                                          ; preds = %for.body, %entry
187  ret void
188}
189
190declare float @llvm.tan.f32(float)
191
192define void @tan_f64(i32 %n, ptr %y, ptr %x) {
193; CHECK-LABEL: @tan_f64(
194; CHECK: llvm.tan.v4f64
195; CHECK: ret void
196;
197entry:
198  %cmp6 = icmp sgt i32 %n, 0
199  br i1 %cmp6, label %for.body, label %for.end
200
201for.body:                                         ; preds = %entry, %for.body
202  %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
203  %arrayidx = getelementptr inbounds double, ptr %y, i64 %indvars.iv
204  %0 = load double, ptr %arrayidx, align 8
205  %call = tail call double @llvm.tan.f64(double %0)
206  %arrayidx2 = getelementptr inbounds double, ptr %x, i64 %indvars.iv
207  store double %call, ptr %arrayidx2, align 8
208  %indvars.iv.next = add i64 %indvars.iv, 1
209  %lftr.wideiv = trunc i64 %indvars.iv.next to i32
210  %exitcond = icmp eq i32 %lftr.wideiv, %n
211  br i1 %exitcond, label %for.end, label %for.body
212
213for.end:                                          ; preds = %for.body, %entry
214  ret void
215}
216
217declare double @llvm.tan.f64(double)
218
219define void @exp_f32(i32 %n, ptr %y, ptr %x) {
220; CHECK-LABEL: @exp_f32(
221; CHECK: llvm.exp.v4f32
222; CHECK: ret void
223;
224entry:
225  %cmp6 = icmp sgt i32 %n, 0
226  br i1 %cmp6, label %for.body, label %for.end
227
228for.body:                                         ; preds = %entry, %for.body
229  %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
230  %arrayidx = getelementptr inbounds float, ptr %y, i64 %indvars.iv
231  %0 = load float, ptr %arrayidx, align 4
232  %call = tail call float @llvm.exp.f32(float %0)
233  %arrayidx2 = getelementptr inbounds float, ptr %x, i64 %indvars.iv
234  store float %call, ptr %arrayidx2, align 4
235  %indvars.iv.next = add i64 %indvars.iv, 1
236  %lftr.wideiv = trunc i64 %indvars.iv.next to i32
237  %exitcond = icmp eq i32 %lftr.wideiv, %n
238  br i1 %exitcond, label %for.end, label %for.body
239
240for.end:                                          ; preds = %for.body, %entry
241  ret void
242}
243
244declare float @llvm.exp.f32(float)
245
246define void @exp_f64(i32 %n, ptr %y, ptr %x) {
247; CHECK-LABEL: @exp_f64(
248; CHECK: llvm.exp.v4f64
249; CHECK: ret void
250;
251entry:
252  %cmp6 = icmp sgt i32 %n, 0
253  br i1 %cmp6, label %for.body, label %for.end
254
255for.body:                                         ; preds = %entry, %for.body
256  %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
257  %arrayidx = getelementptr inbounds double, ptr %y, i64 %indvars.iv
258  %0 = load double, ptr %arrayidx, align 8
259  %call = tail call double @llvm.exp.f64(double %0)
260  %arrayidx2 = getelementptr inbounds double, ptr %x, i64 %indvars.iv
261  store double %call, ptr %arrayidx2, align 8
262  %indvars.iv.next = add i64 %indvars.iv, 1
263  %lftr.wideiv = trunc i64 %indvars.iv.next to i32
264  %exitcond = icmp eq i32 %lftr.wideiv, %n
265  br i1 %exitcond, label %for.end, label %for.body
266
267for.end:                                          ; preds = %for.body, %entry
268  ret void
269}
270
271declare double @llvm.exp.f64(double)
272
273define void @exp2_f32(i32 %n, ptr %y, ptr %x) {
274; CHECK-LABEL: @exp2_f32(
275; CHECK: llvm.exp2.v4f32
276; CHECK: ret void
277;
278entry:
279  %cmp6 = icmp sgt i32 %n, 0
280  br i1 %cmp6, label %for.body, label %for.end
281
282for.body:                                         ; preds = %entry, %for.body
283  %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
284  %arrayidx = getelementptr inbounds float, ptr %y, i64 %indvars.iv
285  %0 = load float, ptr %arrayidx, align 4
286  %call = tail call float @llvm.exp2.f32(float %0)
287  %arrayidx2 = getelementptr inbounds float, ptr %x, i64 %indvars.iv
288  store float %call, ptr %arrayidx2, align 4
289  %indvars.iv.next = add i64 %indvars.iv, 1
290  %lftr.wideiv = trunc i64 %indvars.iv.next to i32
291  %exitcond = icmp eq i32 %lftr.wideiv, %n
292  br i1 %exitcond, label %for.end, label %for.body
293
294for.end:                                          ; preds = %for.body, %entry
295  ret void
296}
297
298declare float @llvm.exp2.f32(float)
299
300define void @exp2_f64(i32 %n, ptr %y, ptr %x) {
301; CHECK-LABEL: @exp2_f64(
302; CHECK: llvm.exp2.v4f64
303; CHECK: ret void
304;
305entry:
306  %cmp6 = icmp sgt i32 %n, 0
307  br i1 %cmp6, label %for.body, label %for.end
308
309for.body:                                         ; preds = %entry, %for.body
310  %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
311  %arrayidx = getelementptr inbounds double, ptr %y, i64 %indvars.iv
312  %0 = load double, ptr %arrayidx, align 8
313  %call = tail call double @llvm.exp2.f64(double %0)
314  %arrayidx2 = getelementptr inbounds double, ptr %x, i64 %indvars.iv
315  store double %call, ptr %arrayidx2, align 8
316  %indvars.iv.next = add i64 %indvars.iv, 1
317  %lftr.wideiv = trunc i64 %indvars.iv.next to i32
318  %exitcond = icmp eq i32 %lftr.wideiv, %n
319  br i1 %exitcond, label %for.end, label %for.body
320
321for.end:                                          ; preds = %for.body, %entry
322  ret void
323}
324
325declare double @llvm.exp2.f64(double)
326
327define void @log_f32(i32 %n, ptr %y, ptr %x) {
328; CHECK-LABEL: @log_f32(
329; CHECK: llvm.log.v4f32
330; CHECK: ret void
331;
332entry:
333  %cmp6 = icmp sgt i32 %n, 0
334  br i1 %cmp6, label %for.body, label %for.end
335
336for.body:                                         ; preds = %entry, %for.body
337  %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
338  %arrayidx = getelementptr inbounds float, ptr %y, i64 %indvars.iv
339  %0 = load float, ptr %arrayidx, align 4
340  %call = tail call float @llvm.log.f32(float %0)
341  %arrayidx2 = getelementptr inbounds float, ptr %x, i64 %indvars.iv
342  store float %call, ptr %arrayidx2, align 4
343  %indvars.iv.next = add i64 %indvars.iv, 1
344  %lftr.wideiv = trunc i64 %indvars.iv.next to i32
345  %exitcond = icmp eq i32 %lftr.wideiv, %n
346  br i1 %exitcond, label %for.end, label %for.body
347
348for.end:                                          ; preds = %for.body, %entry
349  ret void
350}
351
352declare float @llvm.log.f32(float)
353
354define void @log_f64(i32 %n, ptr %y, ptr %x) {
355; CHECK-LABEL: @log_f64(
356; CHECK: llvm.log.v4f64
357; CHECK: ret void
358;
359entry:
360  %cmp6 = icmp sgt i32 %n, 0
361  br i1 %cmp6, label %for.body, label %for.end
362
363for.body:                                         ; preds = %entry, %for.body
364  %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
365  %arrayidx = getelementptr inbounds double, ptr %y, i64 %indvars.iv
366  %0 = load double, ptr %arrayidx, align 8
367  %call = tail call double @llvm.log.f64(double %0)
368  %arrayidx2 = getelementptr inbounds double, ptr %x, i64 %indvars.iv
369  store double %call, ptr %arrayidx2, align 8
370  %indvars.iv.next = add i64 %indvars.iv, 1
371  %lftr.wideiv = trunc i64 %indvars.iv.next to i32
372  %exitcond = icmp eq i32 %lftr.wideiv, %n
373  br i1 %exitcond, label %for.end, label %for.body
374
375for.end:                                          ; preds = %for.body, %entry
376  ret void
377}
378
379declare double @llvm.log.f64(double)
380
381define void @log10_f32(i32 %n, ptr %y, ptr %x) {
382; CHECK-LABEL: @log10_f32(
383; CHECK: llvm.log10.v4f32
384; CHECK: ret void
385;
386entry:
387  %cmp6 = icmp sgt i32 %n, 0
388  br i1 %cmp6, label %for.body, label %for.end
389
390for.body:                                         ; preds = %entry, %for.body
391  %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
392  %arrayidx = getelementptr inbounds float, ptr %y, i64 %indvars.iv
393  %0 = load float, ptr %arrayidx, align 4
394  %call = tail call float @llvm.log10.f32(float %0)
395  %arrayidx2 = getelementptr inbounds float, ptr %x, i64 %indvars.iv
396  store float %call, ptr %arrayidx2, align 4
397  %indvars.iv.next = add i64 %indvars.iv, 1
398  %lftr.wideiv = trunc i64 %indvars.iv.next to i32
399  %exitcond = icmp eq i32 %lftr.wideiv, %n
400  br i1 %exitcond, label %for.end, label %for.body
401
402for.end:                                          ; preds = %for.body, %entry
403  ret void
404}
405
406declare float @llvm.log10.f32(float)
407
408define void @log10_f64(i32 %n, ptr %y, ptr %x) {
409; CHECK-LABEL: @log10_f64(
410; CHECK: llvm.log10.v4f64
411; CHECK: ret void
412;
413entry:
414  %cmp6 = icmp sgt i32 %n, 0
415  br i1 %cmp6, label %for.body, label %for.end
416
417for.body:                                         ; preds = %entry, %for.body
418  %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
419  %arrayidx = getelementptr inbounds double, ptr %y, i64 %indvars.iv
420  %0 = load double, ptr %arrayidx, align 8
421  %call = tail call double @llvm.log10.f64(double %0)
422  %arrayidx2 = getelementptr inbounds double, ptr %x, i64 %indvars.iv
423  store double %call, ptr %arrayidx2, align 8
424  %indvars.iv.next = add i64 %indvars.iv, 1
425  %lftr.wideiv = trunc i64 %indvars.iv.next to i32
426  %exitcond = icmp eq i32 %lftr.wideiv, %n
427  br i1 %exitcond, label %for.end, label %for.body
428
429for.end:                                          ; preds = %for.body, %entry
430  ret void
431}
432
433declare double @llvm.log10.f64(double)
434
435define void @log2_f32(i32 %n, ptr %y, ptr %x) {
436; CHECK-LABEL: @log2_f32(
437; CHECK: llvm.log2.v4f32
438; CHECK: ret void
439;
440entry:
441  %cmp6 = icmp sgt i32 %n, 0
442  br i1 %cmp6, label %for.body, label %for.end
443
444for.body:                                         ; preds = %entry, %for.body
445  %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
446  %arrayidx = getelementptr inbounds float, ptr %y, i64 %indvars.iv
447  %0 = load float, ptr %arrayidx, align 4
448  %call = tail call float @llvm.log2.f32(float %0)
449  %arrayidx2 = getelementptr inbounds float, ptr %x, i64 %indvars.iv
450  store float %call, ptr %arrayidx2, align 4
451  %indvars.iv.next = add i64 %indvars.iv, 1
452  %lftr.wideiv = trunc i64 %indvars.iv.next to i32
453  %exitcond = icmp eq i32 %lftr.wideiv, %n
454  br i1 %exitcond, label %for.end, label %for.body
455
456for.end:                                          ; preds = %for.body, %entry
457  ret void
458}
459
460declare float @llvm.log2.f32(float)
461
462define void @log2_f64(i32 %n, ptr %y, ptr %x) {
463; CHECK-LABEL: @log2_f64(
464; CHECK: llvm.log2.v4f64
465; CHECK: ret void
466;
467entry:
468  %cmp6 = icmp sgt i32 %n, 0
469  br i1 %cmp6, label %for.body, label %for.end
470
471for.body:                                         ; preds = %entry, %for.body
472  %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
473  %arrayidx = getelementptr inbounds double, ptr %y, i64 %indvars.iv
474  %0 = load double, ptr %arrayidx, align 8
475  %call = tail call double @llvm.log2.f64(double %0)
476  %arrayidx2 = getelementptr inbounds double, ptr %x, i64 %indvars.iv
477  store double %call, ptr %arrayidx2, align 8
478  %indvars.iv.next = add i64 %indvars.iv, 1
479  %lftr.wideiv = trunc i64 %indvars.iv.next to i32
480  %exitcond = icmp eq i32 %lftr.wideiv, %n
481  br i1 %exitcond, label %for.end, label %for.body
482
483for.end:                                          ; preds = %for.body, %entry
484  ret void
485}
486
487declare double @llvm.log2.f64(double)
488
489define void @fabs_f32(i32 %n, ptr %y, ptr %x) {
490; CHECK-LABEL: @fabs_f32(
491; CHECK: llvm.fabs.v4f32
492; CHECK: ret void
493;
494entry:
495  %cmp6 = icmp sgt i32 %n, 0
496  br i1 %cmp6, label %for.body, label %for.end
497
498for.body:                                         ; preds = %entry, %for.body
499  %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
500  %arrayidx = getelementptr inbounds float, ptr %y, i64 %indvars.iv
501  %0 = load float, ptr %arrayidx, align 4
502  %call = tail call float @llvm.fabs.f32(float %0)
503  %arrayidx2 = getelementptr inbounds float, ptr %x, i64 %indvars.iv
504  store float %call, ptr %arrayidx2, align 4
505  %indvars.iv.next = add i64 %indvars.iv, 1
506  %lftr.wideiv = trunc i64 %indvars.iv.next to i32
507  %exitcond = icmp eq i32 %lftr.wideiv, %n
508  br i1 %exitcond, label %for.end, label %for.body
509
510for.end:                                          ; preds = %for.body, %entry
511  ret void
512}
513
514declare float @llvm.fabs.f32(float)
515
516define void @fabs_f64(i32 %n, ptr %y, ptr %x) {
517; CHECK-LABEL: @fabs_f64(
518; CHECK: llvm.fabs.v4f64
519; CHECK: ret void
520;
521entry:
522  %cmp6 = icmp sgt i32 %n, 0
523  br i1 %cmp6, label %for.body, label %for.end
524
525for.body:                                         ; preds = %entry, %for.body
526  %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
527  %arrayidx = getelementptr inbounds double, ptr %y, i64 %indvars.iv
528  %0 = load double, ptr %arrayidx, align 8
529  %call = tail call double @llvm.fabs(double %0)
530  %arrayidx2 = getelementptr inbounds double, ptr %x, i64 %indvars.iv
531  store double %call, ptr %arrayidx2, align 8
532  %indvars.iv.next = add i64 %indvars.iv, 1
533  %lftr.wideiv = trunc i64 %indvars.iv.next to i32
534  %exitcond = icmp eq i32 %lftr.wideiv, %n
535  br i1 %exitcond, label %for.end, label %for.body
536
537for.end:                                          ; preds = %for.body, %entry
538  ret void
539}
540
541declare double @llvm.fabs(double)
542
543define void @copysign_f32(i32 %n, ptr %y, ptr %x, ptr %z) {
544; CHECK-LABEL: @copysign_f32(
545; CHECK: llvm.copysign.v4f32
546; CHECK: ret void
547;
548entry:
549  %cmp6 = icmp sgt i32 %n, 0
550  br i1 %cmp6, label %for.body, label %for.end
551
552for.body:                                         ; preds = %entry, %for.body
553  %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
554  %arrayidx = getelementptr inbounds float, ptr %y, i64 %indvars.iv
555  %0 = load float, ptr %arrayidx, align 4
556  %arrayidx1 = getelementptr inbounds float, ptr %z, i64 %indvars.iv
557  %1 = load float, ptr %arrayidx1, align 4
558  %call = tail call float @llvm.copysign.f32(float %0, float %1)
559  %arrayidx2 = getelementptr inbounds float, ptr %x, i64 %indvars.iv
560  store float %call, ptr %arrayidx2, align 4
561  %indvars.iv.next = add i64 %indvars.iv, 1
562  %lftr.wideiv = trunc i64 %indvars.iv.next to i32
563  %exitcond = icmp eq i32 %lftr.wideiv, %n
564  br i1 %exitcond, label %for.end, label %for.body
565
566for.end:                                          ; preds = %for.body, %entry
567  ret void
568}
569
570declare float @llvm.copysign.f32(float, float)
571
572define void @copysign_f64(i32 %n, ptr %y, ptr %x, ptr %z) {
573; CHECK-LABEL: @copysign_f64(
574; CHECK: llvm.copysign.v4f64
575; CHECK: ret void
576;
577entry:
578  %cmp6 = icmp sgt i32 %n, 0
579  br i1 %cmp6, label %for.body, label %for.end
580
581for.body:                                         ; preds = %entry, %for.body
582  %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
583  %arrayidx = getelementptr inbounds double, ptr %y, i64 %indvars.iv
584  %0 = load double, ptr %arrayidx, align 8
585  %arrayidx1 = getelementptr inbounds double, ptr %z, i64 %indvars.iv
586  %1 = load double, ptr %arrayidx1, align 8
587  %call = tail call double @llvm.copysign(double %0, double %1)
588  %arrayidx2 = getelementptr inbounds double, ptr %x, i64 %indvars.iv
589  store double %call, ptr %arrayidx2, align 8
590  %indvars.iv.next = add i64 %indvars.iv, 1
591  %lftr.wideiv = trunc i64 %indvars.iv.next to i32
592  %exitcond = icmp eq i32 %lftr.wideiv, %n
593  br i1 %exitcond, label %for.end, label %for.body
594
595for.end:                                          ; preds = %for.body, %entry
596  ret void
597}
598
599declare double @llvm.copysign(double, double)
600
601define void @floor_f32(i32 %n, ptr %y, ptr %x) {
602; CHECK-LABEL: @floor_f32(
603; CHECK: llvm.floor.v4f32
604; CHECK: ret void
605;
606entry:
607  %cmp6 = icmp sgt i32 %n, 0
608  br i1 %cmp6, label %for.body, label %for.end
609
610for.body:                                         ; preds = %entry, %for.body
611  %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
612  %arrayidx = getelementptr inbounds float, ptr %y, i64 %indvars.iv
613  %0 = load float, ptr %arrayidx, align 4
614  %call = tail call float @llvm.floor.f32(float %0)
615  %arrayidx2 = getelementptr inbounds float, ptr %x, i64 %indvars.iv
616  store float %call, ptr %arrayidx2, align 4
617  %indvars.iv.next = add i64 %indvars.iv, 1
618  %lftr.wideiv = trunc i64 %indvars.iv.next to i32
619  %exitcond = icmp eq i32 %lftr.wideiv, %n
620  br i1 %exitcond, label %for.end, label %for.body
621
622for.end:                                          ; preds = %for.body, %entry
623  ret void
624}
625
626declare float @llvm.floor.f32(float)
627
628define void @floor_f64(i32 %n, ptr %y, ptr %x) {
629; CHECK-LABEL: @floor_f64(
630; CHECK: llvm.floor.v4f64
631; CHECK: ret void
632;
633entry:
634  %cmp6 = icmp sgt i32 %n, 0
635  br i1 %cmp6, label %for.body, label %for.end
636
637for.body:                                         ; preds = %entry, %for.body
638  %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
639  %arrayidx = getelementptr inbounds double, ptr %y, i64 %indvars.iv
640  %0 = load double, ptr %arrayidx, align 8
641  %call = tail call double @llvm.floor.f64(double %0)
642  %arrayidx2 = getelementptr inbounds double, ptr %x, i64 %indvars.iv
643  store double %call, ptr %arrayidx2, align 8
644  %indvars.iv.next = add i64 %indvars.iv, 1
645  %lftr.wideiv = trunc i64 %indvars.iv.next to i32
646  %exitcond = icmp eq i32 %lftr.wideiv, %n
647  br i1 %exitcond, label %for.end, label %for.body
648
649for.end:                                          ; preds = %for.body, %entry
650  ret void
651}
652
653declare double @llvm.floor.f64(double)
654
655define void @ceil_f32(i32 %n, ptr %y, ptr %x) {
656; CHECK-LABEL: @ceil_f32(
657; CHECK: llvm.ceil.v4f32
658; CHECK: ret void
659;
660entry:
661  %cmp6 = icmp sgt i32 %n, 0
662  br i1 %cmp6, label %for.body, label %for.end
663
664for.body:                                         ; preds = %entry, %for.body
665  %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
666  %arrayidx = getelementptr inbounds float, ptr %y, i64 %indvars.iv
667  %0 = load float, ptr %arrayidx, align 4
668  %call = tail call float @llvm.ceil.f32(float %0)
669  %arrayidx2 = getelementptr inbounds float, ptr %x, i64 %indvars.iv
670  store float %call, ptr %arrayidx2, align 4
671  %indvars.iv.next = add i64 %indvars.iv, 1
672  %lftr.wideiv = trunc i64 %indvars.iv.next to i32
673  %exitcond = icmp eq i32 %lftr.wideiv, %n
674  br i1 %exitcond, label %for.end, label %for.body
675
676for.end:                                          ; preds = %for.body, %entry
677  ret void
678}
679
680declare float @llvm.ceil.f32(float)
681
682define void @ceil_f64(i32 %n, ptr %y, ptr %x) {
683; CHECK-LABEL: @ceil_f64(
684; CHECK: llvm.ceil.v4f64
685; CHECK: ret void
686;
687entry:
688  %cmp6 = icmp sgt i32 %n, 0
689  br i1 %cmp6, label %for.body, label %for.end
690
691for.body:                                         ; preds = %entry, %for.body
692  %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
693  %arrayidx = getelementptr inbounds double, ptr %y, i64 %indvars.iv
694  %0 = load double, ptr %arrayidx, align 8
695  %call = tail call double @llvm.ceil.f64(double %0)
696  %arrayidx2 = getelementptr inbounds double, ptr %x, i64 %indvars.iv
697  store double %call, ptr %arrayidx2, align 8
698  %indvars.iv.next = add i64 %indvars.iv, 1
699  %lftr.wideiv = trunc i64 %indvars.iv.next to i32
700  %exitcond = icmp eq i32 %lftr.wideiv, %n
701  br i1 %exitcond, label %for.end, label %for.body
702
703for.end:                                          ; preds = %for.body, %entry
704  ret void
705}
706
707declare double @llvm.ceil.f64(double)
708
709define void @trunc_f32(i32 %n, ptr %y, ptr %x) {
710; CHECK-LABEL: @trunc_f32(
711; CHECK: llvm.trunc.v4f32
712; CHECK: ret void
713;
714entry:
715  %cmp6 = icmp sgt i32 %n, 0
716  br i1 %cmp6, label %for.body, label %for.end
717
718for.body:                                         ; preds = %entry, %for.body
719  %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
720  %arrayidx = getelementptr inbounds float, ptr %y, i64 %indvars.iv
721  %0 = load float, ptr %arrayidx, align 4
722  %call = tail call float @llvm.trunc.f32(float %0)
723  %arrayidx2 = getelementptr inbounds float, ptr %x, i64 %indvars.iv
724  store float %call, ptr %arrayidx2, align 4
725  %indvars.iv.next = add i64 %indvars.iv, 1
726  %lftr.wideiv = trunc i64 %indvars.iv.next to i32
727  %exitcond = icmp eq i32 %lftr.wideiv, %n
728  br i1 %exitcond, label %for.end, label %for.body
729
730for.end:                                          ; preds = %for.body, %entry
731  ret void
732}
733
734declare float @llvm.trunc.f32(float)
735
736define void @trunc_f64(i32 %n, ptr %y, ptr %x) {
737; CHECK-LABEL: @trunc_f64(
738; CHECK: llvm.trunc.v4f64
739; CHECK: ret void
740;
741entry:
742  %cmp6 = icmp sgt i32 %n, 0
743  br i1 %cmp6, label %for.body, label %for.end
744
745for.body:                                         ; preds = %entry, %for.body
746  %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
747  %arrayidx = getelementptr inbounds double, ptr %y, i64 %indvars.iv
748  %0 = load double, ptr %arrayidx, align 8
749  %call = tail call double @llvm.trunc.f64(double %0)
750  %arrayidx2 = getelementptr inbounds double, ptr %x, i64 %indvars.iv
751  store double %call, ptr %arrayidx2, align 8
752  %indvars.iv.next = add i64 %indvars.iv, 1
753  %lftr.wideiv = trunc i64 %indvars.iv.next to i32
754  %exitcond = icmp eq i32 %lftr.wideiv, %n
755  br i1 %exitcond, label %for.end, label %for.body
756
757for.end:                                          ; preds = %for.body, %entry
758  ret void
759}
760
761declare double @llvm.trunc.f64(double)
762
763define void @rint_f32(i32 %n, ptr %y, ptr %x) {
764; CHECK-LABEL: @rint_f32(
765; CHECK: llvm.rint.v4f32
766; CHECK: ret void
767;
768entry:
769  %cmp6 = icmp sgt i32 %n, 0
770  br i1 %cmp6, label %for.body, label %for.end
771
772for.body:                                         ; preds = %entry, %for.body
773  %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
774  %arrayidx = getelementptr inbounds float, ptr %y, i64 %indvars.iv
775  %0 = load float, ptr %arrayidx, align 4
776  %call = tail call float @llvm.rint.f32(float %0)
777  %arrayidx2 = getelementptr inbounds float, ptr %x, i64 %indvars.iv
778  store float %call, ptr %arrayidx2, align 4
779  %indvars.iv.next = add i64 %indvars.iv, 1
780  %lftr.wideiv = trunc i64 %indvars.iv.next to i32
781  %exitcond = icmp eq i32 %lftr.wideiv, %n
782  br i1 %exitcond, label %for.end, label %for.body
783
784for.end:                                          ; preds = %for.body, %entry
785  ret void
786}
787
788declare float @llvm.rint.f32(float)
789
790define void @rint_f64(i32 %n, ptr %y, ptr %x) {
791; CHECK-LABEL: @rint_f64(
792; CHECK: llvm.rint.v4f64
793; CHECK: ret void
794;
795entry:
796  %cmp6 = icmp sgt i32 %n, 0
797  br i1 %cmp6, label %for.body, label %for.end
798
799for.body:                                         ; preds = %entry, %for.body
800  %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
801  %arrayidx = getelementptr inbounds double, ptr %y, i64 %indvars.iv
802  %0 = load double, ptr %arrayidx, align 8
803  %call = tail call double @llvm.rint.f64(double %0)
804  %arrayidx2 = getelementptr inbounds double, ptr %x, i64 %indvars.iv
805  store double %call, ptr %arrayidx2, align 8
806  %indvars.iv.next = add i64 %indvars.iv, 1
807  %lftr.wideiv = trunc i64 %indvars.iv.next to i32
808  %exitcond = icmp eq i32 %lftr.wideiv, %n
809  br i1 %exitcond, label %for.end, label %for.body
810
811for.end:                                          ; preds = %for.body, %entry
812  ret void
813}
814
815declare double @llvm.rint.f64(double)
816
817define void @nearbyint_f32(i32 %n, ptr %y, ptr %x) {
818; CHECK-LABEL: @nearbyint_f32(
819; CHECK: llvm.nearbyint.v4f32
820; CHECK: ret void
821;
822entry:
823  %cmp6 = icmp sgt i32 %n, 0
824  br i1 %cmp6, label %for.body, label %for.end
825
826for.body:                                         ; preds = %entry, %for.body
827  %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
828  %arrayidx = getelementptr inbounds float, ptr %y, i64 %indvars.iv
829  %0 = load float, ptr %arrayidx, align 4
830  %call = tail call float @llvm.nearbyint.f32(float %0)
831  %arrayidx2 = getelementptr inbounds float, ptr %x, i64 %indvars.iv
832  store float %call, ptr %arrayidx2, align 4
833  %indvars.iv.next = add i64 %indvars.iv, 1
834  %lftr.wideiv = trunc i64 %indvars.iv.next to i32
835  %exitcond = icmp eq i32 %lftr.wideiv, %n
836  br i1 %exitcond, label %for.end, label %for.body
837
838for.end:                                          ; preds = %for.body, %entry
839  ret void
840}
841
842declare float @llvm.nearbyint.f32(float)
843
844define void @nearbyint_f64(i32 %n, ptr %y, ptr %x) {
845; CHECK-LABEL: @nearbyint_f64(
846; CHECK: llvm.nearbyint.v4f64
847; CHECK: ret void
848;
849entry:
850  %cmp6 = icmp sgt i32 %n, 0
851  br i1 %cmp6, label %for.body, label %for.end
852
853for.body:                                         ; preds = %entry, %for.body
854  %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
855  %arrayidx = getelementptr inbounds double, ptr %y, i64 %indvars.iv
856  %0 = load double, ptr %arrayidx, align 8
857  %call = tail call double @llvm.nearbyint.f64(double %0)
858  %arrayidx2 = getelementptr inbounds double, ptr %x, i64 %indvars.iv
859  store double %call, ptr %arrayidx2, align 8
860  %indvars.iv.next = add i64 %indvars.iv, 1
861  %lftr.wideiv = trunc i64 %indvars.iv.next to i32
862  %exitcond = icmp eq i32 %lftr.wideiv, %n
863  br i1 %exitcond, label %for.end, label %for.body
864
865for.end:                                          ; preds = %for.body, %entry
866  ret void
867}
868
869declare double @llvm.nearbyint.f64(double)
870
871define void @round_f32(i32 %n, ptr %y, ptr %x) {
872; CHECK-LABEL: @round_f32(
873; CHECK: llvm.round.v4f32
874; CHECK: ret void
875;
876entry:
877  %cmp6 = icmp sgt i32 %n, 0
878  br i1 %cmp6, label %for.body, label %for.end
879
880for.body:                                         ; preds = %entry, %for.body
881  %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
882  %arrayidx = getelementptr inbounds float, ptr %y, i64 %indvars.iv
883  %0 = load float, ptr %arrayidx, align 4
884  %call = tail call float @llvm.round.f32(float %0)
885  %arrayidx2 = getelementptr inbounds float, ptr %x, i64 %indvars.iv
886  store float %call, ptr %arrayidx2, align 4
887  %indvars.iv.next = add i64 %indvars.iv, 1
888  %lftr.wideiv = trunc i64 %indvars.iv.next to i32
889  %exitcond = icmp eq i32 %lftr.wideiv, %n
890  br i1 %exitcond, label %for.end, label %for.body
891
892for.end:                                          ; preds = %for.body, %entry
893  ret void
894}
895
896declare float @llvm.round.f32(float)
897
898define void @round_f64(i32 %n, ptr %y, ptr %x) {
899; CHECK-LABEL: @round_f64(
900; CHECK: llvm.round.v4f64
901; CHECK: ret void
902;
903entry:
904  %cmp6 = icmp sgt i32 %n, 0
905  br i1 %cmp6, label %for.body, label %for.end
906
907for.body:                                         ; preds = %entry, %for.body
908  %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
909  %arrayidx = getelementptr inbounds double, ptr %y, i64 %indvars.iv
910  %0 = load double, ptr %arrayidx, align 8
911  %call = tail call double @llvm.round.f64(double %0)
912  %arrayidx2 = getelementptr inbounds double, ptr %x, i64 %indvars.iv
913  store double %call, ptr %arrayidx2, align 8
914  %indvars.iv.next = add i64 %indvars.iv, 1
915  %lftr.wideiv = trunc i64 %indvars.iv.next to i32
916  %exitcond = icmp eq i32 %lftr.wideiv, %n
917  br i1 %exitcond, label %for.end, label %for.body
918
919for.end:                                          ; preds = %for.body, %entry
920  ret void
921}
922
923declare double @llvm.round.f64(double)
924
925define void @roundeven_f32(i32 %n, ptr %y, ptr %x) {
926; CHECK-LABEL: @roundeven_f32(
927; CHECK: llvm.roundeven.v4f32
928; CHECK: ret void
929;
930entry:
931  %cmp6 = icmp sgt i32 %n, 0
932  br i1 %cmp6, label %for.body, label %for.end
933
934for.body:                                         ; preds = %entry, %for.body
935  %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
936  %arrayidx = getelementptr inbounds float, ptr %y, i64 %indvars.iv
937  %0 = load float, ptr %arrayidx, align 4
938  %call = tail call float @llvm.roundeven.f32(float %0)
939  %arrayidx2 = getelementptr inbounds float, ptr %x, i64 %indvars.iv
940  store float %call, ptr %arrayidx2, align 4
941  %indvars.iv.next = add i64 %indvars.iv, 1
942  %lftr.wideiv = trunc i64 %indvars.iv.next to i32
943  %exitcond = icmp eq i32 %lftr.wideiv, %n
944  br i1 %exitcond, label %for.end, label %for.body
945
946for.end:                                          ; preds = %for.body, %entry
947  ret void
948}
949
950declare float @llvm.roundeven.f32(float)
951
952define void @roundeven_f64(i32 %n, ptr %y, ptr %x) {
953; CHECK-LABEL: @roundeven_f64(
954; CHECK: llvm.roundeven.v4f64
955; CHECK: ret void
956;
957entry:
958  %cmp6 = icmp sgt i32 %n, 0
959  br i1 %cmp6, label %for.body, label %for.end
960
961for.body:                                         ; preds = %entry, %for.body
962  %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
963  %arrayidx = getelementptr inbounds double, ptr %y, i64 %indvars.iv
964  %0 = load double, ptr %arrayidx, align 8
965  %call = tail call double @llvm.roundeven.f64(double %0)
966  %arrayidx2 = getelementptr inbounds double, ptr %x, i64 %indvars.iv
967  store double %call, ptr %arrayidx2, align 8
968  %indvars.iv.next = add i64 %indvars.iv, 1
969  %lftr.wideiv = trunc i64 %indvars.iv.next to i32
970  %exitcond = icmp eq i32 %lftr.wideiv, %n
971  br i1 %exitcond, label %for.end, label %for.body
972
973for.end:                                          ; preds = %for.body, %entry
974  ret void
975}
976
977declare double @llvm.roundeven.f64(double)
978
979define void @fma_f32(i32 %n, ptr %y, ptr %x, ptr %z, ptr %w) {
980; CHECK-LABEL: @fma_f32(
981; CHECK: llvm.fma.v4f32
982; CHECK: ret void
983;
984entry:
985  %cmp12 = icmp sgt i32 %n, 0
986  br i1 %cmp12, label %for.body, label %for.end
987
988for.body:                                         ; preds = %entry, %for.body
989  %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
990  %arrayidx = getelementptr inbounds float, ptr %y, i64 %indvars.iv
991  %0 = load float, ptr %arrayidx, align 4
992  %arrayidx2 = getelementptr inbounds float, ptr %w, i64 %indvars.iv
993  %1 = load float, ptr %arrayidx2, align 4
994  %arrayidx4 = getelementptr inbounds float, ptr %z, i64 %indvars.iv
995  %2 = load float, ptr %arrayidx4, align 4
996  %3 = tail call float @llvm.fma.f32(float %0, float %2, float %1)
997  %arrayidx6 = getelementptr inbounds float, ptr %x, i64 %indvars.iv
998  store float %3, ptr %arrayidx6, align 4
999  %indvars.iv.next = add i64 %indvars.iv, 1
1000  %lftr.wideiv = trunc i64 %indvars.iv.next to i32
1001  %exitcond = icmp eq i32 %lftr.wideiv, %n
1002  br i1 %exitcond, label %for.end, label %for.body
1003
1004for.end:                                          ; preds = %for.body, %entry
1005  ret void
1006}
1007
1008declare float @llvm.fma.f32(float, float, float)
1009
1010define void @fma_f64(i32 %n, ptr %y, ptr %x, ptr %z, ptr %w) {
1011; CHECK-LABEL: @fma_f64(
1012; CHECK: llvm.fma.v4f64
1013; CHECK: ret void
1014;
1015entry:
1016  %cmp12 = icmp sgt i32 %n, 0
1017  br i1 %cmp12, label %for.body, label %for.end
1018
1019for.body:                                         ; preds = %entry, %for.body
1020  %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
1021  %arrayidx = getelementptr inbounds double, ptr %y, i64 %indvars.iv
1022  %0 = load double, ptr %arrayidx, align 8
1023  %arrayidx2 = getelementptr inbounds double, ptr %w, i64 %indvars.iv
1024  %1 = load double, ptr %arrayidx2, align 8
1025  %arrayidx4 = getelementptr inbounds double, ptr %z, i64 %indvars.iv
1026  %2 = load double, ptr %arrayidx4, align 8
1027  %3 = tail call double @llvm.fma.f64(double %0, double %2, double %1)
1028  %arrayidx6 = getelementptr inbounds double, ptr %x, i64 %indvars.iv
1029  store double %3, ptr %arrayidx6, align 8
1030  %indvars.iv.next = add i64 %indvars.iv, 1
1031  %lftr.wideiv = trunc i64 %indvars.iv.next to i32
1032  %exitcond = icmp eq i32 %lftr.wideiv, %n
1033  br i1 %exitcond, label %for.end, label %for.body
1034
1035for.end:                                          ; preds = %for.body, %entry
1036  ret void
1037}
1038
1039declare double @llvm.fma.f64(double, double, double)
1040
1041define void @fmuladd_f32(i32 %n, ptr %y, ptr %x, ptr %z, ptr %w) {
1042; CHECK-LABEL: @fmuladd_f32(
1043; CHECK: llvm.fmuladd.v4f32
1044; CHECK: ret void
1045;
1046entry:
1047  %cmp12 = icmp sgt i32 %n, 0
1048  br i1 %cmp12, label %for.body, label %for.end
1049
1050for.body:                                         ; preds = %entry, %for.body
1051  %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
1052  %arrayidx = getelementptr inbounds float, ptr %y, i64 %indvars.iv
1053  %0 = load float, ptr %arrayidx, align 4
1054  %arrayidx2 = getelementptr inbounds float, ptr %w, i64 %indvars.iv
1055  %1 = load float, ptr %arrayidx2, align 4
1056  %arrayidx4 = getelementptr inbounds float, ptr %z, i64 %indvars.iv
1057  %2 = load float, ptr %arrayidx4, align 4
1058  %3 = tail call float @llvm.fmuladd.f32(float %0, float %2, float %1)
1059  %arrayidx6 = getelementptr inbounds float, ptr %x, i64 %indvars.iv
1060  store float %3, ptr %arrayidx6, align 4
1061  %indvars.iv.next = add i64 %indvars.iv, 1
1062  %lftr.wideiv = trunc i64 %indvars.iv.next to i32
1063  %exitcond = icmp eq i32 %lftr.wideiv, %n
1064  br i1 %exitcond, label %for.end, label %for.body
1065
1066for.end:                                          ; preds = %for.body, %entry
1067  ret void
1068}
1069
1070declare float @llvm.fmuladd.f32(float, float, float)
1071
1072define void @fmuladd_f64(i32 %n, ptr %y, ptr %x, ptr %z, ptr %w) {
1073; CHECK-LABEL: @fmuladd_f64(
1074; CHECK: llvm.fmuladd.v4f64
1075; CHECK: ret void
1076;
1077entry:
1078  %cmp12 = icmp sgt i32 %n, 0
1079  br i1 %cmp12, label %for.body, label %for.end
1080
1081for.body:                                         ; preds = %entry, %for.body
1082  %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
1083  %arrayidx = getelementptr inbounds double, ptr %y, i64 %indvars.iv
1084  %0 = load double, ptr %arrayidx, align 8
1085  %arrayidx2 = getelementptr inbounds double, ptr %w, i64 %indvars.iv
1086  %1 = load double, ptr %arrayidx2, align 8
1087  %arrayidx4 = getelementptr inbounds double, ptr %z, i64 %indvars.iv
1088  %2 = load double, ptr %arrayidx4, align 8
1089  %3 = tail call double @llvm.fmuladd.f64(double %0, double %2, double %1)
1090  %arrayidx6 = getelementptr inbounds double, ptr %x, i64 %indvars.iv
1091  store double %3, ptr %arrayidx6, align 8
1092  %indvars.iv.next = add i64 %indvars.iv, 1
1093  %lftr.wideiv = trunc i64 %indvars.iv.next to i32
1094  %exitcond = icmp eq i32 %lftr.wideiv, %n
1095  br i1 %exitcond, label %for.end, label %for.body
1096
1097for.end:                                          ; preds = %for.body, %entry
1098  ret void
1099}
1100
1101declare double @llvm.fmuladd.f64(double, double, double)
1102
1103define void @pow_f32(i32 %n, ptr %y, ptr %x, ptr %z) {
1104; CHECK-LABEL: @pow_f32(
1105; CHECK: llvm.pow.v4f32
1106; CHECK: ret void
1107;
1108entry:
1109  %cmp9 = icmp sgt i32 %n, 0
1110  br i1 %cmp9, label %for.body, label %for.end
1111
1112for.body:                                         ; preds = %entry, %for.body
1113  %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
1114  %arrayidx = getelementptr inbounds float, ptr %y, i64 %indvars.iv
1115  %0 = load float, ptr %arrayidx, align 4
1116  %arrayidx2 = getelementptr inbounds float, ptr %z, i64 %indvars.iv
1117  %1 = load float, ptr %arrayidx2, align 4
1118  %call = tail call float @llvm.pow.f32(float %0, float %1)
1119  %arrayidx4 = getelementptr inbounds float, ptr %x, i64 %indvars.iv
1120  store float %call, ptr %arrayidx4, align 4
1121  %indvars.iv.next = add i64 %indvars.iv, 1
1122  %lftr.wideiv = trunc i64 %indvars.iv.next to i32
1123  %exitcond = icmp eq i32 %lftr.wideiv, %n
1124  br i1 %exitcond, label %for.end, label %for.body
1125
1126for.end:                                          ; preds = %for.body, %entry
1127  ret void
1128}
1129
1130declare float @llvm.pow.f32(float, float)
1131
1132define void @pow_f64(i32 %n, ptr %y, ptr %x, ptr %z) {
1133; CHECK-LABEL: @pow_f64(
1134; CHECK: llvm.pow.v4f64
1135; CHECK: ret void
1136;
1137entry:
1138  %cmp9 = icmp sgt i32 %n, 0
1139  br i1 %cmp9, label %for.body, label %for.end
1140
1141for.body:                                         ; preds = %entry, %for.body
1142  %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
1143  %arrayidx = getelementptr inbounds double, ptr %y, i64 %indvars.iv
1144  %0 = load double, ptr %arrayidx, align 8
1145  %arrayidx2 = getelementptr inbounds double, ptr %z, i64 %indvars.iv
1146  %1 = load double, ptr %arrayidx2, align 8
1147  %call = tail call double @llvm.pow.f64(double %0, double %1)
1148  %arrayidx4 = getelementptr inbounds double, ptr %x, i64 %indvars.iv
1149  store double %call, ptr %arrayidx4, align 8
1150  %indvars.iv.next = add i64 %indvars.iv, 1
1151  %lftr.wideiv = trunc i64 %indvars.iv.next to i32
1152  %exitcond = icmp eq i32 %lftr.wideiv, %n
1153  br i1 %exitcond, label %for.end, label %for.body
1154
1155for.end:                                          ; preds = %for.body, %entry
1156  ret void
1157}
1158
1159define void @fabs_libm(ptr %x) {
1160; CHECK: fabs_libm
1161; CHECK: call <4 x float> @llvm.fabs.v4f32
1162; CHECK: ret void
1163;
1164entry:
1165  br label %for.body
1166
1167for.body:                                         ; preds = %entry, %for.body
1168  %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.body ]
1169  %arrayidx = getelementptr inbounds float, ptr %x, i64 %indvars.iv
1170  %0 = load float, ptr %arrayidx, align 4
1171  %call = tail call float @fabsf(float %0) nounwind readnone
1172  store float %call, ptr %arrayidx, align 4
1173  %indvars.iv.next = add i64 %indvars.iv, 1
1174  %lftr.wideiv = trunc i64 %indvars.iv.next to i32
1175  %exitcond = icmp eq i32 %lftr.wideiv, 1024
1176  br i1 %exitcond, label %for.end, label %for.body
1177
1178for.end:                                          ; preds = %for.body
1179  ret void
1180}
1181
1182declare float @fabsf(float) nounwind readnone
1183
1184declare double @llvm.pow.f64(double, double)
1185
1186; Make sure we don't replace calls to functions with standard library function
1187; signatures but defined with internal linkage.
1188
1189define internal float @roundf(float %x) {
1190  ret float 0.00000000
1191}
1192define void @internal_round(ptr %x) {
1193; CHECK-LABEL: internal_round
1194; CHECK-NOT:  load <4 x float>
1195; CHECK: ret void
1196;
1197entry:
1198  br label %for.body
1199
1200for.body:                                         ; preds = %entry, %for.body
1201  %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.body ]
1202  %arrayidx = getelementptr inbounds float, ptr %x, i64 %indvars.iv
1203  %0 = load float, ptr %arrayidx, align 4
1204  %call = tail call float @roundf(float %0)
1205  store float %call, ptr %arrayidx, align 4
1206  %indvars.iv.next = add i64 %indvars.iv, 1
1207  %lftr.wideiv = trunc i64 %indvars.iv.next to i32
1208  %exitcond = icmp eq i32 %lftr.wideiv, 1024
1209  br i1 %exitcond, label %for.end, label %for.body
1210
1211for.end:                                          ; preds = %for.body
1212  ret void
1213}
1214
1215; Make sure we don't replace calls to functions with standard library names but
1216; different signatures.
1217
1218declare void @round(double %f)
1219
1220define void @wrong_signature(ptr %x) {
1221; CHECK-LABEL: wrong_signature
1222; CHECK-NOT:  load <4 x double>
1223; CHECK: ret void
1224;
1225entry:
1226  br label %for.body
1227
1228for.body:                                         ; preds = %entry, %for.body
1229  %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.body ]
1230  %arrayidx = getelementptr inbounds double, ptr %x, i64 %indvars.iv
1231  %0 = load double, ptr %arrayidx, align 4
1232  store double %0, ptr %arrayidx, align 4
1233  tail call void @round(double %0)
1234  %indvars.iv.next = add i64 %indvars.iv, 1
1235  %lftr.wideiv = trunc i64 %indvars.iv.next to i32
1236  %exitcond = icmp eq i32 %lftr.wideiv, 1024
1237  br i1 %exitcond, label %for.end, label %for.body
1238
1239for.end:                                          ; preds = %for.body
1240  ret void
1241}
1242
1243declare double @llvm.powi.f64.i32(double %Val, i32 %power)
1244
1245define void @powi_f64(i32 %n, ptr %y, ptr %x, i32 %P) {
1246; CHECK-LABEL: @powi_f64(
1247; CHECK: llvm.powi.v4f64
1248; CHECK: ret void
1249;
1250entry:
1251  %cmp9 = icmp sgt i32 %n, 0
1252  br i1 %cmp9, label %for.body, label %for.end
1253
1254for.body:                                         ; preds = %entry, %for.body
1255  %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
1256  %arrayidx = getelementptr inbounds double, ptr %y, i64 %indvars.iv
1257  %0 = load double, ptr %arrayidx, align 8
1258  %call = tail call double @llvm.powi.f64.i32(double %0, i32  %P)
1259  %arrayidx4 = getelementptr inbounds double, ptr %x, i64 %indvars.iv
1260  store double %call, ptr %arrayidx4, align 8
1261  %indvars.iv.next = add i64 %indvars.iv, 1
1262  %lftr.wideiv = trunc i64 %indvars.iv.next to i32
1263  %exitcond = icmp eq i32 %lftr.wideiv, %n
1264  br i1 %exitcond, label %for.end, label %for.body
1265
1266for.end:                                          ; preds = %for.body, %entry
1267  ret void
1268}
1269
1270define void @powi_f64_neg(i32 %n, ptr %y, ptr %x) {
1271; CHECK-LABEL: @powi_f64_neg(
1272; CHECK-NOT: llvm.powi.v4f64
1273; CHECK: ret void
1274;
1275entry:
1276  %cmp9 = icmp sgt i32 %n, 0
1277  br i1 %cmp9, label %for.body, label %for.end
1278
1279for.body:                                         ; preds = %entry, %for.body
1280  %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
1281  %arrayidx = getelementptr inbounds double, ptr %y, i64 %indvars.iv
1282  %0 = load double, ptr %arrayidx, align 8
1283  %1 = trunc i64 %indvars.iv to i32
1284  %call = tail call double @llvm.powi.f64.i32(double %0, i32  %1)
1285  %arrayidx4 = getelementptr inbounds double, ptr %x, i64 %indvars.iv
1286  store double %call, ptr %arrayidx4, align 8
1287  %indvars.iv.next = add i64 %indvars.iv, 1
1288  %lftr.wideiv = trunc i64 %indvars.iv.next to i32
1289  %exitcond = icmp eq i32 %lftr.wideiv, %n
1290  br i1 %exitcond, label %for.end, label %for.body
1291
1292for.end:                                          ; preds = %for.body, %entry
1293  ret void
1294}
1295
1296declare i64  @llvm.cttz.i64 (i64, i1)
1297
1298define void @cttz_f64(i32 %n, ptr %y, ptr %x) {
1299; CHECK-LABEL: @cttz_f64(
1300; CHECK: llvm.cttz.v4i64
1301; CHECK: ret void
1302;
1303entry:
1304  %cmp9 = icmp sgt i32 %n, 0
1305  br i1 %cmp9, label %for.body, label %for.end
1306
1307for.body:                                         ; preds = %entry, %for.body
1308  %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
1309  %arrayidx = getelementptr inbounds i64, ptr %y, i64 %indvars.iv
1310  %0 = load i64, ptr %arrayidx, align 8
1311  %call = tail call i64 @llvm.cttz.i64(i64 %0, i1 true)
1312  %arrayidx4 = getelementptr inbounds i64, ptr %x, i64 %indvars.iv
1313  store i64 %call, ptr %arrayidx4, align 8
1314  %indvars.iv.next = add i64 %indvars.iv, 1
1315  %lftr.wideiv = trunc i64 %indvars.iv.next to i32
1316  %exitcond = icmp eq i32 %lftr.wideiv, %n
1317  br i1 %exitcond, label %for.end, label %for.body
1318
1319for.end:                                          ; preds = %for.body, %entry
1320  ret void
1321}
1322
1323declare i64  @llvm.ctlz.i64 (i64, i1)
1324
1325define void @ctlz_f64(i32 %n, ptr %y, ptr %x) {
1326; CHECK-LABEL: @ctlz_f64(
1327; CHECK: llvm.ctlz.v4i64
1328; CHECK: ret void
1329;
1330entry:
1331  %cmp9 = icmp sgt i32 %n, 0
1332  br i1 %cmp9, label %for.body, label %for.end
1333
1334for.body:                                         ; preds = %entry, %for.body
1335  %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
1336  %arrayidx = getelementptr inbounds i64, ptr %y, i64 %indvars.iv
1337  %0 = load i64, ptr %arrayidx, align 8
1338  %call = tail call i64 @llvm.ctlz.i64(i64 %0, i1 true)
1339  %arrayidx4 = getelementptr inbounds i64, ptr %x, i64 %indvars.iv
1340  store i64 %call, ptr %arrayidx4, align 8
1341  %indvars.iv.next = add i64 %indvars.iv, 1
1342  %lftr.wideiv = trunc i64 %indvars.iv.next to i32
1343  %exitcond = icmp eq i32 %lftr.wideiv, %n
1344  br i1 %exitcond, label %for.end, label %for.body
1345
1346for.end:                                          ; preds = %for.body, %entry
1347  ret void
1348}
1349
1350declare i64 @llvm.abs.i64 (i64, i1)
1351
1352define void @abs_i64(i32 %n, ptr %y, ptr %x) {
1353; CHECK-LABEL: @abs_i64(
1354; CHECK: llvm.abs.v4i64(<4 x i64> [[WIDE_LOADX:%.*]], i1 true)
1355; CHECK: ret void
1356;
1357entry:
1358  %cmp9 = icmp sgt i32 %n, 0
1359  br i1 %cmp9, label %for.body, label %for.end
1360
1361for.body:                                         ; preds = %entry, %for.body
1362  %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
1363  %arrayidx = getelementptr inbounds i64, ptr %y, i64 %indvars.iv
1364  %0 = load i64, ptr %arrayidx, align 8
1365  %call = tail call i64 @llvm.abs.i64(i64 %0, i1 true)
1366  %arrayidx4 = getelementptr inbounds i64, ptr %x, i64 %indvars.iv
1367  store i64 %call, ptr %arrayidx4, align 8
1368  %indvars.iv.next = add i64 %indvars.iv, 1
1369  %lftr.wideiv = trunc i64 %indvars.iv.next to i32
1370  %exitcond = icmp eq i32 %lftr.wideiv, %n
1371  br i1 %exitcond, label %for.end, label %for.body
1372
1373for.end:                                          ; preds = %for.body, %entry
1374  ret void
1375}
1376
1377declare i32 @llvm.smin.i32 (i32, i32)
1378
1379define void @smin_i32(i32 %n, ptr %x, ptr %y) {
1380; CHECK-LABEL: @smin_i32(
1381; CHECK:         call <4 x i32> @llvm.smin.v4i32(<4 x i32> [[WIDE_LOADX:%.*]], <4 x i32> [[WIDE_LOADY:%.*]])
1382; CHECK:         ret void
1383;
1384entry:
1385  %cmp = icmp sgt i32 %n, 0
1386  br i1 %cmp, label %loop, label %end
1387
1388loop:
1389  %iv = phi i32 [ %iv.next, %loop ], [ 0, %entry ]
1390  %xi = getelementptr inbounds i32, ptr %x, i32 %iv
1391  %yi = getelementptr inbounds i32, ptr %y, i32 %iv
1392  %xld = load i32, ptr %xi, align 4
1393  %yld = load i32, ptr %yi, align 4
1394  %call = tail call i32 @llvm.smin.i32(i32 %xld, i32 %yld)
1395  store i32 %call, ptr %xi, align 4
1396  %iv.next = add i32 %iv, 1
1397  %exitcond = icmp eq i32 %iv.next, %n
1398  br i1 %exitcond, label %end, label %loop
1399
1400end:
1401  ret void
1402}
1403
1404declare i32 @llvm.smax.i32 (i32, i32)
1405
1406define void @smax_i32(i32 %n, ptr %x, ptr %y) {
1407; CHECK-LABEL: @smax_i32(
1408; CHECK:         call <4 x i32> @llvm.smax.v4i32(<4 x i32> [[WIDE_LOADX:%.*]], <4 x i32> [[WIDE_LOADY:%.*]])
1409; CHECK:         ret void
1410;
1411entry:
1412  %cmp = icmp sgt i32 %n, 0
1413  br i1 %cmp, label %loop, label %end
1414
1415loop:
1416  %iv = phi i32 [ %iv.next, %loop ], [ 0, %entry ]
1417  %xi = getelementptr inbounds i32, ptr %x, i32 %iv
1418  %yi = getelementptr inbounds i32, ptr %y, i32 %iv
1419  %xld = load i32, ptr %xi, align 4
1420  %yld = load i32, ptr %yi, align 4
1421  %call = tail call i32 @llvm.smax.i32(i32 %xld, i32 %yld)
1422  store i32 %call, ptr %xi, align 4
1423  %iv.next = add i32 %iv, 1
1424  %exitcond = icmp eq i32 %iv.next, %n
1425  br i1 %exitcond, label %end, label %loop
1426
1427end:
1428  ret void
1429}
1430
1431declare i32 @llvm.umin.i32 (i32, i32)
1432
1433define void @umin_i32(i32 %n, ptr %x, ptr %y) {
1434; CHECK-LABEL: @umin_i32(
1435; CHECK:         call <4 x i32> @llvm.umin.v4i32(<4 x i32> [[WIDE_LOADX:%.*]], <4 x i32> [[WIDE_LOADY:%.*]])
1436; CHECK:         ret void
1437;
1438entry:
1439  %cmp = icmp sgt i32 %n, 0
1440  br i1 %cmp, label %loop, label %end
1441
1442loop:
1443  %iv = phi i32 [ %iv.next, %loop ], [ 0, %entry ]
1444  %xi = getelementptr inbounds i32, ptr %x, i32 %iv
1445  %yi = getelementptr inbounds i32, ptr %y, i32 %iv
1446  %xld = load i32, ptr %xi, align 4
1447  %yld = load i32, ptr %yi, align 4
1448  %call = tail call i32 @llvm.umin.i32(i32 %xld, i32 %yld)
1449  store i32 %call, ptr %xi, align 4
1450  %iv.next = add i32 %iv, 1
1451  %exitcond = icmp eq i32 %iv.next, %n
1452  br i1 %exitcond, label %end, label %loop
1453
1454end:
1455  ret void
1456}
1457
1458declare i32 @llvm.umax.i32 (i32, i32)
1459
1460define void @umax_i32(i32 %n, ptr %x, ptr %y) {
1461; CHECK-LABEL: @umax_i32(
1462; CHECK:         call <4 x i32> @llvm.umax.v4i32(<4 x i32> [[WIDE_LOADX:%.*]], <4 x i32> [[WIDE_LOADY:%.*]])
1463; CHECK:         ret void
1464;
1465entry:
1466  %cmp = icmp sgt i32 %n, 0
1467  br i1 %cmp, label %loop, label %end
1468
1469loop:
1470  %iv = phi i32 [ %iv.next, %loop ], [ 0, %entry ]
1471  %xi = getelementptr inbounds i32, ptr %x, i32 %iv
1472  %yi = getelementptr inbounds i32, ptr %y, i32 %iv
1473  %xld = load i32, ptr %xi, align 4
1474  %yld = load i32, ptr %yi, align 4
1475  %call = tail call i32 @llvm.umax.i32(i32 %xld, i32 %yld)
1476  store i32 %call, ptr %xi, align 4
1477  %iv.next = add i32 %iv, 1
1478  %exitcond = icmp eq i32 %iv.next, %n
1479  br i1 %exitcond, label %end, label %loop
1480
1481end:
1482  ret void
1483}
1484
1485declare i32 @llvm.fshl.i32 (i32, i32, i32)
1486
1487define void @fshl_i32(i32 %n, ptr %x, ptr %y, i32 %shAmt) {
1488; CHECK-LABEL: @fshl_i32(
1489; CHECK:         call <4 x i32> @llvm.fshl.v4i32(<4 x i32> [[WIDE_LOADX:%.*]], <4 x i32> [[WIDE_LOADY:%.*]], <4 x i32> [[SPLAT:%.*]])
1490; CHECK:         ret void
1491;
1492entry:
1493  %cmp = icmp sgt i32 %n, 0
1494  br i1 %cmp, label %loop, label %end
1495
1496loop:
1497  %iv = phi i32 [ %iv.next, %loop ], [ 0, %entry ]
1498  %xi = getelementptr inbounds i32, ptr %x, i32 %iv
1499  %yi = getelementptr inbounds i32, ptr %y, i32 %iv
1500  %xld = load i32, ptr %xi, align 4
1501  %yld = load i32, ptr %yi, align 4
1502  %call = tail call i32 @llvm.fshl.i32(i32 %xld, i32 %yld, i32 %shAmt)
1503  store i32 %call, ptr %xi, align 4
1504  %iv.next = add i32 %iv, 1
1505  %exitcond = icmp eq i32 %iv.next, %n
1506  br i1 %exitcond, label %end, label %loop
1507
1508end:
1509  ret void
1510}
1511
1512declare i32 @llvm.fshr.i32 (i32, i32, i32)
1513
1514define void @fshr_i32(i32 %n, ptr %x, ptr %y, i32 %shAmt) {
1515; CHECK-LABEL: @fshr_i32(
1516; CHECK:         call <4 x i32> @llvm.fshr.v4i32(<4 x i32> [[WIDE_LOADX:%.*]], <4 x i32> [[WIDE_LOADY:%.*]], <4 x i32> [[SPLAT:%.*]])
1517; CHECK:         ret void
1518;
1519entry:
1520  %cmp = icmp sgt i32 %n, 0
1521  br i1 %cmp, label %loop, label %end
1522
1523loop:
1524  %iv = phi i32 [ %iv.next, %loop ], [ 0, %entry ]
1525  %xi = getelementptr inbounds i32, ptr %x, i32 %iv
1526  %yi = getelementptr inbounds i32, ptr %y, i32 %iv
1527  %xld = load i32, ptr %xi, align 4
1528  %yld = load i32, ptr %yi, align 4
1529  %call = tail call i32 @llvm.fshr.i32(i32 %xld, i32 %yld, i32 %shAmt)
1530  store i32 %call, ptr %xi, align 4
1531  %iv.next = add i32 %iv, 1
1532  %exitcond = icmp eq i32 %iv.next, %n
1533  br i1 %exitcond, label %end, label %loop
1534
1535end:
1536  ret void
1537}
1538
1539declare float @llvm.minnum.f32(float, float)
1540
1541define void @minnum_f32(i32 %n, ptr %y, ptr %x, ptr %z) {
1542; CHECK-LABEL: @minnum_f32(
1543; CHECK: llvm.minnum.v4f32
1544; CHECK: ret void
1545;
1546entry:
1547  %cmp9 = icmp sgt i32 %n, 0
1548  br i1 %cmp9, label %for.body, label %for.end
1549
1550for.body:                                         ; preds = %entry, %for.body
1551  %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
1552  %arrayidx = getelementptr inbounds float, ptr %y, i64 %indvars.iv
1553  %0 = load float, ptr %arrayidx, align 4
1554  %arrayidx2 = getelementptr inbounds float, ptr %z, i64 %indvars.iv
1555  %1 = load float, ptr %arrayidx2, align 4
1556  %call = tail call float @llvm.minnum.f32(float %0, float %1)
1557  %arrayidx4 = getelementptr inbounds float, ptr %x, i64 %indvars.iv
1558  store float %call, ptr %arrayidx4, align 4
1559  %indvars.iv.next = add i64 %indvars.iv, 1
1560  %lftr.wideiv = trunc i64 %indvars.iv.next to i32
1561  %exitcond = icmp eq i32 %lftr.wideiv, %n
1562  br i1 %exitcond, label %for.end, label %for.body
1563
1564for.end:                                          ; preds = %for.body, %entry
1565  ret void
1566}
1567
1568declare float @llvm.maxnum.f32(float, float)
1569
1570define void @maxnum_f32(i32 %n, ptr %y, ptr %x, ptr %z) {
1571; CHECK-LABEL: @maxnum_f32(
1572; CHECK: llvm.maxnum.v4f32
1573; CHECK: ret void
1574;
1575entry:
1576  %cmp9 = icmp sgt i32 %n, 0
1577  br i1 %cmp9, label %for.body, label %for.end
1578
1579for.body:                                         ; preds = %entry, %for.body
1580  %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
1581  %arrayidx = getelementptr inbounds float, ptr %y, i64 %indvars.iv
1582  %0 = load float, ptr %arrayidx, align 4
1583  %arrayidx2 = getelementptr inbounds float, ptr %z, i64 %indvars.iv
1584  %1 = load float, ptr %arrayidx2, align 4
1585  %call = tail call float @llvm.maxnum.f32(float %0, float %1)
1586  %arrayidx4 = getelementptr inbounds float, ptr %x, i64 %indvars.iv
1587  store float %call, ptr %arrayidx4, align 4
1588  %indvars.iv.next = add i64 %indvars.iv, 1
1589  %lftr.wideiv = trunc i64 %indvars.iv.next to i32
1590  %exitcond = icmp eq i32 %lftr.wideiv, %n
1591  br i1 %exitcond, label %for.end, label %for.body
1592
1593for.end:                                          ; preds = %for.body, %entry
1594  ret void
1595}
1596
1597declare float @llvm.minimum.f32(float, float)
1598
1599define void @minimum_f32(i32 %n, ptr %y, ptr %x, ptr %z) {
1600; CHECK-LABEL: @minimum_f32(
1601; CHECK: llvm.minimum.v4f32
1602; CHECK: ret void
1603;
1604entry:
1605  %cmp9 = icmp sgt i32 %n, 0
1606  br i1 %cmp9, label %for.body, label %for.end
1607
1608for.body:                                         ; preds = %entry, %for.body
1609  %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
1610  %arrayidx = getelementptr inbounds float, ptr %y, i64 %indvars.iv
1611  %0 = load float, ptr %arrayidx, align 4
1612  %arrayidx2 = getelementptr inbounds float, ptr %z, i64 %indvars.iv
1613  %1 = load float, ptr %arrayidx2, align 4
1614  %call = tail call float @llvm.minimum.f32(float %0, float %1)
1615  %arrayidx4 = getelementptr inbounds float, ptr %x, i64 %indvars.iv
1616  store float %call, ptr %arrayidx4, align 4
1617  %indvars.iv.next = add i64 %indvars.iv, 1
1618  %lftr.wideiv = trunc i64 %indvars.iv.next to i32
1619  %exitcond = icmp eq i32 %lftr.wideiv, %n
1620  br i1 %exitcond, label %for.end, label %for.body
1621
1622for.end:                                          ; preds = %for.body, %entry
1623  ret void
1624}
1625
1626declare float @llvm.maximum.f32(float, float)
1627
1628define void @maximum_f32(i32 %n, ptr %y, ptr %x, ptr %z) {
1629; CHECK-LABEL: @maximum_f32(
1630; CHECK: llvm.maximum.v4f32
1631; CHECK: ret void
1632;
1633entry:
1634  %cmp9 = icmp sgt i32 %n, 0
1635  br i1 %cmp9, label %for.body, label %for.end
1636
1637for.body:                                         ; preds = %entry, %for.body
1638  %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
1639  %arrayidx = getelementptr inbounds float, ptr %y, i64 %indvars.iv
1640  %0 = load float, ptr %arrayidx, align 4
1641  %arrayidx2 = getelementptr inbounds float, ptr %z, i64 %indvars.iv
1642  %1 = load float, ptr %arrayidx2, align 4
1643  %call = tail call float @llvm.maximum.f32(float %0, float %1)
1644  %arrayidx4 = getelementptr inbounds float, ptr %x, i64 %indvars.iv
1645  store float %call, ptr %arrayidx4, align 4
1646  %indvars.iv.next = add i64 %indvars.iv, 1
1647  %lftr.wideiv = trunc i64 %indvars.iv.next to i32
1648  %exitcond = icmp eq i32 %lftr.wideiv, %n
1649  br i1 %exitcond, label %for.end, label %for.body
1650
1651for.end:                                          ; preds = %for.body, %entry
1652  ret void
1653}
1654
1655declare i32 @llvm.lrint.i32.f32(float)
1656
1657define void @lrint_i32_f32(ptr %x, ptr %y, i64 %n) {
1658; CHECK-LABEL: @lrint_i32_f32(
1659; CHECK: llvm.lrint.v4i32.v4f32
1660; CHECK: ret void
1661;
1662entry:
1663  %cmp = icmp sgt i64 %n, 0
1664  br i1 %cmp, label %for.body, label %exit
1665
1666for.body:                                         ; preds = %entry, %for.body
1667  %iv = phi i64 [ 0, %entry ], [ %iv.next, %for.body ]
1668  %gep.load = getelementptr inbounds float, ptr %x, i64 %iv
1669  %0 = load float, ptr %gep.load, align 4
1670  %1 = tail call i32 @llvm.lrint.i32.f32(float %0)
1671  %gep.store = getelementptr inbounds i32, ptr %y, i64 %iv
1672  store i32 %1, ptr %gep.store, align 4
1673  %iv.next = add nuw nsw i64 %iv, 1
1674  %exitcond = icmp eq i64 %iv.next, %n
1675  br i1 %exitcond, label %exit, label %for.body
1676
1677exit:                                            ; preds = %for.body, %entry
1678  ret void
1679}
1680
1681declare i64 @llvm.llrint.i64.f32(float)
1682
1683define void @llrint_i64_f32(ptr %x, ptr %y, i64 %n) {
1684; CHECK-LABEL: @llrint_i64_f32(
1685; CHECK: llvm.llrint.v4i64.v4f32
1686; CHECK: ret void
1687;
1688entry:
1689  %cmp = icmp sgt i64 %n, 0
1690  br i1 %cmp, label %for.body, label %exit
1691
1692for.body:                                         ; preds = %entry, %for.body
1693  %iv = phi i64 [ 0, %entry ], [ %iv.next, %for.body ]
1694  %gep.load = getelementptr inbounds float, ptr %x, i64 %iv
1695  %0 = load float, ptr %gep.load, align 4
1696  %1 = tail call i64 @llvm.llrint.i64.f32(float %0)
1697  %gep.store = getelementptr inbounds i64, ptr %y, i64 %iv
1698  store i64 %1, ptr %gep.store, align 4
1699  %iv.next = add nuw nsw i64 %iv, 1
1700  %exitcond = icmp eq i64 %iv.next, %n
1701  br i1 %exitcond, label %exit, label %for.body
1702
1703exit:                                            ; preds = %for.body, %entry
1704  ret void
1705}
1706