blob: 178d602e7f3359e37ec4c55cb7644f812bf99220 [file] [log] [blame]
Sanjay Patelb653de12014-09-10 17:58:16 +00001; RUN: opt < %s -loop-vectorize -force-vector-interleave=1 -force-vector-width=4 -dce -instcombine -S | FileCheck %s
Paul Redmond2adb13c2012-12-09 20:42:17 +00002
3target 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"
Paul Redmond2adb13c2012-12-09 20:42:17 +00004
Stephen Linc1c7a132013-07-14 01:42:54 +00005;CHECK-LABEL: @sqrt_f32(
Paul Redmond2adb13c2012-12-09 20:42:17 +00006;CHECK: llvm.sqrt.v4f32
7;CHECK: ret void
8define void @sqrt_f32(i32 %n, float* noalias %y, float* noalias %x) nounwind uwtable {
9entry:
10 %cmp6 = icmp sgt i32 %n, 0
11 br i1 %cmp6, label %for.body, label %for.end
12
13for.body: ; preds = %entry, %for.body
14 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
David Blaikie79e6c742015-02-27 19:29:02 +000015 %arrayidx = getelementptr inbounds float, float* %y, i64 %indvars.iv
David Blaikiea79ac142015-02-27 21:17:42 +000016 %0 = load float, float* %arrayidx, align 4
Paul Redmond2adb13c2012-12-09 20:42:17 +000017 %call = tail call float @llvm.sqrt.f32(float %0) nounwind readnone
David Blaikie79e6c742015-02-27 19:29:02 +000018 %arrayidx2 = getelementptr inbounds float, float* %x, i64 %indvars.iv
Manman Ren16649b02013-05-02 18:11:35 +000019 store float %call, float* %arrayidx2, align 4
Paul Redmond2adb13c2012-12-09 20:42:17 +000020 %indvars.iv.next = add i64 %indvars.iv, 1
21 %lftr.wideiv = trunc i64 %indvars.iv.next to i32
22 %exitcond = icmp eq i32 %lftr.wideiv, %n
23 br i1 %exitcond, label %for.end, label %for.body
24
25for.end: ; preds = %for.body, %entry
26 ret void
27}
28
29declare float @llvm.sqrt.f32(float) nounwind readnone
30
Stephen Linc1c7a132013-07-14 01:42:54 +000031;CHECK-LABEL: @sqrt_f64(
Paul Redmond2adb13c2012-12-09 20:42:17 +000032;CHECK: llvm.sqrt.v4f64
33;CHECK: ret void
34define void @sqrt_f64(i32 %n, double* noalias %y, double* noalias %x) nounwind uwtable {
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 ]
David Blaikie79e6c742015-02-27 19:29:02 +000041 %arrayidx = getelementptr inbounds double, double* %y, i64 %indvars.iv
David Blaikiea79ac142015-02-27 21:17:42 +000042 %0 = load double, double* %arrayidx, align 8
Paul Redmond2adb13c2012-12-09 20:42:17 +000043 %call = tail call double @llvm.sqrt.f64(double %0) nounwind readnone
David Blaikie79e6c742015-02-27 19:29:02 +000044 %arrayidx2 = getelementptr inbounds double, double* %x, i64 %indvars.iv
Manman Ren16649b02013-05-02 18:11:35 +000045 store double %call, double* %arrayidx2, align 8
Paul Redmond2adb13c2012-12-09 20:42:17 +000046 %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) nounwind readnone
56
Stephen Linc1c7a132013-07-14 01:42:54 +000057;CHECK-LABEL: @sin_f32(
Paul Redmond2adb13c2012-12-09 20:42:17 +000058;CHECK: llvm.sin.v4f32
59;CHECK: ret void
60define void @sin_f32(i32 %n, float* noalias %y, float* noalias %x) nounwind uwtable {
61entry:
62 %cmp6 = icmp sgt i32 %n, 0
63 br i1 %cmp6, label %for.body, label %for.end
64
65for.body: ; preds = %entry, %for.body
66 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
David Blaikie79e6c742015-02-27 19:29:02 +000067 %arrayidx = getelementptr inbounds float, float* %y, i64 %indvars.iv
David Blaikiea79ac142015-02-27 21:17:42 +000068 %0 = load float, float* %arrayidx, align 4
Paul Redmond2adb13c2012-12-09 20:42:17 +000069 %call = tail call float @llvm.sin.f32(float %0) nounwind readnone
David Blaikie79e6c742015-02-27 19:29:02 +000070 %arrayidx2 = getelementptr inbounds float, float* %x, i64 %indvars.iv
Manman Ren16649b02013-05-02 18:11:35 +000071 store float %call, float* %arrayidx2, align 4
Paul Redmond2adb13c2012-12-09 20:42:17 +000072 %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
76
77for.end: ; preds = %for.body, %entry
78 ret void
79}
80
81declare float @llvm.sin.f32(float) nounwind readnone
82
Stephen Linc1c7a132013-07-14 01:42:54 +000083;CHECK-LABEL: @sin_f64(
Paul Redmond2adb13c2012-12-09 20:42:17 +000084;CHECK: llvm.sin.v4f64
85;CHECK: ret void
86define void @sin_f64(i32 %n, double* noalias %y, double* noalias %x) nounwind uwtable {
87entry:
88 %cmp6 = icmp sgt i32 %n, 0
89 br i1 %cmp6, label %for.body, label %for.end
90
91for.body: ; preds = %entry, %for.body
92 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
David Blaikie79e6c742015-02-27 19:29:02 +000093 %arrayidx = getelementptr inbounds double, double* %y, i64 %indvars.iv
David Blaikiea79ac142015-02-27 21:17:42 +000094 %0 = load double, double* %arrayidx, align 8
Paul Redmond2adb13c2012-12-09 20:42:17 +000095 %call = tail call double @llvm.sin.f64(double %0) nounwind readnone
David Blaikie79e6c742015-02-27 19:29:02 +000096 %arrayidx2 = getelementptr inbounds double, double* %x, i64 %indvars.iv
Manman Ren16649b02013-05-02 18:11:35 +000097 store double %call, double* %arrayidx2, align 8
Paul Redmond2adb13c2012-12-09 20:42:17 +000098 %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
102
103for.end: ; preds = %for.body, %entry
104 ret void
105}
106
107declare double @llvm.sin.f64(double) nounwind readnone
108
Stephen Linc1c7a132013-07-14 01:42:54 +0000109;CHECK-LABEL: @cos_f32(
Paul Redmond2adb13c2012-12-09 20:42:17 +0000110;CHECK: llvm.cos.v4f32
111;CHECK: ret void
112define void @cos_f32(i32 %n, float* noalias %y, float* noalias %x) nounwind uwtable {
113entry:
114 %cmp6 = icmp sgt i32 %n, 0
115 br i1 %cmp6, label %for.body, label %for.end
116
117for.body: ; preds = %entry, %for.body
118 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
David Blaikie79e6c742015-02-27 19:29:02 +0000119 %arrayidx = getelementptr inbounds float, float* %y, i64 %indvars.iv
David Blaikiea79ac142015-02-27 21:17:42 +0000120 %0 = load float, float* %arrayidx, align 4
Paul Redmond2adb13c2012-12-09 20:42:17 +0000121 %call = tail call float @llvm.cos.f32(float %0) nounwind readnone
David Blaikie79e6c742015-02-27 19:29:02 +0000122 %arrayidx2 = getelementptr inbounds float, float* %x, i64 %indvars.iv
Manman Ren16649b02013-05-02 18:11:35 +0000123 store float %call, float* %arrayidx2, align 4
Paul Redmond2adb13c2012-12-09 20:42:17 +0000124 %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
128
129for.end: ; preds = %for.body, %entry
130 ret void
131}
132
133declare float @llvm.cos.f32(float) nounwind readnone
134
Stephen Linc1c7a132013-07-14 01:42:54 +0000135;CHECK-LABEL: @cos_f64(
Paul Redmond2adb13c2012-12-09 20:42:17 +0000136;CHECK: llvm.cos.v4f64
137;CHECK: ret void
138define void @cos_f64(i32 %n, double* noalias %y, double* noalias %x) nounwind uwtable {
139entry:
140 %cmp6 = icmp sgt i32 %n, 0
141 br i1 %cmp6, label %for.body, label %for.end
142
143for.body: ; preds = %entry, %for.body
144 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
David Blaikie79e6c742015-02-27 19:29:02 +0000145 %arrayidx = getelementptr inbounds double, double* %y, i64 %indvars.iv
David Blaikiea79ac142015-02-27 21:17:42 +0000146 %0 = load double, double* %arrayidx, align 8
Paul Redmond2adb13c2012-12-09 20:42:17 +0000147 %call = tail call double @llvm.cos.f64(double %0) nounwind readnone
David Blaikie79e6c742015-02-27 19:29:02 +0000148 %arrayidx2 = getelementptr inbounds double, double* %x, i64 %indvars.iv
Manman Ren16649b02013-05-02 18:11:35 +0000149 store double %call, double* %arrayidx2, align 8
Paul Redmond2adb13c2012-12-09 20:42:17 +0000150 %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
154
155for.end: ; preds = %for.body, %entry
156 ret void
157}
158
159declare double @llvm.cos.f64(double) nounwind readnone
160
Stephen Linc1c7a132013-07-14 01:42:54 +0000161;CHECK-LABEL: @exp_f32(
Paul Redmond2adb13c2012-12-09 20:42:17 +0000162;CHECK: llvm.exp.v4f32
163;CHECK: ret void
164define void @exp_f32(i32 %n, float* noalias %y, float* noalias %x) nounwind uwtable {
165entry:
166 %cmp6 = icmp sgt i32 %n, 0
167 br i1 %cmp6, label %for.body, label %for.end
168
169for.body: ; preds = %entry, %for.body
170 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
David Blaikie79e6c742015-02-27 19:29:02 +0000171 %arrayidx = getelementptr inbounds float, float* %y, i64 %indvars.iv
David Blaikiea79ac142015-02-27 21:17:42 +0000172 %0 = load float, float* %arrayidx, align 4
Paul Redmond2adb13c2012-12-09 20:42:17 +0000173 %call = tail call float @llvm.exp.f32(float %0) nounwind readnone
David Blaikie79e6c742015-02-27 19:29:02 +0000174 %arrayidx2 = getelementptr inbounds float, float* %x, i64 %indvars.iv
Manman Ren16649b02013-05-02 18:11:35 +0000175 store float %call, float* %arrayidx2, align 4
Paul Redmond2adb13c2012-12-09 20:42:17 +0000176 %indvars.iv.next = add i64 %indvars.iv, 1
177 %lftr.wideiv = trunc i64 %indvars.iv.next to i32
178 %exitcond = icmp eq i32 %lftr.wideiv, %n
179 br i1 %exitcond, label %for.end, label %for.body
180
181for.end: ; preds = %for.body, %entry
182 ret void
183}
184
185declare float @llvm.exp.f32(float) nounwind readnone
186
Stephen Linc1c7a132013-07-14 01:42:54 +0000187;CHECK-LABEL: @exp_f64(
Paul Redmond2adb13c2012-12-09 20:42:17 +0000188;CHECK: llvm.exp.v4f64
189;CHECK: ret void
190define void @exp_f64(i32 %n, double* noalias %y, double* noalias %x) nounwind uwtable {
191entry:
192 %cmp6 = icmp sgt i32 %n, 0
193 br i1 %cmp6, label %for.body, label %for.end
194
195for.body: ; preds = %entry, %for.body
196 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
David Blaikie79e6c742015-02-27 19:29:02 +0000197 %arrayidx = getelementptr inbounds double, double* %y, i64 %indvars.iv
David Blaikiea79ac142015-02-27 21:17:42 +0000198 %0 = load double, double* %arrayidx, align 8
Paul Redmond2adb13c2012-12-09 20:42:17 +0000199 %call = tail call double @llvm.exp.f64(double %0) nounwind readnone
David Blaikie79e6c742015-02-27 19:29:02 +0000200 %arrayidx2 = getelementptr inbounds double, double* %x, i64 %indvars.iv
Manman Ren16649b02013-05-02 18:11:35 +0000201 store double %call, double* %arrayidx2, align 8
Paul Redmond2adb13c2012-12-09 20:42:17 +0000202 %indvars.iv.next = add i64 %indvars.iv, 1
203 %lftr.wideiv = trunc i64 %indvars.iv.next to i32
204 %exitcond = icmp eq i32 %lftr.wideiv, %n
205 br i1 %exitcond, label %for.end, label %for.body
206
207for.end: ; preds = %for.body, %entry
208 ret void
209}
210
211declare double @llvm.exp.f64(double) nounwind readnone
212
Stephen Linc1c7a132013-07-14 01:42:54 +0000213;CHECK-LABEL: @exp2_f32(
Paul Redmond2adb13c2012-12-09 20:42:17 +0000214;CHECK: llvm.exp2.v4f32
215;CHECK: ret void
216define void @exp2_f32(i32 %n, float* noalias %y, float* noalias %x) nounwind uwtable {
217entry:
218 %cmp6 = icmp sgt i32 %n, 0
219 br i1 %cmp6, label %for.body, label %for.end
220
221for.body: ; preds = %entry, %for.body
222 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
David Blaikie79e6c742015-02-27 19:29:02 +0000223 %arrayidx = getelementptr inbounds float, float* %y, i64 %indvars.iv
David Blaikiea79ac142015-02-27 21:17:42 +0000224 %0 = load float, float* %arrayidx, align 4
Paul Redmond2adb13c2012-12-09 20:42:17 +0000225 %call = tail call float @llvm.exp2.f32(float %0) nounwind readnone
David Blaikie79e6c742015-02-27 19:29:02 +0000226 %arrayidx2 = getelementptr inbounds float, float* %x, i64 %indvars.iv
Manman Ren16649b02013-05-02 18:11:35 +0000227 store float %call, float* %arrayidx2, align 4
Paul Redmond2adb13c2012-12-09 20:42:17 +0000228 %indvars.iv.next = add i64 %indvars.iv, 1
229 %lftr.wideiv = trunc i64 %indvars.iv.next to i32
230 %exitcond = icmp eq i32 %lftr.wideiv, %n
231 br i1 %exitcond, label %for.end, label %for.body
232
233for.end: ; preds = %for.body, %entry
234 ret void
235}
236
237declare float @llvm.exp2.f32(float) nounwind readnone
238
Stephen Linc1c7a132013-07-14 01:42:54 +0000239;CHECK-LABEL: @exp2_f64(
Paul Redmond2adb13c2012-12-09 20:42:17 +0000240;CHECK: llvm.exp2.v4f64
241;CHECK: ret void
242define void @exp2_f64(i32 %n, double* noalias %y, double* noalias %x) nounwind uwtable {
243entry:
244 %cmp6 = icmp sgt i32 %n, 0
245 br i1 %cmp6, label %for.body, label %for.end
246
247for.body: ; preds = %entry, %for.body
248 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
David Blaikie79e6c742015-02-27 19:29:02 +0000249 %arrayidx = getelementptr inbounds double, double* %y, i64 %indvars.iv
David Blaikiea79ac142015-02-27 21:17:42 +0000250 %0 = load double, double* %arrayidx, align 8
Paul Redmond2adb13c2012-12-09 20:42:17 +0000251 %call = tail call double @llvm.exp2.f64(double %0) nounwind readnone
David Blaikie79e6c742015-02-27 19:29:02 +0000252 %arrayidx2 = getelementptr inbounds double, double* %x, i64 %indvars.iv
Manman Ren16649b02013-05-02 18:11:35 +0000253 store double %call, double* %arrayidx2, align 8
Paul Redmond2adb13c2012-12-09 20:42:17 +0000254 %indvars.iv.next = add i64 %indvars.iv, 1
255 %lftr.wideiv = trunc i64 %indvars.iv.next to i32
256 %exitcond = icmp eq i32 %lftr.wideiv, %n
257 br i1 %exitcond, label %for.end, label %for.body
258
259for.end: ; preds = %for.body, %entry
260 ret void
261}
262
263declare double @llvm.exp2.f64(double) nounwind readnone
264
Stephen Linc1c7a132013-07-14 01:42:54 +0000265;CHECK-LABEL: @log_f32(
Paul Redmond2adb13c2012-12-09 20:42:17 +0000266;CHECK: llvm.log.v4f32
267;CHECK: ret void
268define void @log_f32(i32 %n, float* noalias %y, float* noalias %x) nounwind uwtable {
269entry:
270 %cmp6 = icmp sgt i32 %n, 0
271 br i1 %cmp6, label %for.body, label %for.end
272
273for.body: ; preds = %entry, %for.body
274 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
David Blaikie79e6c742015-02-27 19:29:02 +0000275 %arrayidx = getelementptr inbounds float, float* %y, i64 %indvars.iv
David Blaikiea79ac142015-02-27 21:17:42 +0000276 %0 = load float, float* %arrayidx, align 4
Paul Redmond2adb13c2012-12-09 20:42:17 +0000277 %call = tail call float @llvm.log.f32(float %0) nounwind readnone
David Blaikie79e6c742015-02-27 19:29:02 +0000278 %arrayidx2 = getelementptr inbounds float, float* %x, i64 %indvars.iv
Manman Ren16649b02013-05-02 18:11:35 +0000279 store float %call, float* %arrayidx2, align 4
Paul Redmond2adb13c2012-12-09 20:42:17 +0000280 %indvars.iv.next = add i64 %indvars.iv, 1
281 %lftr.wideiv = trunc i64 %indvars.iv.next to i32
282 %exitcond = icmp eq i32 %lftr.wideiv, %n
283 br i1 %exitcond, label %for.end, label %for.body
284
285for.end: ; preds = %for.body, %entry
286 ret void
287}
288
289declare float @llvm.log.f32(float) nounwind readnone
290
Stephen Linc1c7a132013-07-14 01:42:54 +0000291;CHECK-LABEL: @log_f64(
Paul Redmond2adb13c2012-12-09 20:42:17 +0000292;CHECK: llvm.log.v4f64
293;CHECK: ret void
294define void @log_f64(i32 %n, double* noalias %y, double* noalias %x) nounwind uwtable {
295entry:
296 %cmp6 = icmp sgt i32 %n, 0
297 br i1 %cmp6, label %for.body, label %for.end
298
299for.body: ; preds = %entry, %for.body
300 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
David Blaikie79e6c742015-02-27 19:29:02 +0000301 %arrayidx = getelementptr inbounds double, double* %y, i64 %indvars.iv
David Blaikiea79ac142015-02-27 21:17:42 +0000302 %0 = load double, double* %arrayidx, align 8
Paul Redmond2adb13c2012-12-09 20:42:17 +0000303 %call = tail call double @llvm.log.f64(double %0) nounwind readnone
David Blaikie79e6c742015-02-27 19:29:02 +0000304 %arrayidx2 = getelementptr inbounds double, double* %x, i64 %indvars.iv
Manman Ren16649b02013-05-02 18:11:35 +0000305 store double %call, double* %arrayidx2, align 8
Paul Redmond2adb13c2012-12-09 20:42:17 +0000306 %indvars.iv.next = add i64 %indvars.iv, 1
307 %lftr.wideiv = trunc i64 %indvars.iv.next to i32
308 %exitcond = icmp eq i32 %lftr.wideiv, %n
309 br i1 %exitcond, label %for.end, label %for.body
310
311for.end: ; preds = %for.body, %entry
312 ret void
313}
314
315declare double @llvm.log.f64(double) nounwind readnone
316
Stephen Linc1c7a132013-07-14 01:42:54 +0000317;CHECK-LABEL: @log10_f32(
Paul Redmond2adb13c2012-12-09 20:42:17 +0000318;CHECK: llvm.log10.v4f32
319;CHECK: ret void
320define void @log10_f32(i32 %n, float* noalias %y, float* noalias %x) nounwind uwtable {
321entry:
322 %cmp6 = icmp sgt i32 %n, 0
323 br i1 %cmp6, label %for.body, label %for.end
324
325for.body: ; preds = %entry, %for.body
326 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
David Blaikie79e6c742015-02-27 19:29:02 +0000327 %arrayidx = getelementptr inbounds float, float* %y, i64 %indvars.iv
David Blaikiea79ac142015-02-27 21:17:42 +0000328 %0 = load float, float* %arrayidx, align 4
Paul Redmond2adb13c2012-12-09 20:42:17 +0000329 %call = tail call float @llvm.log10.f32(float %0) nounwind readnone
David Blaikie79e6c742015-02-27 19:29:02 +0000330 %arrayidx2 = getelementptr inbounds float, float* %x, i64 %indvars.iv
Manman Ren16649b02013-05-02 18:11:35 +0000331 store float %call, float* %arrayidx2, align 4
Paul Redmond2adb13c2012-12-09 20:42:17 +0000332 %indvars.iv.next = add i64 %indvars.iv, 1
333 %lftr.wideiv = trunc i64 %indvars.iv.next to i32
334 %exitcond = icmp eq i32 %lftr.wideiv, %n
335 br i1 %exitcond, label %for.end, label %for.body
336
337for.end: ; preds = %for.body, %entry
338 ret void
339}
340
341declare float @llvm.log10.f32(float) nounwind readnone
342
Stephen Linc1c7a132013-07-14 01:42:54 +0000343;CHECK-LABEL: @log10_f64(
Paul Redmond2adb13c2012-12-09 20:42:17 +0000344;CHECK: llvm.log10.v4f64
345;CHECK: ret void
346define void @log10_f64(i32 %n, double* noalias %y, double* noalias %x) nounwind uwtable {
347entry:
348 %cmp6 = icmp sgt i32 %n, 0
349 br i1 %cmp6, label %for.body, label %for.end
350
351for.body: ; preds = %entry, %for.body
352 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
David Blaikie79e6c742015-02-27 19:29:02 +0000353 %arrayidx = getelementptr inbounds double, double* %y, i64 %indvars.iv
David Blaikiea79ac142015-02-27 21:17:42 +0000354 %0 = load double, double* %arrayidx, align 8
Paul Redmond2adb13c2012-12-09 20:42:17 +0000355 %call = tail call double @llvm.log10.f64(double %0) nounwind readnone
David Blaikie79e6c742015-02-27 19:29:02 +0000356 %arrayidx2 = getelementptr inbounds double, double* %x, i64 %indvars.iv
Manman Ren16649b02013-05-02 18:11:35 +0000357 store double %call, double* %arrayidx2, align 8
Paul Redmond2adb13c2012-12-09 20:42:17 +0000358 %indvars.iv.next = add i64 %indvars.iv, 1
359 %lftr.wideiv = trunc i64 %indvars.iv.next to i32
360 %exitcond = icmp eq i32 %lftr.wideiv, %n
361 br i1 %exitcond, label %for.end, label %for.body
362
363for.end: ; preds = %for.body, %entry
364 ret void
365}
366
367declare double @llvm.log10.f64(double) nounwind readnone
368
Stephen Linc1c7a132013-07-14 01:42:54 +0000369;CHECK-LABEL: @log2_f32(
Paul Redmond2adb13c2012-12-09 20:42:17 +0000370;CHECK: llvm.log2.v4f32
371;CHECK: ret void
372define void @log2_f32(i32 %n, float* noalias %y, float* noalias %x) nounwind uwtable {
373entry:
374 %cmp6 = icmp sgt i32 %n, 0
375 br i1 %cmp6, label %for.body, label %for.end
376
377for.body: ; preds = %entry, %for.body
378 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
David Blaikie79e6c742015-02-27 19:29:02 +0000379 %arrayidx = getelementptr inbounds float, float* %y, i64 %indvars.iv
David Blaikiea79ac142015-02-27 21:17:42 +0000380 %0 = load float, float* %arrayidx, align 4
Paul Redmond2adb13c2012-12-09 20:42:17 +0000381 %call = tail call float @llvm.log2.f32(float %0) nounwind readnone
David Blaikie79e6c742015-02-27 19:29:02 +0000382 %arrayidx2 = getelementptr inbounds float, float* %x, i64 %indvars.iv
Manman Ren16649b02013-05-02 18:11:35 +0000383 store float %call, float* %arrayidx2, align 4
Paul Redmond2adb13c2012-12-09 20:42:17 +0000384 %indvars.iv.next = add i64 %indvars.iv, 1
385 %lftr.wideiv = trunc i64 %indvars.iv.next to i32
386 %exitcond = icmp eq i32 %lftr.wideiv, %n
387 br i1 %exitcond, label %for.end, label %for.body
388
389for.end: ; preds = %for.body, %entry
390 ret void
391}
392
393declare float @llvm.log2.f32(float) nounwind readnone
394
Stephen Linc1c7a132013-07-14 01:42:54 +0000395;CHECK-LABEL: @log2_f64(
Paul Redmond2adb13c2012-12-09 20:42:17 +0000396;CHECK: llvm.log2.v4f64
397;CHECK: ret void
398define void @log2_f64(i32 %n, double* noalias %y, double* noalias %x) nounwind uwtable {
399entry:
400 %cmp6 = icmp sgt i32 %n, 0
401 br i1 %cmp6, label %for.body, label %for.end
402
403for.body: ; preds = %entry, %for.body
404 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
David Blaikie79e6c742015-02-27 19:29:02 +0000405 %arrayidx = getelementptr inbounds double, double* %y, i64 %indvars.iv
David Blaikiea79ac142015-02-27 21:17:42 +0000406 %0 = load double, double* %arrayidx, align 8
Paul Redmond2adb13c2012-12-09 20:42:17 +0000407 %call = tail call double @llvm.log2.f64(double %0) nounwind readnone
David Blaikie79e6c742015-02-27 19:29:02 +0000408 %arrayidx2 = getelementptr inbounds double, double* %x, i64 %indvars.iv
Manman Ren16649b02013-05-02 18:11:35 +0000409 store double %call, double* %arrayidx2, align 8
Paul Redmond2adb13c2012-12-09 20:42:17 +0000410 %indvars.iv.next = add i64 %indvars.iv, 1
411 %lftr.wideiv = trunc i64 %indvars.iv.next to i32
412 %exitcond = icmp eq i32 %lftr.wideiv, %n
413 br i1 %exitcond, label %for.end, label %for.body
414
415for.end: ; preds = %for.body, %entry
416 ret void
417}
418
419declare double @llvm.log2.f64(double) nounwind readnone
420
Stephen Linc1c7a132013-07-14 01:42:54 +0000421;CHECK-LABEL: @fabs_f32(
Paul Redmond2adb13c2012-12-09 20:42:17 +0000422;CHECK: llvm.fabs.v4f32
423;CHECK: ret void
424define void @fabs_f32(i32 %n, float* noalias %y, float* noalias %x) nounwind uwtable {
425entry:
426 %cmp6 = icmp sgt i32 %n, 0
427 br i1 %cmp6, label %for.body, label %for.end
428
429for.body: ; preds = %entry, %for.body
430 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
David Blaikie79e6c742015-02-27 19:29:02 +0000431 %arrayidx = getelementptr inbounds float, float* %y, i64 %indvars.iv
David Blaikiea79ac142015-02-27 21:17:42 +0000432 %0 = load float, float* %arrayidx, align 4
Paul Redmond2adb13c2012-12-09 20:42:17 +0000433 %call = tail call float @llvm.fabs.f32(float %0) nounwind readnone
David Blaikie79e6c742015-02-27 19:29:02 +0000434 %arrayidx2 = getelementptr inbounds float, float* %x, i64 %indvars.iv
Manman Ren16649b02013-05-02 18:11:35 +0000435 store float %call, float* %arrayidx2, align 4
Paul Redmond2adb13c2012-12-09 20:42:17 +0000436 %indvars.iv.next = add i64 %indvars.iv, 1
437 %lftr.wideiv = trunc i64 %indvars.iv.next to i32
438 %exitcond = icmp eq i32 %lftr.wideiv, %n
439 br i1 %exitcond, label %for.end, label %for.body
440
441for.end: ; preds = %for.body, %entry
442 ret void
443}
444
445declare float @llvm.fabs.f32(float) nounwind readnone
446
447define void @fabs_f64(i32 %n, double* noalias %y, double* noalias %x) nounwind uwtable {
448entry:
449 %cmp6 = icmp sgt i32 %n, 0
450 br i1 %cmp6, label %for.body, label %for.end
451
452for.body: ; preds = %entry, %for.body
453 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
David Blaikie79e6c742015-02-27 19:29:02 +0000454 %arrayidx = getelementptr inbounds double, double* %y, i64 %indvars.iv
David Blaikiea79ac142015-02-27 21:17:42 +0000455 %0 = load double, double* %arrayidx, align 8
Paul Redmond2adb13c2012-12-09 20:42:17 +0000456 %call = tail call double @llvm.fabs(double %0) nounwind readnone
David Blaikie79e6c742015-02-27 19:29:02 +0000457 %arrayidx2 = getelementptr inbounds double, double* %x, i64 %indvars.iv
Manman Ren16649b02013-05-02 18:11:35 +0000458 store double %call, double* %arrayidx2, align 8
Paul Redmond2adb13c2012-12-09 20:42:17 +0000459 %indvars.iv.next = add i64 %indvars.iv, 1
460 %lftr.wideiv = trunc i64 %indvars.iv.next to i32
461 %exitcond = icmp eq i32 %lftr.wideiv, %n
462 br i1 %exitcond, label %for.end, label %for.body
463
464for.end: ; preds = %for.body, %entry
465 ret void
466}
467
468declare double @llvm.fabs(double) nounwind readnone
469
Hal Finkel0c5c01aa2013-08-19 23:35:46 +0000470;CHECK-LABEL: @copysign_f32(
471;CHECK: llvm.copysign.v4f32
472;CHECK: ret void
473define void @copysign_f32(i32 %n, float* noalias %y, float* noalias %x, float* noalias %z) nounwind uwtable {
474entry:
475 %cmp6 = icmp sgt i32 %n, 0
476 br i1 %cmp6, label %for.body, label %for.end
477
478for.body: ; preds = %entry, %for.body
479 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
David Blaikie79e6c742015-02-27 19:29:02 +0000480 %arrayidx = getelementptr inbounds float, float* %y, i64 %indvars.iv
David Blaikiea79ac142015-02-27 21:17:42 +0000481 %0 = load float, float* %arrayidx, align 4
David Blaikie79e6c742015-02-27 19:29:02 +0000482 %arrayidx1 = getelementptr inbounds float, float* %z, i64 %indvars.iv
David Blaikiea79ac142015-02-27 21:17:42 +0000483 %1 = load float, float* %arrayidx1, align 4
Hal Finkel0c5c01aa2013-08-19 23:35:46 +0000484 %call = tail call float @llvm.copysign.f32(float %0, float %1) nounwind readnone
David Blaikie79e6c742015-02-27 19:29:02 +0000485 %arrayidx2 = getelementptr inbounds float, float* %x, i64 %indvars.iv
Hal Finkel0c5c01aa2013-08-19 23:35:46 +0000486 store float %call, float* %arrayidx2, align 4
487 %indvars.iv.next = add i64 %indvars.iv, 1
488 %lftr.wideiv = trunc i64 %indvars.iv.next to i32
489 %exitcond = icmp eq i32 %lftr.wideiv, %n
490 br i1 %exitcond, label %for.end, label %for.body
491
492for.end: ; preds = %for.body, %entry
493 ret void
494}
495
496declare float @llvm.copysign.f32(float, float) nounwind readnone
497
498define void @copysign_f64(i32 %n, double* noalias %y, double* noalias %x, double* noalias %z) nounwind uwtable {
499entry:
500 %cmp6 = icmp sgt i32 %n, 0
501 br i1 %cmp6, label %for.body, label %for.end
502
503for.body: ; preds = %entry, %for.body
504 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
David Blaikie79e6c742015-02-27 19:29:02 +0000505 %arrayidx = getelementptr inbounds double, double* %y, i64 %indvars.iv
David Blaikiea79ac142015-02-27 21:17:42 +0000506 %0 = load double, double* %arrayidx, align 8
David Blaikie79e6c742015-02-27 19:29:02 +0000507 %arrayidx1 = getelementptr inbounds double, double* %z, i64 %indvars.iv
David Blaikiea79ac142015-02-27 21:17:42 +0000508 %1 = load double, double* %arrayidx, align 8
Hal Finkel0c5c01aa2013-08-19 23:35:46 +0000509 %call = tail call double @llvm.copysign(double %0, double %1) nounwind readnone
David Blaikie79e6c742015-02-27 19:29:02 +0000510 %arrayidx2 = getelementptr inbounds double, double* %x, i64 %indvars.iv
Hal Finkel0c5c01aa2013-08-19 23:35:46 +0000511 store double %call, double* %arrayidx2, align 8
512 %indvars.iv.next = add i64 %indvars.iv, 1
513 %lftr.wideiv = trunc i64 %indvars.iv.next to i32
514 %exitcond = icmp eq i32 %lftr.wideiv, %n
515 br i1 %exitcond, label %for.end, label %for.body
516
517for.end: ; preds = %for.body, %entry
518 ret void
519}
520
521declare double @llvm.copysign(double, double) nounwind readnone
522
Stephen Linc1c7a132013-07-14 01:42:54 +0000523;CHECK-LABEL: @floor_f32(
Paul Redmond2adb13c2012-12-09 20:42:17 +0000524;CHECK: llvm.floor.v4f32
525;CHECK: ret void
526define void @floor_f32(i32 %n, float* noalias %y, float* noalias %x) nounwind uwtable {
527entry:
528 %cmp6 = icmp sgt i32 %n, 0
529 br i1 %cmp6, label %for.body, label %for.end
530
531for.body: ; preds = %entry, %for.body
532 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
David Blaikie79e6c742015-02-27 19:29:02 +0000533 %arrayidx = getelementptr inbounds float, float* %y, i64 %indvars.iv
David Blaikiea79ac142015-02-27 21:17:42 +0000534 %0 = load float, float* %arrayidx, align 4
Paul Redmond2adb13c2012-12-09 20:42:17 +0000535 %call = tail call float @llvm.floor.f32(float %0) nounwind readnone
David Blaikie79e6c742015-02-27 19:29:02 +0000536 %arrayidx2 = getelementptr inbounds float, float* %x, i64 %indvars.iv
Manman Ren16649b02013-05-02 18:11:35 +0000537 store float %call, float* %arrayidx2, align 4
Paul Redmond2adb13c2012-12-09 20:42:17 +0000538 %indvars.iv.next = add i64 %indvars.iv, 1
539 %lftr.wideiv = trunc i64 %indvars.iv.next to i32
540 %exitcond = icmp eq i32 %lftr.wideiv, %n
541 br i1 %exitcond, label %for.end, label %for.body
542
543for.end: ; preds = %for.body, %entry
544 ret void
545}
546
547declare float @llvm.floor.f32(float) nounwind readnone
548
Stephen Linc1c7a132013-07-14 01:42:54 +0000549;CHECK-LABEL: @floor_f64(
Paul Redmond2adb13c2012-12-09 20:42:17 +0000550;CHECK: llvm.floor.v4f64
551;CHECK: ret void
552define void @floor_f64(i32 %n, double* noalias %y, double* noalias %x) nounwind uwtable {
553entry:
554 %cmp6 = icmp sgt i32 %n, 0
555 br i1 %cmp6, label %for.body, label %for.end
556
557for.body: ; preds = %entry, %for.body
558 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
David Blaikie79e6c742015-02-27 19:29:02 +0000559 %arrayidx = getelementptr inbounds double, double* %y, i64 %indvars.iv
David Blaikiea79ac142015-02-27 21:17:42 +0000560 %0 = load double, double* %arrayidx, align 8
Paul Redmond2adb13c2012-12-09 20:42:17 +0000561 %call = tail call double @llvm.floor.f64(double %0) nounwind readnone
David Blaikie79e6c742015-02-27 19:29:02 +0000562 %arrayidx2 = getelementptr inbounds double, double* %x, i64 %indvars.iv
Manman Ren16649b02013-05-02 18:11:35 +0000563 store double %call, double* %arrayidx2, align 8
Paul Redmond2adb13c2012-12-09 20:42:17 +0000564 %indvars.iv.next = add i64 %indvars.iv, 1
565 %lftr.wideiv = trunc i64 %indvars.iv.next to i32
566 %exitcond = icmp eq i32 %lftr.wideiv, %n
567 br i1 %exitcond, label %for.end, label %for.body
568
569for.end: ; preds = %for.body, %entry
570 ret void
571}
572
573declare double @llvm.floor.f64(double) nounwind readnone
574
Stephen Linc1c7a132013-07-14 01:42:54 +0000575;CHECK-LABEL: @ceil_f32(
Paul Redmond2adb13c2012-12-09 20:42:17 +0000576;CHECK: llvm.ceil.v4f32
577;CHECK: ret void
578define void @ceil_f32(i32 %n, float* noalias %y, float* noalias %x) nounwind uwtable {
579entry:
580 %cmp6 = icmp sgt i32 %n, 0
581 br i1 %cmp6, label %for.body, label %for.end
582
583for.body: ; preds = %entry, %for.body
584 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
David Blaikie79e6c742015-02-27 19:29:02 +0000585 %arrayidx = getelementptr inbounds float, float* %y, i64 %indvars.iv
David Blaikiea79ac142015-02-27 21:17:42 +0000586 %0 = load float, float* %arrayidx, align 4
Paul Redmond2adb13c2012-12-09 20:42:17 +0000587 %call = tail call float @llvm.ceil.f32(float %0) nounwind readnone
David Blaikie79e6c742015-02-27 19:29:02 +0000588 %arrayidx2 = getelementptr inbounds float, float* %x, i64 %indvars.iv
Manman Ren16649b02013-05-02 18:11:35 +0000589 store float %call, float* %arrayidx2, align 4
Paul Redmond2adb13c2012-12-09 20:42:17 +0000590 %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 float @llvm.ceil.f32(float) nounwind readnone
600
Stephen Linc1c7a132013-07-14 01:42:54 +0000601;CHECK-LABEL: @ceil_f64(
Paul Redmond2adb13c2012-12-09 20:42:17 +0000602;CHECK: llvm.ceil.v4f64
603;CHECK: ret void
604define void @ceil_f64(i32 %n, double* noalias %y, double* noalias %x) nounwind uwtable {
605entry:
606 %cmp6 = icmp sgt i32 %n, 0
607 br i1 %cmp6, label %for.body, label %for.end
608
609for.body: ; preds = %entry, %for.body
610 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
David Blaikie79e6c742015-02-27 19:29:02 +0000611 %arrayidx = getelementptr inbounds double, double* %y, i64 %indvars.iv
David Blaikiea79ac142015-02-27 21:17:42 +0000612 %0 = load double, double* %arrayidx, align 8
Paul Redmond2adb13c2012-12-09 20:42:17 +0000613 %call = tail call double @llvm.ceil.f64(double %0) nounwind readnone
David Blaikie79e6c742015-02-27 19:29:02 +0000614 %arrayidx2 = getelementptr inbounds double, double* %x, i64 %indvars.iv
Manman Ren16649b02013-05-02 18:11:35 +0000615 store double %call, double* %arrayidx2, align 8
Paul Redmond2adb13c2012-12-09 20:42:17 +0000616 %indvars.iv.next = add i64 %indvars.iv, 1
617 %lftr.wideiv = trunc i64 %indvars.iv.next to i32
618 %exitcond = icmp eq i32 %lftr.wideiv, %n
619 br i1 %exitcond, label %for.end, label %for.body
620
621for.end: ; preds = %for.body, %entry
622 ret void
623}
624
625declare double @llvm.ceil.f64(double) nounwind readnone
626
Stephen Linc1c7a132013-07-14 01:42:54 +0000627;CHECK-LABEL: @trunc_f32(
Paul Redmond2adb13c2012-12-09 20:42:17 +0000628;CHECK: llvm.trunc.v4f32
629;CHECK: ret void
630define void @trunc_f32(i32 %n, float* noalias %y, float* noalias %x) nounwind uwtable {
631entry:
632 %cmp6 = icmp sgt i32 %n, 0
633 br i1 %cmp6, label %for.body, label %for.end
634
635for.body: ; preds = %entry, %for.body
636 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
David Blaikie79e6c742015-02-27 19:29:02 +0000637 %arrayidx = getelementptr inbounds float, float* %y, i64 %indvars.iv
David Blaikiea79ac142015-02-27 21:17:42 +0000638 %0 = load float, float* %arrayidx, align 4
Paul Redmond2adb13c2012-12-09 20:42:17 +0000639 %call = tail call float @llvm.trunc.f32(float %0) nounwind readnone
David Blaikie79e6c742015-02-27 19:29:02 +0000640 %arrayidx2 = getelementptr inbounds float, float* %x, i64 %indvars.iv
Manman Ren16649b02013-05-02 18:11:35 +0000641 store float %call, float* %arrayidx2, align 4
Paul Redmond2adb13c2012-12-09 20:42:17 +0000642 %indvars.iv.next = add i64 %indvars.iv, 1
643 %lftr.wideiv = trunc i64 %indvars.iv.next to i32
644 %exitcond = icmp eq i32 %lftr.wideiv, %n
645 br i1 %exitcond, label %for.end, label %for.body
646
647for.end: ; preds = %for.body, %entry
648 ret void
649}
650
651declare float @llvm.trunc.f32(float) nounwind readnone
652
Stephen Linc1c7a132013-07-14 01:42:54 +0000653;CHECK-LABEL: @trunc_f64(
Paul Redmond2adb13c2012-12-09 20:42:17 +0000654;CHECK: llvm.trunc.v4f64
655;CHECK: ret void
656define void @trunc_f64(i32 %n, double* noalias %y, double* noalias %x) nounwind uwtable {
657entry:
658 %cmp6 = icmp sgt i32 %n, 0
659 br i1 %cmp6, label %for.body, label %for.end
660
661for.body: ; preds = %entry, %for.body
662 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
David Blaikie79e6c742015-02-27 19:29:02 +0000663 %arrayidx = getelementptr inbounds double, double* %y, i64 %indvars.iv
David Blaikiea79ac142015-02-27 21:17:42 +0000664 %0 = load double, double* %arrayidx, align 8
Paul Redmond2adb13c2012-12-09 20:42:17 +0000665 %call = tail call double @llvm.trunc.f64(double %0) nounwind readnone
David Blaikie79e6c742015-02-27 19:29:02 +0000666 %arrayidx2 = getelementptr inbounds double, double* %x, i64 %indvars.iv
Manman Ren16649b02013-05-02 18:11:35 +0000667 store double %call, double* %arrayidx2, align 8
Paul Redmond2adb13c2012-12-09 20:42:17 +0000668 %indvars.iv.next = add i64 %indvars.iv, 1
669 %lftr.wideiv = trunc i64 %indvars.iv.next to i32
670 %exitcond = icmp eq i32 %lftr.wideiv, %n
671 br i1 %exitcond, label %for.end, label %for.body
672
673for.end: ; preds = %for.body, %entry
674 ret void
675}
676
677declare double @llvm.trunc.f64(double) nounwind readnone
678
Stephen Linc1c7a132013-07-14 01:42:54 +0000679;CHECK-LABEL: @rint_f32(
Paul Redmond2adb13c2012-12-09 20:42:17 +0000680;CHECK: llvm.rint.v4f32
681;CHECK: ret void
682define void @rint_f32(i32 %n, float* noalias %y, float* noalias %x) nounwind uwtable {
683entry:
684 %cmp6 = icmp sgt i32 %n, 0
685 br i1 %cmp6, label %for.body, label %for.end
686
687for.body: ; preds = %entry, %for.body
688 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
David Blaikie79e6c742015-02-27 19:29:02 +0000689 %arrayidx = getelementptr inbounds float, float* %y, i64 %indvars.iv
David Blaikiea79ac142015-02-27 21:17:42 +0000690 %0 = load float, float* %arrayidx, align 4
Paul Redmond2adb13c2012-12-09 20:42:17 +0000691 %call = tail call float @llvm.rint.f32(float %0) nounwind readnone
David Blaikie79e6c742015-02-27 19:29:02 +0000692 %arrayidx2 = getelementptr inbounds float, float* %x, i64 %indvars.iv
Manman Ren16649b02013-05-02 18:11:35 +0000693 store float %call, float* %arrayidx2, align 4
Paul Redmond2adb13c2012-12-09 20:42:17 +0000694 %indvars.iv.next = add i64 %indvars.iv, 1
695 %lftr.wideiv = trunc i64 %indvars.iv.next to i32
696 %exitcond = icmp eq i32 %lftr.wideiv, %n
697 br i1 %exitcond, label %for.end, label %for.body
698
699for.end: ; preds = %for.body, %entry
700 ret void
701}
702
703declare float @llvm.rint.f32(float) nounwind readnone
704
Stephen Linc1c7a132013-07-14 01:42:54 +0000705;CHECK-LABEL: @rint_f64(
Paul Redmond2adb13c2012-12-09 20:42:17 +0000706;CHECK: llvm.rint.v4f64
707;CHECK: ret void
708define void @rint_f64(i32 %n, double* noalias %y, double* noalias %x) nounwind uwtable {
709entry:
710 %cmp6 = icmp sgt i32 %n, 0
711 br i1 %cmp6, label %for.body, label %for.end
712
713for.body: ; preds = %entry, %for.body
714 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
David Blaikie79e6c742015-02-27 19:29:02 +0000715 %arrayidx = getelementptr inbounds double, double* %y, i64 %indvars.iv
David Blaikiea79ac142015-02-27 21:17:42 +0000716 %0 = load double, double* %arrayidx, align 8
Paul Redmond2adb13c2012-12-09 20:42:17 +0000717 %call = tail call double @llvm.rint.f64(double %0) nounwind readnone
David Blaikie79e6c742015-02-27 19:29:02 +0000718 %arrayidx2 = getelementptr inbounds double, double* %x, i64 %indvars.iv
Manman Ren16649b02013-05-02 18:11:35 +0000719 store double %call, double* %arrayidx2, align 8
Paul Redmond2adb13c2012-12-09 20:42:17 +0000720 %indvars.iv.next = add i64 %indvars.iv, 1
721 %lftr.wideiv = trunc i64 %indvars.iv.next to i32
722 %exitcond = icmp eq i32 %lftr.wideiv, %n
723 br i1 %exitcond, label %for.end, label %for.body
724
725for.end: ; preds = %for.body, %entry
726 ret void
727}
728
729declare double @llvm.rint.f64(double) nounwind readnone
730
Stephen Linc1c7a132013-07-14 01:42:54 +0000731;CHECK-LABEL: @nearbyint_f32(
Paul Redmond2adb13c2012-12-09 20:42:17 +0000732;CHECK: llvm.nearbyint.v4f32
733;CHECK: ret void
734define void @nearbyint_f32(i32 %n, float* noalias %y, float* noalias %x) nounwind uwtable {
735entry:
736 %cmp6 = icmp sgt i32 %n, 0
737 br i1 %cmp6, label %for.body, label %for.end
738
739for.body: ; preds = %entry, %for.body
740 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
David Blaikie79e6c742015-02-27 19:29:02 +0000741 %arrayidx = getelementptr inbounds float, float* %y, i64 %indvars.iv
David Blaikiea79ac142015-02-27 21:17:42 +0000742 %0 = load float, float* %arrayidx, align 4
Paul Redmond2adb13c2012-12-09 20:42:17 +0000743 %call = tail call float @llvm.nearbyint.f32(float %0) nounwind readnone
David Blaikie79e6c742015-02-27 19:29:02 +0000744 %arrayidx2 = getelementptr inbounds float, float* %x, i64 %indvars.iv
Manman Ren16649b02013-05-02 18:11:35 +0000745 store float %call, float* %arrayidx2, align 4
Paul Redmond2adb13c2012-12-09 20:42:17 +0000746 %indvars.iv.next = add i64 %indvars.iv, 1
747 %lftr.wideiv = trunc i64 %indvars.iv.next to i32
748 %exitcond = icmp eq i32 %lftr.wideiv, %n
749 br i1 %exitcond, label %for.end, label %for.body
750
751for.end: ; preds = %for.body, %entry
752 ret void
753}
754
755declare float @llvm.nearbyint.f32(float) nounwind readnone
756
Stephen Linc1c7a132013-07-14 01:42:54 +0000757;CHECK-LABEL: @nearbyint_f64(
Paul Redmond2adb13c2012-12-09 20:42:17 +0000758;CHECK: llvm.nearbyint.v4f64
759;CHECK: ret void
760define void @nearbyint_f64(i32 %n, double* noalias %y, double* noalias %x) nounwind uwtable {
761entry:
762 %cmp6 = icmp sgt i32 %n, 0
763 br i1 %cmp6, label %for.body, label %for.end
764
765for.body: ; preds = %entry, %for.body
766 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
David Blaikie79e6c742015-02-27 19:29:02 +0000767 %arrayidx = getelementptr inbounds double, double* %y, i64 %indvars.iv
David Blaikiea79ac142015-02-27 21:17:42 +0000768 %0 = load double, double* %arrayidx, align 8
Paul Redmond2adb13c2012-12-09 20:42:17 +0000769 %call = tail call double @llvm.nearbyint.f64(double %0) nounwind readnone
David Blaikie79e6c742015-02-27 19:29:02 +0000770 %arrayidx2 = getelementptr inbounds double, double* %x, i64 %indvars.iv
Manman Ren16649b02013-05-02 18:11:35 +0000771 store double %call, double* %arrayidx2, align 8
Paul Redmond2adb13c2012-12-09 20:42:17 +0000772 %indvars.iv.next = add i64 %indvars.iv, 1
773 %lftr.wideiv = trunc i64 %indvars.iv.next to i32
774 %exitcond = icmp eq i32 %lftr.wideiv, %n
775 br i1 %exitcond, label %for.end, label %for.body
776
777for.end: ; preds = %for.body, %entry
778 ret void
779}
780
781declare double @llvm.nearbyint.f64(double) nounwind readnone
782
Hal Finkel171817e2013-08-07 22:49:12 +0000783;CHECK-LABEL: @round_f32(
784;CHECK: llvm.round.v4f32
785;CHECK: ret void
786define void @round_f32(i32 %n, float* noalias %y, float* noalias %x) nounwind uwtable {
787entry:
788 %cmp6 = icmp sgt i32 %n, 0
789 br i1 %cmp6, label %for.body, label %for.end
790
791for.body: ; preds = %entry, %for.body
792 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
David Blaikie79e6c742015-02-27 19:29:02 +0000793 %arrayidx = getelementptr inbounds float, float* %y, i64 %indvars.iv
David Blaikiea79ac142015-02-27 21:17:42 +0000794 %0 = load float, float* %arrayidx, align 4
Hal Finkel171817e2013-08-07 22:49:12 +0000795 %call = tail call float @llvm.round.f32(float %0) nounwind readnone
David Blaikie79e6c742015-02-27 19:29:02 +0000796 %arrayidx2 = getelementptr inbounds float, float* %x, i64 %indvars.iv
Hal Finkel171817e2013-08-07 22:49:12 +0000797 store float %call, float* %arrayidx2, align 4
798 %indvars.iv.next = add i64 %indvars.iv, 1
799 %lftr.wideiv = trunc i64 %indvars.iv.next to i32
800 %exitcond = icmp eq i32 %lftr.wideiv, %n
801 br i1 %exitcond, label %for.end, label %for.body
802
803for.end: ; preds = %for.body, %entry
804 ret void
805}
806
807declare float @llvm.round.f32(float) nounwind readnone
808
809;CHECK-LABEL: @round_f64(
810;CHECK: llvm.round.v4f64
811;CHECK: ret void
812define void @round_f64(i32 %n, double* noalias %y, double* noalias %x) nounwind uwtable {
813entry:
814 %cmp6 = icmp sgt i32 %n, 0
815 br i1 %cmp6, label %for.body, label %for.end
816
817for.body: ; preds = %entry, %for.body
818 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
David Blaikie79e6c742015-02-27 19:29:02 +0000819 %arrayidx = getelementptr inbounds double, double* %y, i64 %indvars.iv
David Blaikiea79ac142015-02-27 21:17:42 +0000820 %0 = load double, double* %arrayidx, align 8
Hal Finkel171817e2013-08-07 22:49:12 +0000821 %call = tail call double @llvm.round.f64(double %0) nounwind readnone
David Blaikie79e6c742015-02-27 19:29:02 +0000822 %arrayidx2 = getelementptr inbounds double, double* %x, i64 %indvars.iv
Hal Finkel171817e2013-08-07 22:49:12 +0000823 store double %call, double* %arrayidx2, align 8
824 %indvars.iv.next = add i64 %indvars.iv, 1
825 %lftr.wideiv = trunc i64 %indvars.iv.next to i32
826 %exitcond = icmp eq i32 %lftr.wideiv, %n
827 br i1 %exitcond, label %for.end, label %for.body
828
829for.end: ; preds = %for.body, %entry
830 ret void
831}
832
833declare double @llvm.round.f64(double) nounwind readnone
834
Stephen Linc1c7a132013-07-14 01:42:54 +0000835;CHECK-LABEL: @fma_f32(
Paul Redmond2adb13c2012-12-09 20:42:17 +0000836;CHECK: llvm.fma.v4f32
837;CHECK: ret void
838define void @fma_f32(i32 %n, float* noalias %y, float* noalias %x, float* noalias %z, float* noalias %w) nounwind uwtable {
839entry:
840 %cmp12 = icmp sgt i32 %n, 0
841 br i1 %cmp12, label %for.body, label %for.end
842
843for.body: ; preds = %entry, %for.body
844 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
David Blaikie79e6c742015-02-27 19:29:02 +0000845 %arrayidx = getelementptr inbounds float, float* %y, i64 %indvars.iv
David Blaikiea79ac142015-02-27 21:17:42 +0000846 %0 = load float, float* %arrayidx, align 4
David Blaikie79e6c742015-02-27 19:29:02 +0000847 %arrayidx2 = getelementptr inbounds float, float* %w, i64 %indvars.iv
David Blaikiea79ac142015-02-27 21:17:42 +0000848 %1 = load float, float* %arrayidx2, align 4
David Blaikie79e6c742015-02-27 19:29:02 +0000849 %arrayidx4 = getelementptr inbounds float, float* %z, i64 %indvars.iv
David Blaikiea79ac142015-02-27 21:17:42 +0000850 %2 = load float, float* %arrayidx4, align 4
Paul Redmond2adb13c2012-12-09 20:42:17 +0000851 %3 = tail call float @llvm.fma.f32(float %0, float %2, float %1)
David Blaikie79e6c742015-02-27 19:29:02 +0000852 %arrayidx6 = getelementptr inbounds float, float* %x, i64 %indvars.iv
Manman Ren16649b02013-05-02 18:11:35 +0000853 store float %3, float* %arrayidx6, align 4
Paul Redmond2adb13c2012-12-09 20:42:17 +0000854 %indvars.iv.next = add i64 %indvars.iv, 1
855 %lftr.wideiv = trunc i64 %indvars.iv.next to i32
856 %exitcond = icmp eq i32 %lftr.wideiv, %n
857 br i1 %exitcond, label %for.end, label %for.body
858
859for.end: ; preds = %for.body, %entry
860 ret void
861}
862
863declare float @llvm.fma.f32(float, float, float) nounwind readnone
864
Stephen Linc1c7a132013-07-14 01:42:54 +0000865;CHECK-LABEL: @fma_f64(
Paul Redmond2adb13c2012-12-09 20:42:17 +0000866;CHECK: llvm.fma.v4f64
867;CHECK: ret void
868define void @fma_f64(i32 %n, double* noalias %y, double* noalias %x, double* noalias %z, double* noalias %w) nounwind uwtable {
869entry:
870 %cmp12 = icmp sgt i32 %n, 0
871 br i1 %cmp12, label %for.body, label %for.end
872
873for.body: ; preds = %entry, %for.body
874 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
David Blaikie79e6c742015-02-27 19:29:02 +0000875 %arrayidx = getelementptr inbounds double, double* %y, i64 %indvars.iv
David Blaikiea79ac142015-02-27 21:17:42 +0000876 %0 = load double, double* %arrayidx, align 8
David Blaikie79e6c742015-02-27 19:29:02 +0000877 %arrayidx2 = getelementptr inbounds double, double* %w, i64 %indvars.iv
David Blaikiea79ac142015-02-27 21:17:42 +0000878 %1 = load double, double* %arrayidx2, align 8
David Blaikie79e6c742015-02-27 19:29:02 +0000879 %arrayidx4 = getelementptr inbounds double, double* %z, i64 %indvars.iv
David Blaikiea79ac142015-02-27 21:17:42 +0000880 %2 = load double, double* %arrayidx4, align 8
Paul Redmond2adb13c2012-12-09 20:42:17 +0000881 %3 = tail call double @llvm.fma.f64(double %0, double %2, double %1)
David Blaikie79e6c742015-02-27 19:29:02 +0000882 %arrayidx6 = getelementptr inbounds double, double* %x, i64 %indvars.iv
Manman Ren16649b02013-05-02 18:11:35 +0000883 store double %3, double* %arrayidx6, align 8
Paul Redmond2adb13c2012-12-09 20:42:17 +0000884 %indvars.iv.next = add i64 %indvars.iv, 1
885 %lftr.wideiv = trunc i64 %indvars.iv.next to i32
886 %exitcond = icmp eq i32 %lftr.wideiv, %n
887 br i1 %exitcond, label %for.end, label %for.body
888
889for.end: ; preds = %for.body, %entry
890 ret void
891}
892
893declare double @llvm.fma.f64(double, double, double) nounwind readnone
894
Stephen Linc1c7a132013-07-14 01:42:54 +0000895;CHECK-LABEL: @fmuladd_f32(
Hal Finkelb44f8902012-12-25 23:21:29 +0000896;CHECK: llvm.fmuladd.v4f32
897;CHECK: ret void
898define void @fmuladd_f32(i32 %n, float* noalias %y, float* noalias %x, float* noalias %z, float* noalias %w) nounwind uwtable {
899entry:
900 %cmp12 = icmp sgt i32 %n, 0
901 br i1 %cmp12, label %for.body, label %for.end
902
903for.body: ; preds = %entry, %for.body
904 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
David Blaikie79e6c742015-02-27 19:29:02 +0000905 %arrayidx = getelementptr inbounds float, float* %y, i64 %indvars.iv
David Blaikiea79ac142015-02-27 21:17:42 +0000906 %0 = load float, float* %arrayidx, align 4
David Blaikie79e6c742015-02-27 19:29:02 +0000907 %arrayidx2 = getelementptr inbounds float, float* %w, i64 %indvars.iv
David Blaikiea79ac142015-02-27 21:17:42 +0000908 %1 = load float, float* %arrayidx2, align 4
David Blaikie79e6c742015-02-27 19:29:02 +0000909 %arrayidx4 = getelementptr inbounds float, float* %z, i64 %indvars.iv
David Blaikiea79ac142015-02-27 21:17:42 +0000910 %2 = load float, float* %arrayidx4, align 4
Hal Finkelb44f8902012-12-25 23:21:29 +0000911 %3 = tail call float @llvm.fmuladd.f32(float %0, float %2, float %1)
David Blaikie79e6c742015-02-27 19:29:02 +0000912 %arrayidx6 = getelementptr inbounds float, float* %x, i64 %indvars.iv
Manman Ren16649b02013-05-02 18:11:35 +0000913 store float %3, float* %arrayidx6, align 4
Hal Finkelb44f8902012-12-25 23:21:29 +0000914 %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 float @llvm.fmuladd.f32(float, float, float) nounwind readnone
924
Stephen Linc1c7a132013-07-14 01:42:54 +0000925;CHECK-LABEL: @fmuladd_f64(
Hal Finkelb44f8902012-12-25 23:21:29 +0000926;CHECK: llvm.fmuladd.v4f64
927;CHECK: ret void
928define void @fmuladd_f64(i32 %n, double* noalias %y, double* noalias %x, double* noalias %z, double* noalias %w) nounwind uwtable {
929entry:
930 %cmp12 = icmp sgt i32 %n, 0
931 br i1 %cmp12, label %for.body, label %for.end
932
933for.body: ; preds = %entry, %for.body
934 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
David Blaikie79e6c742015-02-27 19:29:02 +0000935 %arrayidx = getelementptr inbounds double, double* %y, i64 %indvars.iv
David Blaikiea79ac142015-02-27 21:17:42 +0000936 %0 = load double, double* %arrayidx, align 8
David Blaikie79e6c742015-02-27 19:29:02 +0000937 %arrayidx2 = getelementptr inbounds double, double* %w, i64 %indvars.iv
David Blaikiea79ac142015-02-27 21:17:42 +0000938 %1 = load double, double* %arrayidx2, align 8
David Blaikie79e6c742015-02-27 19:29:02 +0000939 %arrayidx4 = getelementptr inbounds double, double* %z, i64 %indvars.iv
David Blaikiea79ac142015-02-27 21:17:42 +0000940 %2 = load double, double* %arrayidx4, align 8
Hal Finkelb44f8902012-12-25 23:21:29 +0000941 %3 = tail call double @llvm.fmuladd.f64(double %0, double %2, double %1)
David Blaikie79e6c742015-02-27 19:29:02 +0000942 %arrayidx6 = getelementptr inbounds double, double* %x, i64 %indvars.iv
Manman Ren16649b02013-05-02 18:11:35 +0000943 store double %3, double* %arrayidx6, align 8
Hal Finkelb44f8902012-12-25 23:21:29 +0000944 %indvars.iv.next = add i64 %indvars.iv, 1
945 %lftr.wideiv = trunc i64 %indvars.iv.next to i32
946 %exitcond = icmp eq i32 %lftr.wideiv, %n
947 br i1 %exitcond, label %for.end, label %for.body
948
949for.end: ; preds = %for.body, %entry
950 ret void
951}
952
953declare double @llvm.fmuladd.f64(double, double, double) nounwind readnone
954
Stephen Linc1c7a132013-07-14 01:42:54 +0000955;CHECK-LABEL: @pow_f32(
Paul Redmond2adb13c2012-12-09 20:42:17 +0000956;CHECK: llvm.pow.v4f32
957;CHECK: ret void
958define void @pow_f32(i32 %n, float* noalias %y, float* noalias %x, float* noalias %z) nounwind uwtable {
959entry:
960 %cmp9 = icmp sgt i32 %n, 0
961 br i1 %cmp9, label %for.body, label %for.end
962
963for.body: ; preds = %entry, %for.body
964 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
David Blaikie79e6c742015-02-27 19:29:02 +0000965 %arrayidx = getelementptr inbounds float, float* %y, i64 %indvars.iv
David Blaikiea79ac142015-02-27 21:17:42 +0000966 %0 = load float, float* %arrayidx, align 4
David Blaikie79e6c742015-02-27 19:29:02 +0000967 %arrayidx2 = getelementptr inbounds float, float* %z, i64 %indvars.iv
David Blaikiea79ac142015-02-27 21:17:42 +0000968 %1 = load float, float* %arrayidx2, align 4
Paul Redmond2adb13c2012-12-09 20:42:17 +0000969 %call = tail call float @llvm.pow.f32(float %0, float %1) nounwind readnone
David Blaikie79e6c742015-02-27 19:29:02 +0000970 %arrayidx4 = getelementptr inbounds float, float* %x, i64 %indvars.iv
Manman Ren16649b02013-05-02 18:11:35 +0000971 store float %call, float* %arrayidx4, align 4
Paul Redmond2adb13c2012-12-09 20:42:17 +0000972 %indvars.iv.next = add i64 %indvars.iv, 1
973 %lftr.wideiv = trunc i64 %indvars.iv.next to i32
974 %exitcond = icmp eq i32 %lftr.wideiv, %n
975 br i1 %exitcond, label %for.end, label %for.body
976
977for.end: ; preds = %for.body, %entry
978 ret void
979}
980
981declare float @llvm.pow.f32(float, float) nounwind readnone
982
Stephen Linc1c7a132013-07-14 01:42:54 +0000983;CHECK-LABEL: @pow_f64(
Paul Redmond2adb13c2012-12-09 20:42:17 +0000984;CHECK: llvm.pow.v4f64
985;CHECK: ret void
986define void @pow_f64(i32 %n, double* noalias %y, double* noalias %x, double* noalias %z) nounwind uwtable {
987entry:
988 %cmp9 = icmp sgt i32 %n, 0
989 br i1 %cmp9, label %for.body, label %for.end
990
991for.body: ; preds = %entry, %for.body
992 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
David Blaikie79e6c742015-02-27 19:29:02 +0000993 %arrayidx = getelementptr inbounds double, double* %y, i64 %indvars.iv
David Blaikiea79ac142015-02-27 21:17:42 +0000994 %0 = load double, double* %arrayidx, align 8
David Blaikie79e6c742015-02-27 19:29:02 +0000995 %arrayidx2 = getelementptr inbounds double, double* %z, i64 %indvars.iv
David Blaikiea79ac142015-02-27 21:17:42 +0000996 %1 = load double, double* %arrayidx2, align 8
Paul Redmond2adb13c2012-12-09 20:42:17 +0000997 %call = tail call double @llvm.pow.f64(double %0, double %1) nounwind readnone
David Blaikie79e6c742015-02-27 19:29:02 +0000998 %arrayidx4 = getelementptr inbounds double, double* %x, i64 %indvars.iv
Manman Ren16649b02013-05-02 18:11:35 +0000999 store double %call, double* %arrayidx4, align 8
Paul Redmond2adb13c2012-12-09 20:42:17 +00001000 %indvars.iv.next = add i64 %indvars.iv, 1
1001 %lftr.wideiv = trunc i64 %indvars.iv.next to i32
1002 %exitcond = icmp eq i32 %lftr.wideiv, %n
1003 br i1 %exitcond, label %for.end, label %for.body
1004
1005for.end: ; preds = %for.body, %entry
1006 ret void
1007}
1008
Benjamin Kramerdc145812013-02-27 15:24:19 +00001009; CHECK: fabs_libm
1010; CHECK: call <4 x float> @llvm.fabs.v4f32
1011; CHECK: ret void
1012define void @fabs_libm(float* nocapture %x) nounwind {
1013entry:
1014 br label %for.body
1015
1016for.body: ; preds = %entry, %for.body
1017 %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.body ]
David Blaikie79e6c742015-02-27 19:29:02 +00001018 %arrayidx = getelementptr inbounds float, float* %x, i64 %indvars.iv
David Blaikiea79ac142015-02-27 21:17:42 +00001019 %0 = load float, float* %arrayidx, align 4
Arnold Schwaighofer22639402013-09-23 14:54:39 +00001020 %call = tail call float @fabsf(float %0) nounwind readnone
Benjamin Kramerdc145812013-02-27 15:24:19 +00001021 store float %call, float* %arrayidx, align 4
1022 %indvars.iv.next = add i64 %indvars.iv, 1
1023 %lftr.wideiv = trunc i64 %indvars.iv.next to i32
1024 %exitcond = icmp eq i32 %lftr.wideiv, 1024
1025 br i1 %exitcond, label %for.end, label %for.body
1026
1027for.end: ; preds = %for.body
1028 ret void
1029}
1030
Arnold Schwaighofer22639402013-09-23 14:54:39 +00001031declare float @fabsf(float) nounwind readnone
1032
Paul Redmond2adb13c2012-12-09 20:42:17 +00001033declare double @llvm.pow.f64(double, double) nounwind readnone
Nadav Rotem33711722013-09-21 00:27:05 +00001034
1035
Nadav Rotem33711722013-09-21 00:27:05 +00001036
Arnold Schwaighofer22639402013-09-23 14:54:39 +00001037; Make sure we don't replace calls to functions with standard library function
1038; signatures but defined with internal linkage.
1039
1040define internal float @roundf(float %x) nounwind readnone {
1041 ret float 0.00000000
1042}
1043; CHECK-LABEL: internal_round
1044; CHECK-NOT: load <4 x float>
1045
1046define void @internal_round(float* nocapture %x) nounwind {
1047entry:
1048 br label %for.body
1049
1050for.body: ; preds = %entry, %for.body
1051 %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.body ]
David Blaikie79e6c742015-02-27 19:29:02 +00001052 %arrayidx = getelementptr inbounds float, float* %x, i64 %indvars.iv
David Blaikiea79ac142015-02-27 21:17:42 +00001053 %0 = load float, float* %arrayidx, align 4
Arnold Schwaighofer22639402013-09-23 14:54:39 +00001054 %call = tail call float @roundf(float %0) nounwind readnone
1055 store float %call, float* %arrayidx, align 4
Nadav Rotem33711722013-09-21 00:27:05 +00001056 %indvars.iv.next = add i64 %indvars.iv, 1
1057 %lftr.wideiv = trunc i64 %indvars.iv.next to i32
Arnold Schwaighofer22639402013-09-23 14:54:39 +00001058 %exitcond = icmp eq i32 %lftr.wideiv, 1024
1059 br i1 %exitcond, label %for.end, label %for.body
Nadav Rotem33711722013-09-21 00:27:05 +00001060
Arnold Schwaighofer22639402013-09-23 14:54:39 +00001061for.end: ; preds = %for.body
Nadav Rotem33711722013-09-21 00:27:05 +00001062 ret void
1063}
1064
Arnold Schwaighofer22639402013-09-23 14:54:39 +00001065; Make sure we don't replace calls to functions with standard library names but
1066; different signatures.
1067
1068declare void @round(double %f)
1069
1070; CHECK-LABEL: wrong_signature
1071; CHECK-NOT: load <4 x double>
1072
1073define void @wrong_signature(double* nocapture %x) nounwind {
1074entry:
1075 br label %for.body
1076
1077for.body: ; preds = %entry, %for.body
1078 %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.body ]
David Blaikie79e6c742015-02-27 19:29:02 +00001079 %arrayidx = getelementptr inbounds double, double* %x, i64 %indvars.iv
David Blaikiea79ac142015-02-27 21:17:42 +00001080 %0 = load double, double* %arrayidx, align 4
Arnold Schwaighofer22639402013-09-23 14:54:39 +00001081 store double %0, double* %arrayidx, align 4
1082 tail call void @round(double %0) nounwind readnone
1083 %indvars.iv.next = add i64 %indvars.iv, 1
1084 %lftr.wideiv = trunc i64 %indvars.iv.next to i32
1085 %exitcond = icmp eq i32 %lftr.wideiv, 1024
1086 br i1 %exitcond, label %for.end, label %for.body
1087
1088for.end: ; preds = %for.body
1089 ret void
1090}
1091
Karthik Bhat5ab77952014-05-30 04:31:24 +00001092declare double @llvm.powi.f64(double %Val, i32 %power) nounwind readnone
1093
1094;CHECK-LABEL: @powi_f64(
1095;CHECK: llvm.powi.v4f64
1096;CHECK: ret void
1097define void @powi_f64(i32 %n, double* noalias %y, double* noalias %x, i32 %P) nounwind uwtable {
1098entry:
1099 %cmp9 = icmp sgt i32 %n, 0
1100 br i1 %cmp9, label %for.body, label %for.end
1101
1102for.body: ; preds = %entry, %for.body
1103 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
David Blaikie79e6c742015-02-27 19:29:02 +00001104 %arrayidx = getelementptr inbounds double, double* %y, i64 %indvars.iv
David Blaikiea79ac142015-02-27 21:17:42 +00001105 %0 = load double, double* %arrayidx, align 8
Karthik Bhat5ab77952014-05-30 04:31:24 +00001106 %call = tail call double @llvm.powi.f64(double %0, i32 %P) nounwind readnone
David Blaikie79e6c742015-02-27 19:29:02 +00001107 %arrayidx4 = getelementptr inbounds double, double* %x, i64 %indvars.iv
Karthik Bhat5ab77952014-05-30 04:31:24 +00001108 store double %call, double* %arrayidx4, align 8
1109 %indvars.iv.next = add i64 %indvars.iv, 1
1110 %lftr.wideiv = trunc i64 %indvars.iv.next to i32
1111 %exitcond = icmp eq i32 %lftr.wideiv, %n
1112 br i1 %exitcond, label %for.end, label %for.body
1113
1114for.end: ; preds = %for.body, %entry
1115 ret void
1116}
1117
1118;CHECK-LABEL: @powi_f64_neg(
1119;CHECK-NOT: llvm.powi.v4f64
1120;CHECK: ret void
1121define void @powi_f64_neg(i32 %n, double* noalias %y, double* noalias %x) nounwind uwtable {
1122entry:
1123 %cmp9 = icmp sgt i32 %n, 0
1124 br i1 %cmp9, label %for.body, label %for.end
1125
1126for.body: ; preds = %entry, %for.body
1127 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
David Blaikie79e6c742015-02-27 19:29:02 +00001128 %arrayidx = getelementptr inbounds double, double* %y, i64 %indvars.iv
David Blaikiea79ac142015-02-27 21:17:42 +00001129 %0 = load double, double* %arrayidx, align 8
Karthik Bhat5ab77952014-05-30 04:31:24 +00001130 %1 = trunc i64 %indvars.iv to i32
1131 %call = tail call double @llvm.powi.f64(double %0, i32 %1) nounwind readnone
David Blaikie79e6c742015-02-27 19:29:02 +00001132 %arrayidx4 = getelementptr inbounds double, double* %x, i64 %indvars.iv
Karthik Bhat5ab77952014-05-30 04:31:24 +00001133 store double %call, double* %arrayidx4, align 8
1134 %indvars.iv.next = add i64 %indvars.iv, 1
1135 %lftr.wideiv = trunc i64 %indvars.iv.next to i32
1136 %exitcond = icmp eq i32 %lftr.wideiv, %n
1137 br i1 %exitcond, label %for.end, label %for.body
1138
1139for.end: ; preds = %for.body, %entry
1140 ret void
1141}
1142
1143declare i64 @llvm.cttz.i64 (i64, i1) nounwind readnone
1144
1145;CHECK-LABEL: @cttz_f64(
1146;CHECK: llvm.cttz.v4i64
1147;CHECK: ret void
1148define void @cttz_f64(i32 %n, i64* noalias %y, i64* noalias %x) nounwind uwtable {
1149entry:
1150 %cmp9 = icmp sgt i32 %n, 0
1151 br i1 %cmp9, label %for.body, label %for.end
1152
1153for.body: ; preds = %entry, %for.body
1154 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
David Blaikie79e6c742015-02-27 19:29:02 +00001155 %arrayidx = getelementptr inbounds i64, i64* %y, i64 %indvars.iv
David Blaikiea79ac142015-02-27 21:17:42 +00001156 %0 = load i64, i64* %arrayidx, align 8
Karthik Bhat5ab77952014-05-30 04:31:24 +00001157 %call = tail call i64 @llvm.cttz.i64(i64 %0, i1 true) nounwind readnone
David Blaikie79e6c742015-02-27 19:29:02 +00001158 %arrayidx4 = getelementptr inbounds i64, i64* %x, i64 %indvars.iv
Karthik Bhat5ab77952014-05-30 04:31:24 +00001159 store i64 %call, i64* %arrayidx4, align 8
1160 %indvars.iv.next = add i64 %indvars.iv, 1
1161 %lftr.wideiv = trunc i64 %indvars.iv.next to i32
1162 %exitcond = icmp eq i32 %lftr.wideiv, %n
1163 br i1 %exitcond, label %for.end, label %for.body
1164
1165for.end: ; preds = %for.body, %entry
1166 ret void
1167}
1168
1169declare i64 @llvm.ctlz.i64 (i64, i1) nounwind readnone
1170
1171;CHECK-LABEL: @ctlz_f64(
1172;CHECK: llvm.ctlz.v4i64
1173;CHECK: ret void
1174define void @ctlz_f64(i32 %n, i64* noalias %y, i64* noalias %x) nounwind uwtable {
1175entry:
1176 %cmp9 = icmp sgt i32 %n, 0
1177 br i1 %cmp9, label %for.body, label %for.end
1178
1179for.body: ; preds = %entry, %for.body
1180 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
David Blaikie79e6c742015-02-27 19:29:02 +00001181 %arrayidx = getelementptr inbounds i64, i64* %y, i64 %indvars.iv
David Blaikiea79ac142015-02-27 21:17:42 +00001182 %0 = load i64, i64* %arrayidx, align 8
Karthik Bhat5ab77952014-05-30 04:31:24 +00001183 %call = tail call i64 @llvm.ctlz.i64(i64 %0, i1 true) nounwind readnone
David Blaikie79e6c742015-02-27 19:29:02 +00001184 %arrayidx4 = getelementptr inbounds i64, i64* %x, i64 %indvars.iv
Karthik Bhat5ab77952014-05-30 04:31:24 +00001185 store i64 %call, i64* %arrayidx4, align 8
1186 %indvars.iv.next = add i64 %indvars.iv, 1
1187 %lftr.wideiv = trunc i64 %indvars.iv.next to i32
1188 %exitcond = icmp eq i32 %lftr.wideiv, %n
1189 br i1 %exitcond, label %for.end, label %for.body
1190
1191for.end: ; preds = %for.body, %entry
1192 ret void
1193}
Matt Arsenaultd6511b42014-10-21 23:00:20 +00001194
1195declare float @llvm.minnum.f32(float, float) nounwind readnone
1196
1197;CHECK-LABEL: @minnum_f32(
1198;CHECK: llvm.minnum.v4f32
1199;CHECK: ret void
1200define void @minnum_f32(i32 %n, float* noalias %y, float* noalias %x, float* noalias %z) nounwind uwtable {
1201entry:
1202 %cmp9 = icmp sgt i32 %n, 0
1203 br i1 %cmp9, label %for.body, label %for.end
1204
1205for.body: ; preds = %entry, %for.body
1206 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
David Blaikie79e6c742015-02-27 19:29:02 +00001207 %arrayidx = getelementptr inbounds float, float* %y, i64 %indvars.iv
David Blaikiea79ac142015-02-27 21:17:42 +00001208 %0 = load float, float* %arrayidx, align 4
David Blaikie79e6c742015-02-27 19:29:02 +00001209 %arrayidx2 = getelementptr inbounds float, float* %z, i64 %indvars.iv
David Blaikiea79ac142015-02-27 21:17:42 +00001210 %1 = load float, float* %arrayidx2, align 4
Matt Arsenaultd6511b42014-10-21 23:00:20 +00001211 %call = tail call float @llvm.minnum.f32(float %0, float %1) nounwind readnone
David Blaikie79e6c742015-02-27 19:29:02 +00001212 %arrayidx4 = getelementptr inbounds float, float* %x, i64 %indvars.iv
Matt Arsenaultd6511b42014-10-21 23:00:20 +00001213 store float %call, float* %arrayidx4, align 4
1214 %indvars.iv.next = add i64 %indvars.iv, 1
1215 %lftr.wideiv = trunc i64 %indvars.iv.next to i32
1216 %exitcond = icmp eq i32 %lftr.wideiv, %n
1217 br i1 %exitcond, label %for.end, label %for.body
1218
1219for.end: ; preds = %for.body, %entry
1220 ret void
1221}
1222
1223declare float @llvm.maxnum.f32(float, float) nounwind readnone
1224
1225;CHECK-LABEL: @maxnum_f32(
1226;CHECK: llvm.maxnum.v4f32
1227;CHECK: ret void
1228define void @maxnum_f32(i32 %n, float* noalias %y, float* noalias %x, float* noalias %z) nounwind uwtable {
1229entry:
1230 %cmp9 = icmp sgt i32 %n, 0
1231 br i1 %cmp9, label %for.body, label %for.end
1232
1233for.body: ; preds = %entry, %for.body
1234 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]
David Blaikie79e6c742015-02-27 19:29:02 +00001235 %arrayidx = getelementptr inbounds float, float* %y, i64 %indvars.iv
David Blaikiea79ac142015-02-27 21:17:42 +00001236 %0 = load float, float* %arrayidx, align 4
David Blaikie79e6c742015-02-27 19:29:02 +00001237 %arrayidx2 = getelementptr inbounds float, float* %z, i64 %indvars.iv
David Blaikiea79ac142015-02-27 21:17:42 +00001238 %1 = load float, float* %arrayidx2, align 4
Matt Arsenaultd6511b42014-10-21 23:00:20 +00001239 %call = tail call float @llvm.maxnum.f32(float %0, float %1) nounwind readnone
David Blaikie79e6c742015-02-27 19:29:02 +00001240 %arrayidx4 = getelementptr inbounds float, float* %x, i64 %indvars.iv
Matt Arsenaultd6511b42014-10-21 23:00:20 +00001241 store float %call, float* %arrayidx4, align 4
1242 %indvars.iv.next = add i64 %indvars.iv, 1
1243 %lftr.wideiv = trunc i64 %indvars.iv.next to i32
1244 %exitcond = icmp eq i32 %lftr.wideiv, %n
1245 br i1 %exitcond, label %for.end, label %for.body
1246
1247for.end: ; preds = %for.body, %entry
1248 ret void
1249}