xref: /llvm-project/llvm/test/Transforms/LoopVectorize/X86/libm-vector-calls-finite.ll (revision 7d7577256b76e4293f455b8093504d5f7044ab4b)
1; RUN: opt -vector-library=LIBMVEC-X86 -passes=inject-tli-mappings,loop-vectorize -S < %s | FileCheck %s
2target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
3target triple = "x86_64-unknown-linux-gnu"
4
5define void @exp_f32(ptr nocapture %varray) {
6; CHECK-LABEL: @exp_f32
7; CHECK-LABEL:    vector.body
8; CHECK: <4 x float> @_ZGVbN4v___expf_finite
9; CHECK: ret
10entry:
11  br label %for.body
12
13for.body:                                         ; preds = %for.body, %entry
14  %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.body ]
15  %tmp = trunc i64 %indvars.iv to i32
16  %conv = sitofp i32 %tmp to float
17  %call = tail call fast float @__expf_finite(float %conv)
18  %arrayidx = getelementptr inbounds float, ptr %varray, i64 %indvars.iv
19  store float %call, ptr %arrayidx, align 4
20  %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
21  %exitcond = icmp eq i64 %indvars.iv.next, 1000
22  br i1 %exitcond, label %for.end, label %for.body, !llvm.loop !1
23
24for.end:                                          ; preds = %for.body
25  ret void
26}
27
28!1 = distinct !{!1, !2, !3}
29!2 = !{!"llvm.loop.vectorize.width", i32 4}
30!3 = !{!"llvm.loop.vectorize.enable", i1 true}
31
32define void @exp_f64(ptr nocapture %varray) {
33; CHECK-LABEL: @exp_f64
34; CHECK-LABEL:    vector.body
35; CHECK: <4 x double> @_ZGVdN4v___exp_finite
36; CHECK: ret
37entry:
38  br label %for.body
39
40for.body:                                         ; preds = %for.body, %entry
41  %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.body ]
42  %tmp = trunc i64 %indvars.iv to i32
43  %conv = sitofp i32 %tmp to double
44  %call = tail call fast double @__exp_finite(double %conv)
45  %arrayidx = getelementptr inbounds double, ptr %varray, i64 %indvars.iv
46  store double %call, ptr %arrayidx, align 4
47  %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
48  %exitcond = icmp eq i64 %indvars.iv.next, 1000
49  br i1 %exitcond, label %for.end, label %for.body, !llvm.loop !11
50
51for.end:                                          ; preds = %for.body
52  ret void
53}
54
55!11 = distinct !{!11, !12, !13}
56!12 = !{!"llvm.loop.vectorize.width", i32 4}
57!13 = !{!"llvm.loop.vectorize.enable", i1 true}
58
59define void @log_f32(ptr nocapture %varray) {
60; CHECK-LABEL: @log_f32
61; CHECK-LABEL:    vector.body
62; CHECK: <4 x float> @_ZGVbN4v___logf_finite
63; CHECK: ret
64entry:
65  br label %for.body
66
67for.body:                                         ; preds = %for.body, %entry
68  %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.body ]
69  %tmp = trunc i64 %indvars.iv to i32
70  %conv = sitofp i32 %tmp to float
71  %call = tail call fast float @__logf_finite(float %conv)
72  %arrayidx = getelementptr inbounds float, ptr %varray, i64 %indvars.iv
73  store float %call, ptr %arrayidx, align 4
74  %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
75  %exitcond = icmp eq i64 %indvars.iv.next, 1000
76  br i1 %exitcond, label %for.end, label %for.body, !llvm.loop !21
77
78for.end:                                          ; preds = %for.body
79  ret void
80}
81
82!21 = distinct !{!21, !22, !23}
83!22 = !{!"llvm.loop.vectorize.width", i32 4}
84!23 = !{!"llvm.loop.vectorize.enable", i1 true}
85
86define void @log_f64(ptr nocapture %varray) {
87; CHECK-LABEL: @log_f64
88; CHECK-LABEL:    vector.body
89; CHECK: <4 x double> @_ZGVdN4v___log_finite
90; CHECK: ret
91entry:
92  br label %for.body
93
94for.body:                                         ; preds = %for.body, %entry
95  %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.body ]
96  %tmp = trunc i64 %indvars.iv to i32
97  %conv = sitofp i32 %tmp to double
98  %call = tail call fast double @__log_finite(double %conv)
99  %arrayidx = getelementptr inbounds double, ptr %varray, i64 %indvars.iv
100  store double %call, ptr %arrayidx, align 4
101  %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
102  %exitcond = icmp eq i64 %indvars.iv.next, 1000
103  br i1 %exitcond, label %for.end, label %for.body, !llvm.loop !31
104
105for.end:                                          ; preds = %for.body
106  ret void
107}
108
109!31 = distinct !{!31, !32, !33}
110!32 = !{!"llvm.loop.vectorize.width", i32 4}
111!33 = !{!"llvm.loop.vectorize.enable", i1 true}
112
113define void @pow_f32(ptr nocapture %varray, ptr nocapture readonly %exp) {
114; CHECK-LABEL: @pow_f32
115; CHECK-LABEL:    vector.body
116; CHECK: <4 x float> @_ZGVbN4vv___powf_finite
117; CHECK: ret
118entry:
119  br label %for.body
120
121for.body:                                         ; preds = %for.body, %entry
122  %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.body ]
123  %tmp = trunc i64 %indvars.iv to i32
124  %conv = sitofp i32 %tmp to float
125  %arrayidx = getelementptr inbounds float, ptr %exp, i64 %indvars.iv
126  %tmp1 = load float, ptr %arrayidx, align 4
127  %tmp2 = tail call fast float @__powf_finite(float %conv, float %tmp1)
128  %arrayidx2 = getelementptr inbounds float, ptr %varray, i64 %indvars.iv
129  store float %tmp2, ptr %arrayidx2, align 4
130  %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
131  %exitcond = icmp eq i64 %indvars.iv.next, 1000
132  br i1 %exitcond, label %for.end, label %for.body, !llvm.loop !41
133
134for.end:                                          ; preds = %for.body
135  ret void
136}
137
138!41 = distinct !{!41, !42, !43}
139!42 = !{!"llvm.loop.vectorize.width", i32 4}
140!43 = !{!"llvm.loop.vectorize.enable", i1 true}
141
142define void @pow_f64(ptr nocapture %varray, ptr nocapture readonly %exp) {
143; CHECK-LABEL: @pow_f64
144; CHECK-LABEL:    vector.body
145; CHECK: <4 x double> @_ZGVdN4vv___pow_finite
146; CHECK: ret
147entry:
148  br label %for.body
149
150for.body:                                         ; preds = %for.body, %entry
151  %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.body ]
152  %tmp = trunc i64 %indvars.iv to i32
153  %conv = sitofp i32 %tmp to double
154  %arrayidx = getelementptr inbounds double, ptr %exp, i64 %indvars.iv
155  %tmp1 = load double, ptr %arrayidx, align 4
156  %tmp2 = tail call fast double @__pow_finite(double %conv, double %tmp1)
157  %arrayidx2 = getelementptr inbounds double, ptr %varray, i64 %indvars.iv
158  store double %tmp2, ptr %arrayidx2, align 4
159  %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1
160  %exitcond = icmp eq i64 %indvars.iv.next, 1000
161  br i1 %exitcond, label %for.end, label %for.body, !llvm.loop !51
162
163for.end:                                          ; preds = %for.body
164  ret void
165}
166
167!51 = distinct !{!51, !52, !53}
168!52 = !{!"llvm.loop.vectorize.width", i32 4}
169!53 = !{!"llvm.loop.vectorize.enable", i1 true}
170
171declare float @__expf_finite(float) #0
172declare double @__exp_finite(double) #0
173declare float @__logf_finite(float) #0
174declare double @__log_finite(double) #0
175declare float @__powf_finite(float, float) #0
176declare double @__pow_finite(double, double) #0
177