[ARM] Adjust how NEON shifts are lowered
[llvm-core.git] / test / Transforms / LoopVectorize / X86 / veclib-calls.ll
blob6f8f5223ce45882336ac77c5601bb935d7635e76
1 ; RUN: opt < %s -vector-library=Accelerate -loop-vectorize -S | FileCheck %s
3 target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64-S128"
4 target triple = "x86_64-unknown-linux-gnu"
6 ;CHECK-LABEL: @sqrt_f32(
7 ;CHECK: vsqrtf{{.*}}<4 x float>
8 ;CHECK: ret void
9 declare float @sqrtf(float) nounwind readnone
10 define void @sqrt_f32(i32 %n, float* noalias %y, float* noalias %x) nounwind uwtable {
11 entry:
12   %cmp6 = icmp sgt i32 %n, 0
13   br i1 %cmp6, label %for.body, label %for.end
15 for.body:                                         ; preds = %entry, %for.body
16   %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
17   %arrayidx = getelementptr inbounds float, float* %y, i64 %indvars.iv
18   %0 = load float, float* %arrayidx, align 4
19   %call = tail call float @sqrtf(float %0) nounwind readnone
20   %arrayidx2 = getelementptr inbounds float, float* %x, i64 %indvars.iv
21   store float %call, float* %arrayidx2, align 4
22   %indvars.iv.next = add i64 %indvars.iv, 1
23   %lftr.wideiv = trunc i64 %indvars.iv.next to i32
24   %exitcond = icmp eq i32 %lftr.wideiv, %n
25   br i1 %exitcond, label %for.end, label %for.body
27 for.end:                                          ; preds = %for.body, %entry
28   ret void
31 ;CHECK-LABEL: @exp_f32(
32 ;CHECK: vexpf{{.*}}<4 x float>
33 ;CHECK: ret void
34 declare float @expf(float) nounwind readnone
35 define void @exp_f32(i32 %n, float* noalias %y, float* noalias %x) nounwind uwtable {
36 entry:
37   %cmp6 = icmp sgt i32 %n, 0
38   br i1 %cmp6, label %for.body, label %for.end
40 for.body:                                         ; preds = %entry, %for.body
41   %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
42   %arrayidx = getelementptr inbounds float, float* %y, i64 %indvars.iv
43   %0 = load float, float* %arrayidx, align 4
44   %call = tail call float @expf(float %0) nounwind readnone
45   %arrayidx2 = getelementptr inbounds float, float* %x, i64 %indvars.iv
46   store float %call, float* %arrayidx2, align 4
47   %indvars.iv.next = add i64 %indvars.iv, 1
48   %lftr.wideiv = trunc i64 %indvars.iv.next to i32
49   %exitcond = icmp eq i32 %lftr.wideiv, %n
50   br i1 %exitcond, label %for.end, label %for.body
52 for.end:                                          ; preds = %for.body, %entry
53   ret void
56 ;CHECK-LABEL: @log_f32(
57 ;CHECK: vlogf{{.*}}<4 x float>
58 ;CHECK: ret void
59 declare float @logf(float) nounwind readnone
60 define void @log_f32(i32 %n, float* noalias %y, float* noalias %x) nounwind uwtable {
61 entry:
62   %cmp6 = icmp sgt i32 %n, 0
63   br i1 %cmp6, label %for.body, label %for.end
65 for.body:                                         ; preds = %entry, %for.body
66   %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
67   %arrayidx = getelementptr inbounds float, float* %y, i64 %indvars.iv
68   %0 = load float, float* %arrayidx, align 4
69   %call = tail call float @logf(float %0) nounwind readnone
70   %arrayidx2 = getelementptr inbounds float, float* %x, i64 %indvars.iv
71   store float %call, float* %arrayidx2, align 4
72   %indvars.iv.next = add i64 %indvars.iv, 1
73   %lftr.wideiv = trunc i64 %indvars.iv.next to i32
74   %exitcond = icmp eq i32 %lftr.wideiv, %n
75   br i1 %exitcond, label %for.end, label %for.body
77 for.end:                                          ; preds = %for.body, %entry
78   ret void
81 ; For abs instruction we'll generate vector intrinsic, as it's cheaper than a lib call.
82 ;CHECK-LABEL: @fabs_f32(
83 ;CHECK: fabs{{.*}}<4 x float>
84 ;CHECK: ret void
85 declare float @fabsf(float) nounwind readnone
86 define void @fabs_f32(i32 %n, float* noalias %y, float* noalias %x) nounwind uwtable {
87 entry:
88   %cmp6 = icmp sgt i32 %n, 0
89   br i1 %cmp6, label %for.body, label %for.end
91 for.body:                                         ; preds = %entry, %for.body
92   %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
93   %arrayidx = getelementptr inbounds float, float* %y, i64 %indvars.iv
94   %0 = load float, float* %arrayidx, align 4
95   %call = tail call float @fabsf(float %0) nounwind readnone
96   %arrayidx2 = getelementptr inbounds float, float* %x, i64 %indvars.iv
97   store float %call, float* %arrayidx2, align 4
98   %indvars.iv.next = add i64 %indvars.iv, 1
99   %lftr.wideiv = trunc i64 %indvars.iv.next to i32
100   %exitcond = icmp eq i32 %lftr.wideiv, %n
101   br i1 %exitcond, label %for.end, label %for.body
103 for.end:                                          ; preds = %for.body, %entry
104   ret void
107 ; Test that we can vectorize an intrinsic into a vector call.
108 ;CHECK-LABEL: @exp_f32_intrin(
109 ;CHECK: vexpf{{.*}}<4 x float>
110 ;CHECK: ret void
111 declare float @llvm.exp.f32(float) nounwind readnone
112 define void @exp_f32_intrin(i32 %n, float* noalias %y, float* noalias %x) nounwind uwtable {
113 entry:
114   %cmp6 = icmp sgt i32 %n, 0
115   br i1 %cmp6, label %for.body, label %for.end
117 for.body:                                         ; preds = %entry, %for.body
118   %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
119   %arrayidx = getelementptr inbounds float, float* %y, i64 %indvars.iv
120   %0 = load float, float* %arrayidx, align 4
121   %call = tail call float @llvm.exp.f32(float %0) nounwind readnone
122   %arrayidx2 = getelementptr inbounds float, float* %x, i64 %indvars.iv
123   store float %call, float* %arrayidx2, align 4
124   %indvars.iv.next = add i64 %indvars.iv, 1
125   %lftr.wideiv = trunc i64 %indvars.iv.next to i32
126   %exitcond = icmp eq i32 %lftr.wideiv, %n
127   br i1 %exitcond, label %for.end, label %for.body
129 for.end:                                          ; preds = %for.body, %entry
130   ret void
133 ; Test that we don't vectorize arbitrary functions.
134 ;CHECK-LABEL: @foo_f32(
135 ;CHECK-NOT: foo{{.*}}<4 x float>
136 ;CHECK: ret void
137 declare float @foo(float) nounwind readnone
138 define void @foo_f32(i32 %n, float* noalias %y, float* noalias %x) nounwind uwtable {
139 entry:
140   %cmp6 = icmp sgt i32 %n, 0
141   br i1 %cmp6, label %for.body, label %for.end
143 for.body:                                         ; preds = %entry, %for.body
144   %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
145   %arrayidx = getelementptr inbounds float, float* %y, i64 %indvars.iv
146   %0 = load float, float* %arrayidx, align 4
147   %call = tail call float @foo(float %0) nounwind readnone
148   %arrayidx2 = getelementptr inbounds float, float* %x, i64 %indvars.iv
149   store float %call, float* %arrayidx2, align 4
150   %indvars.iv.next = add i64 %indvars.iv, 1
151   %lftr.wideiv = trunc i64 %indvars.iv.next to i32
152   %exitcond = icmp eq i32 %lftr.wideiv, %n
153   br i1 %exitcond, label %for.end, label %for.body
155 for.end:                                          ; preds = %for.body, %entry
156   ret void
159 ; Test that we don't vectorize calls with nobuiltin attribute.
160 ;CHECK-LABEL: @sqrt_f32_nobuiltin(
161 ;CHECK-NOT: vsqrtf{{.*}}<4 x float>
162 ;CHECK: ret void
163 define void @sqrt_f32_nobuiltin(i32 %n, float* noalias %y, float* noalias %x) nounwind uwtable {
164 entry:
165   %cmp6 = icmp sgt i32 %n, 0
166   br i1 %cmp6, label %for.body, label %for.end
168 for.body:                                         ; preds = %entry, %for.body
169   %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
170   %arrayidx = getelementptr inbounds float, float* %y, i64 %indvars.iv
171   %0 = load float, float* %arrayidx, align 4
172   %call = tail call float @sqrtf(float %0) nounwind readnone nobuiltin
173   %arrayidx2 = getelementptr inbounds float, float* %x, i64 %indvars.iv
174   store float %call, float* %arrayidx2, align 4
175   %indvars.iv.next = add i64 %indvars.iv, 1
176   %lftr.wideiv = trunc i64 %indvars.iv.next to i32
177   %exitcond = icmp eq i32 %lftr.wideiv, %n
178   br i1 %exitcond, label %for.end, label %for.body
180 for.end:                                          ; preds = %for.body, %entry
181   ret void
184 ;CHECK-LABEL: @ceil_f32(
185 ;CHECK: vceilf{{.*}}<4 x float>
186 ;CHECK: ret void
187 declare float @ceilf(float) nounwind readnone
188 define void @ceil_f32(i32 %n, float* noalias %y, float* noalias %x) nounwind uwtable {
189 entry:
190   %cmp6 = icmp sgt i32 %n, 0
191   br i1 %cmp6, label %for.body, label %for.end
193 for.body:                                         ; preds = %entry, %for.body
194   %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
195   %arrayidx = getelementptr inbounds float, float* %y, i64 %indvars.iv
196   %0 = load float, float* %arrayidx, align 4
197   %call = tail call float @ceilf(float %0) nounwind readnone
198   %arrayidx2 = getelementptr inbounds float, float* %x, i64 %indvars.iv
199   store float %call, float* %arrayidx2, align 4
200   %indvars.iv.next = add i64 %indvars.iv, 1
201   %lftr.wideiv = trunc i64 %indvars.iv.next to i32
202   %exitcond = icmp eq i32 %lftr.wideiv, %n
203   br i1 %exitcond, label %for.end, label %for.body
205 for.end:                                          ; preds = %for.body, %entry
206   ret void
209 ;CHECK-LABEL: @floor_f32(
210 ;CHECK: vfloorf{{.*}}<4 x float>
211 ;CHECK: ret void
212 declare float @floorf(float) nounwind readnone
213 define void @floor_f32(i32 %n, float* noalias %y, float* noalias %x) nounwind uwtable {
214 entry:
215   %cmp6 = icmp sgt i32 %n, 0
216   br i1 %cmp6, label %for.body, label %for.end
218 for.body:                                         ; preds = %entry, %for.body
219   %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
220   %arrayidx = getelementptr inbounds float, float* %y, i64 %indvars.iv
221   %0 = load float, float* %arrayidx, align 4
222   %call = tail call float @floorf(float %0) nounwind readnone
223   %arrayidx2 = getelementptr inbounds float, float* %x, i64 %indvars.iv
224   store float %call, float* %arrayidx2, align 4
225   %indvars.iv.next = add i64 %indvars.iv, 1
226   %lftr.wideiv = trunc i64 %indvars.iv.next to i32
227   %exitcond = icmp eq i32 %lftr.wideiv, %n
228   br i1 %exitcond, label %for.end, label %for.body
230 for.end:                                          ; preds = %for.body, %entry
231   ret void
234 ;CHECK-LABEL: @expm1_f32(
235 ;CHECK: vexpm1f{{.*}}<4 x float>
236 ;CHECK: ret void
237 declare float @expm1f(float) nounwind readnone
238 define void @expm1_f32(i32 %n, float* noalias %y, float* noalias %x) nounwind uwtable {
239 entry:
240   %cmp6 = icmp sgt i32 %n, 0
241   br i1 %cmp6, label %for.body, label %for.end
243 for.body:                                         ; preds = %entry, %for.body
244   %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
245   %arrayidx = getelementptr inbounds float, float* %y, i64 %indvars.iv
246   %0 = load float, float* %arrayidx, align 4
247   %call = tail call float @expm1f(float %0) nounwind readnone
248   %arrayidx2 = getelementptr inbounds float, float* %x, i64 %indvars.iv
249   store float %call, float* %arrayidx2, align 4
250   %indvars.iv.next = add i64 %indvars.iv, 1
251   %lftr.wideiv = trunc i64 %indvars.iv.next to i32
252   %exitcond = icmp eq i32 %lftr.wideiv, %n
253   br i1 %exitcond, label %for.end, label %for.body
255 for.end:                                          ; preds = %for.body, %entry
256   ret void
259 ;CHECK-LABEL: @log1p_f32(
260 ;CHECK: vlog1pf{{.*}}<4 x float>
261 ;CHECK: ret void
262 declare float @log1pf(float) nounwind readnone
263 define void @log1p_f32(i32 %n, float* noalias %y, float* noalias %x) nounwind uwtable {
264 entry:
265   %cmp6 = icmp sgt i32 %n, 0
266   br i1 %cmp6, label %for.body, label %for.end
268 for.body:                                         ; preds = %entry, %for.body
269   %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
270   %arrayidx = getelementptr inbounds float, float* %y, i64 %indvars.iv
271   %0 = load float, float* %arrayidx, align 4
272   %call = tail call float @log1pf(float %0) nounwind readnone
273   %arrayidx2 = getelementptr inbounds float, float* %x, i64 %indvars.iv
274   store float %call, float* %arrayidx2, align 4
275   %indvars.iv.next = add i64 %indvars.iv, 1
276   %lftr.wideiv = trunc i64 %indvars.iv.next to i32
277   %exitcond = icmp eq i32 %lftr.wideiv, %n
278   br i1 %exitcond, label %for.end, label %for.body
280 for.end:                                          ; preds = %for.body, %entry
281   ret void
284 ;CHECK-LABEL: @log10_f32(
285 ;CHECK: vlog10f{{.*}}<4 x float>
286 ;CHECK: ret void
287 declare float @log10f(float) nounwind readnone
288 define void @log10_f32(i32 %n, float* noalias %y, float* noalias %x) nounwind uwtable {
289 entry:
290   %cmp6 = icmp sgt i32 %n, 0
291   br i1 %cmp6, label %for.body, label %for.end
293 for.body:                                         ; preds = %entry, %for.body
294   %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
295   %arrayidx = getelementptr inbounds float, float* %y, i64 %indvars.iv
296   %0 = load float, float* %arrayidx, align 4
297   %call = tail call float @log10f(float %0) nounwind readnone
298   %arrayidx2 = getelementptr inbounds float, float* %x, i64 %indvars.iv
299   store float %call, float* %arrayidx2, align 4
300   %indvars.iv.next = add i64 %indvars.iv, 1
301   %lftr.wideiv = trunc i64 %indvars.iv.next to i32
302   %exitcond = icmp eq i32 %lftr.wideiv, %n
303   br i1 %exitcond, label %for.end, label %for.body
305 for.end:                                          ; preds = %for.body, %entry
306   ret void
309 ;CHECK-LABEL: @logb_f32(
310 ;CHECK: vlogbf{{.*}}<4 x float>
311 ;CHECK: ret void
312 declare float @logbf(float) nounwind readnone
313 define void @logb_f32(i32 %n, float* noalias %y, float* noalias %x) nounwind uwtable {
314 entry:
315   %cmp6 = icmp sgt i32 %n, 0
316   br i1 %cmp6, label %for.body, label %for.end
318 for.body:                                         ; preds = %entry, %for.body
319   %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
320   %arrayidx = getelementptr inbounds float, float* %y, i64 %indvars.iv
321   %0 = load float, float* %arrayidx, align 4
322   %call = tail call float @logbf(float %0) nounwind readnone
323   %arrayidx2 = getelementptr inbounds float, float* %x, i64 %indvars.iv
324   store float %call, float* %arrayidx2, align 4
325   %indvars.iv.next = add i64 %indvars.iv, 1
326   %lftr.wideiv = trunc i64 %indvars.iv.next to i32
327   %exitcond = icmp eq i32 %lftr.wideiv, %n
328   br i1 %exitcond, label %for.end, label %for.body
330 for.end:                                          ; preds = %for.body, %entry
331   ret void
334 ;CHECK-LABEL: @sin_f32(
335 ;CHECK: vsinf{{.*}}<4 x float>
336 ;CHECK: ret void
337 declare float @sinf(float) nounwind readnone
338 define void @sin_f32(i32 %n, float* noalias %y, float* noalias %x) nounwind uwtable {
339 entry:
340   %cmp6 = icmp sgt i32 %n, 0
341   br i1 %cmp6, label %for.body, label %for.end
343 for.body:                                         ; preds = %entry, %for.body
344   %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
345   %arrayidx = getelementptr inbounds float, float* %y, i64 %indvars.iv
346   %0 = load float, float* %arrayidx, align 4
347   %call = tail call float @sinf(float %0) nounwind readnone
348   %arrayidx2 = getelementptr inbounds float, float* %x, i64 %indvars.iv
349   store float %call, float* %arrayidx2, align 4
350   %indvars.iv.next = add i64 %indvars.iv, 1
351   %lftr.wideiv = trunc i64 %indvars.iv.next to i32
352   %exitcond = icmp eq i32 %lftr.wideiv, %n
353   br i1 %exitcond, label %for.end, label %for.body
355 for.end:                                          ; preds = %for.body, %entry
356   ret void
359 ;CHECK-LABEL: @cos_f32(
360 ;CHECK: vcosf{{.*}}<4 x float>
361 ;CHECK: ret void
362 declare float @cosf(float) nounwind readnone
363 define void @cos_f32(i32 %n, float* noalias %y, float* noalias %x) nounwind uwtable {
364 entry:
365   %cmp6 = icmp sgt i32 %n, 0
366   br i1 %cmp6, label %for.body, label %for.end
368 for.body:                                         ; preds = %entry, %for.body
369   %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
370   %arrayidx = getelementptr inbounds float, float* %y, i64 %indvars.iv
371   %0 = load float, float* %arrayidx, align 4
372   %call = tail call float @cosf(float %0) nounwind readnone
373   %arrayidx2 = getelementptr inbounds float, float* %x, i64 %indvars.iv
374   store float %call, float* %arrayidx2, align 4
375   %indvars.iv.next = add i64 %indvars.iv, 1
376   %lftr.wideiv = trunc i64 %indvars.iv.next to i32
377   %exitcond = icmp eq i32 %lftr.wideiv, %n
378   br i1 %exitcond, label %for.end, label %for.body
380 for.end:                                          ; preds = %for.body, %entry
381   ret void
384 ;CHECK-LABEL: @tan_f32(
385 ;CHECK: vtanf{{.*}}<4 x float>
386 ;CHECK: ret void
387 declare float @tanf(float) nounwind readnone
388 define void @tan_f32(i32 %n, float* noalias %y, float* noalias %x) nounwind uwtable {
389 entry:
390   %cmp6 = icmp sgt i32 %n, 0
391   br i1 %cmp6, label %for.body, label %for.end
393 for.body:                                         ; preds = %entry, %for.body
394   %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
395   %arrayidx = getelementptr inbounds float, float* %y, i64 %indvars.iv
396   %0 = load float, float* %arrayidx, align 4
397   %call = tail call float @tanf(float %0) nounwind readnone
398   %arrayidx2 = getelementptr inbounds float, float* %x, i64 %indvars.iv
399   store float %call, float* %arrayidx2, align 4
400   %indvars.iv.next = add i64 %indvars.iv, 1
401   %lftr.wideiv = trunc i64 %indvars.iv.next to i32
402   %exitcond = icmp eq i32 %lftr.wideiv, %n
403   br i1 %exitcond, label %for.end, label %for.body
405 for.end:                                          ; preds = %for.body, %entry
406   ret void
409 ;CHECK-LABEL: @asin_f32(
410 ;CHECK: vasinf{{.*}}<4 x float>
411 ;CHECK: ret void
412 declare float @asinf(float) nounwind readnone
413 define void @asin_f32(i32 %n, float* noalias %y, float* noalias %x) nounwind uwtable {
414 entry:
415   %cmp6 = icmp sgt i32 %n, 0
416   br i1 %cmp6, label %for.body, label %for.end
418 for.body:                                         ; preds = %entry, %for.body
419   %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
420   %arrayidx = getelementptr inbounds float, float* %y, i64 %indvars.iv
421   %0 = load float, float* %arrayidx, align 4
422   %call = tail call float @asinf(float %0) nounwind readnone
423   %arrayidx2 = getelementptr inbounds float, float* %x, i64 %indvars.iv
424   store float %call, float* %arrayidx2, align 4
425   %indvars.iv.next = add i64 %indvars.iv, 1
426   %lftr.wideiv = trunc i64 %indvars.iv.next to i32
427   %exitcond = icmp eq i32 %lftr.wideiv, %n
428   br i1 %exitcond, label %for.end, label %for.body
430 for.end:                                          ; preds = %for.body, %entry
431   ret void
434 ;CHECK-LABEL: @acos_f32(
435 ;CHECK: vacosf{{.*}}<4 x float>
436 ;CHECK: ret void
437 declare float @acosf(float) nounwind readnone
438 define void @acos_f32(i32 %n, float* noalias %y, float* noalias %x) nounwind uwtable {
439 entry:
440   %cmp6 = icmp sgt i32 %n, 0
441   br i1 %cmp6, label %for.body, label %for.end
443 for.body:                                         ; preds = %entry, %for.body
444   %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
445   %arrayidx = getelementptr inbounds float, float* %y, i64 %indvars.iv
446   %0 = load float, float* %arrayidx, align 4
447   %call = tail call float @acosf(float %0) nounwind readnone
448   %arrayidx2 = getelementptr inbounds float, float* %x, i64 %indvars.iv
449   store float %call, float* %arrayidx2, align 4
450   %indvars.iv.next = add i64 %indvars.iv, 1
451   %lftr.wideiv = trunc i64 %indvars.iv.next to i32
452   %exitcond = icmp eq i32 %lftr.wideiv, %n
453   br i1 %exitcond, label %for.end, label %for.body
455 for.end:                                          ; preds = %for.body, %entry
456   ret void
459 ;CHECK-LABEL: @atan_f32(
460 ;CHECK: vatanf{{.*}}<4 x float>
461 ;CHECK: ret void
462 declare float @atanf(float) nounwind readnone
463 define void @atan_f32(i32 %n, float* noalias %y, float* noalias %x) nounwind uwtable {
464 entry:
465   %cmp6 = icmp sgt i32 %n, 0
466   br i1 %cmp6, label %for.body, label %for.end
468 for.body:                                         ; preds = %entry, %for.body
469   %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
470   %arrayidx = getelementptr inbounds float, float* %y, i64 %indvars.iv
471   %0 = load float, float* %arrayidx, align 4
472   %call = tail call float @atanf(float %0) nounwind readnone
473   %arrayidx2 = getelementptr inbounds float, float* %x, i64 %indvars.iv
474   store float %call, float* %arrayidx2, align 4
475   %indvars.iv.next = add i64 %indvars.iv, 1
476   %lftr.wideiv = trunc i64 %indvars.iv.next to i32
477   %exitcond = icmp eq i32 %lftr.wideiv, %n
478   br i1 %exitcond, label %for.end, label %for.body
480 for.end:                                          ; preds = %for.body, %entry
481   ret void
484 ;CHECK-LABEL: @sinh_f32(
485 ;CHECK: vsinhf{{.*}}<4 x float>
486 ;CHECK: ret void
487 declare float @sinhf(float) nounwind readnone
488 define void @sinh_f32(i32 %n, float* noalias %y, float* noalias %x) nounwind uwtable {
489 entry:
490   %cmp6 = icmp sgt i32 %n, 0
491   br i1 %cmp6, label %for.body, label %for.end
493 for.body:                                         ; preds = %entry, %for.body
494   %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
495   %arrayidx = getelementptr inbounds float, float* %y, i64 %indvars.iv
496   %0 = load float, float* %arrayidx, align 4
497   %call = tail call float @sinhf(float %0) nounwind readnone
498   %arrayidx2 = getelementptr inbounds float, float* %x, i64 %indvars.iv
499   store float %call, float* %arrayidx2, align 4
500   %indvars.iv.next = add i64 %indvars.iv, 1
501   %lftr.wideiv = trunc i64 %indvars.iv.next to i32
502   %exitcond = icmp eq i32 %lftr.wideiv, %n
503   br i1 %exitcond, label %for.end, label %for.body
505 for.end:                                          ; preds = %for.body, %entry
506   ret void
509 ;CHECK-LABEL: @cosh_f32(
510 ;CHECK: vcoshf{{.*}}<4 x float>
511 ;CHECK: ret void
512 declare float @coshf(float) nounwind readnone
513 define void @cosh_f32(i32 %n, float* noalias %y, float* noalias %x) nounwind uwtable {
514 entry:
515   %cmp6 = icmp sgt i32 %n, 0
516   br i1 %cmp6, label %for.body, label %for.end
518 for.body:                                         ; preds = %entry, %for.body
519   %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
520   %arrayidx = getelementptr inbounds float, float* %y, i64 %indvars.iv
521   %0 = load float, float* %arrayidx, align 4
522   %call = tail call float @coshf(float %0) nounwind readnone
523   %arrayidx2 = getelementptr inbounds float, float* %x, i64 %indvars.iv
524   store float %call, float* %arrayidx2, align 4
525   %indvars.iv.next = add i64 %indvars.iv, 1
526   %lftr.wideiv = trunc i64 %indvars.iv.next to i32
527   %exitcond = icmp eq i32 %lftr.wideiv, %n
528   br i1 %exitcond, label %for.end, label %for.body
530 for.end:                                          ; preds = %for.body, %entry
531   ret void
534 ;CHECK-LABEL: @tanh_f32(
535 ;CHECK: vtanhf{{.*}}<4 x float>
536 ;CHECK: ret void
537 declare float @tanhf(float) nounwind readnone
538 define void @tanh_f32(i32 %n, float* noalias %y, float* noalias %x) nounwind uwtable {
539 entry:
540   %cmp6 = icmp sgt i32 %n, 0
541   br i1 %cmp6, label %for.body, label %for.end
543 for.body:                                         ; preds = %entry, %for.body
544   %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
545   %arrayidx = getelementptr inbounds float, float* %y, i64 %indvars.iv
546   %0 = load float, float* %arrayidx, align 4
547   %call = tail call float @tanhf(float %0) nounwind readnone
548   %arrayidx2 = getelementptr inbounds float, float* %x, i64 %indvars.iv
549   store float %call, float* %arrayidx2, align 4
550   %indvars.iv.next = add i64 %indvars.iv, 1
551   %lftr.wideiv = trunc i64 %indvars.iv.next to i32
552   %exitcond = icmp eq i32 %lftr.wideiv, %n
553   br i1 %exitcond, label %for.end, label %for.body
555 for.end:                                          ; preds = %for.body, %entry
556   ret void
559 ;CHECK-LABEL: @asinh_f32(
560 ;CHECK: vasinhf{{.*}}<4 x float>
561 ;CHECK: ret void
562 declare float @asinhf(float) nounwind readnone
563 define void @asinh_f32(i32 %n, float* noalias %y, float* noalias %x) nounwind uwtable {
564 entry:
565   %cmp6 = icmp sgt i32 %n, 0
566   br i1 %cmp6, label %for.body, label %for.end
568 for.body:                                         ; preds = %entry, %for.body
569   %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
570   %arrayidx = getelementptr inbounds float, float* %y, i64 %indvars.iv
571   %0 = load float, float* %arrayidx, align 4
572   %call = tail call float @asinhf(float %0) nounwind readnone
573   %arrayidx2 = getelementptr inbounds float, float* %x, i64 %indvars.iv
574   store float %call, float* %arrayidx2, align 4
575   %indvars.iv.next = add i64 %indvars.iv, 1
576   %lftr.wideiv = trunc i64 %indvars.iv.next to i32
577   %exitcond = icmp eq i32 %lftr.wideiv, %n
578   br i1 %exitcond, label %for.end, label %for.body
580 for.end:                                          ; preds = %for.body, %entry
581   ret void
584 ;CHECK-LABEL: @acosh_f32(
585 ;CHECK: vacoshf{{.*}}<4 x float>
586 ;CHECK: ret void
587 declare float @acoshf(float) nounwind readnone
588 define void @acosh_f32(i32 %n, float* noalias %y, float* noalias %x) nounwind uwtable {
589 entry:
590   %cmp6 = icmp sgt i32 %n, 0
591   br i1 %cmp6, label %for.body, label %for.end
593 for.body:                                         ; preds = %entry, %for.body
594   %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
595   %arrayidx = getelementptr inbounds float, float* %y, i64 %indvars.iv
596   %0 = load float, float* %arrayidx, align 4
597   %call = tail call float @acoshf(float %0) nounwind readnone
598   %arrayidx2 = getelementptr inbounds float, float* %x, i64 %indvars.iv
599   store float %call, float* %arrayidx2, align 4
600   %indvars.iv.next = add i64 %indvars.iv, 1
601   %lftr.wideiv = trunc i64 %indvars.iv.next to i32
602   %exitcond = icmp eq i32 %lftr.wideiv, %n
603   br i1 %exitcond, label %for.end, label %for.body
605 for.end:                                          ; preds = %for.body, %entry
606   ret void
609 ;CHECK-LABEL: @atanh_f32(
610 ;CHECK: vatanhf{{.*}}<4 x float>
611 ;CHECK: ret void
612 declare float @atanhf(float) nounwind readnone
613 define void @atanh_f32(i32 %n, float* noalias %y, float* noalias %x) nounwind uwtable {
614 entry:
615   %cmp6 = icmp sgt i32 %n, 0
616   br i1 %cmp6, label %for.body, label %for.end
618 for.body:                                         ; preds = %entry, %for.body
619   %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
620   %arrayidx = getelementptr inbounds float, float* %y, i64 %indvars.iv
621   %0 = load float, float* %arrayidx, align 4
622   %call = tail call float @atanhf(float %0) nounwind readnone
623   %arrayidx2 = getelementptr inbounds float, float* %x, i64 %indvars.iv
624   store float %call, float* %arrayidx2, align 4
625   %indvars.iv.next = add i64 %indvars.iv, 1
626   %lftr.wideiv = trunc i64 %indvars.iv.next to i32
627   %exitcond = icmp eq i32 %lftr.wideiv, %n
628   br i1 %exitcond, label %for.end, label %for.body
630 for.end:                                          ; preds = %for.body, %entry
631   ret void