421 lines · plain
1; RUN: opt -vector-library=AMDLIBM -passes=inject-tli-mappings,loop-vectorize -S < %s | FileCheck %s2 3; Test to verify that when math headers are built with4; __FINITE_MATH_ONLY__ enabled, causing use of __<func>_finite5; function versions, vectorization can map these to vector versions.6 7target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"8target triple = "x86_64-unknown-linux-gnu"9 10define void @exp_f32(ptr nocapture %varray) {11; CHECK-LABEL: @exp_f3212; CHECK: <4 x float> @amd_vrs4_expf13; CHECK: ret14entry:15 br label %for.body16 17for.body: ; preds = %for.body, %entry18 %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.body ]19 %tmp = trunc i64 %indvars.iv to i3220 %conv = sitofp i32 %tmp to float21 %call = tail call fast float @__expf_finite(float %conv)22 %arrayidx = getelementptr inbounds float, ptr %varray, i64 %indvars.iv23 store float %call, ptr %arrayidx, align 424 %indvars.iv.next = add nuw nsw i64 %indvars.iv, 125 %exitcond = icmp eq i64 %indvars.iv.next, 100026 br i1 %exitcond, label %for.end, label %for.body, !llvm.loop !427 28for.end: ; preds = %for.body29 ret void30}31 32define void @exp_f64(ptr nocapture %varray) {33; CHECK-LABEL: @exp_f6434; CHECK: <4 x double> @amd_vrd4_exp35; CHECK: ret36entry:37 br label %for.body38 39for.body: ; preds = %for.body, %entry40 %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.body ]41 %tmp = trunc i64 %indvars.iv to i3242 %conv = sitofp i32 %tmp to double43 %call = tail call fast double @__exp_finite(double %conv)44 %arrayidx = getelementptr inbounds double, ptr %varray, i64 %indvars.iv45 store double %call, ptr %arrayidx, align 446 %indvars.iv.next = add nuw nsw i64 %indvars.iv, 147 %exitcond = icmp eq i64 %indvars.iv.next, 100048 br i1 %exitcond, label %for.end, label %for.body, !llvm.loop !449 50for.end: ; preds = %for.body51 ret void52}53 54define void @log_f32(ptr nocapture %varray) {55; CHECK-LABEL: @log_f3256; CHECK: <4 x float> @amd_vrs4_logf57; CHECK: ret58entry:59 br label %for.body60 61for.body: ; preds = %for.body, %entry62 %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.body ]63 %tmp = trunc i64 %indvars.iv to i3264 %conv = sitofp i32 %tmp to float65 %call = tail call fast float @__logf_finite(float %conv)66 %arrayidx = getelementptr inbounds float, ptr %varray, i64 %indvars.iv67 store float %call, ptr %arrayidx, align 468 %indvars.iv.next = add nuw nsw i64 %indvars.iv, 169 %exitcond = icmp eq i64 %indvars.iv.next, 100070 br i1 %exitcond, label %for.end, label %for.body, !llvm.loop !471 72for.end: ; preds = %for.body73 ret void74}75 76define void @log_f64(ptr nocapture %varray) {77; CHECK-LABEL: @log_f6478; CHECK: <4 x double> @amd_vrd4_log79; CHECK: ret80entry:81 br label %for.body82 83for.body: ; preds = %for.body, %entry84 %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.body ]85 %tmp = trunc i64 %indvars.iv to i3286 %conv = sitofp i32 %tmp to double87 %call = tail call fast double @__log_finite(double %conv)88 %arrayidx = getelementptr inbounds double, ptr %varray, i64 %indvars.iv89 store double %call, ptr %arrayidx, align 490 %indvars.iv.next = add nuw nsw i64 %indvars.iv, 191 %exitcond = icmp eq i64 %indvars.iv.next, 100092 br i1 %exitcond, label %for.end, label %for.body, !llvm.loop !493 94for.end: ; preds = %for.body95 ret void96}97 98define void @pow_f32(ptr nocapture %varray, ptr nocapture readonly %exp) {99; CHECK-LABEL: @pow_f32100; CHECK: <4 x float> @amd_vrs4_powf101; CHECK: ret102entry:103 br label %for.body104 105for.body: ; preds = %for.body, %entry106 %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.body ]107 %tmp = trunc i64 %indvars.iv to i32108 %conv = sitofp i32 %tmp to float109 %arrayidx = getelementptr inbounds float, ptr %exp, i64 %indvars.iv110 %tmp1 = load float, ptr %arrayidx, align 4111 %tmp2 = tail call fast float @__powf_finite(float %conv, float %tmp1)112 %arrayidx2 = getelementptr inbounds float, ptr %varray, i64 %indvars.iv113 store float %tmp2, ptr %arrayidx2, align 4114 %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1115 %exitcond = icmp eq i64 %indvars.iv.next, 1000116 br i1 %exitcond, label %for.end, label %for.body, !llvm.loop !4117 118for.end: ; preds = %for.body119 ret void120}121 122define void @pow_f64(ptr nocapture %varray, ptr nocapture readonly %exp) {123; CHECK-LABEL: @pow_f64124; CHECK: <4 x double> @amd_vrd4_pow125; CHECK: ret126entry:127 br label %for.body128 129for.body: ; preds = %for.body, %entry130 %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.body ]131 %tmp = trunc i64 %indvars.iv to i32132 %conv = sitofp i32 %tmp to double133 %arrayidx = getelementptr inbounds double, ptr %exp, i64 %indvars.iv134 %tmp1 = load double, ptr %arrayidx, align 4135 %tmp2 = tail call fast double @__pow_finite(double %conv, double %tmp1)136 %arrayidx2 = getelementptr inbounds double, ptr %varray, i64 %indvars.iv137 store double %tmp2, ptr %arrayidx2, align 4138 %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1139 %exitcond = icmp eq i64 %indvars.iv.next, 1000140 br i1 %exitcond, label %for.end, label %for.body, !llvm.loop !4141 142for.end: ; preds = %for.body143 ret void144}145 146define void @exp2f_finite(ptr nocapture %varray) {147; CHECK-LABEL: @exp2f_finite(148; CHECK: call <4 x float> @amd_vrs4_exp2f(<4 x float> %{{.*}})149; CHECK: ret void150;151entry:152 br label %for.body153 154for.body:155 %iv = phi i64 [ 0, %entry ], [ %iv.next, %for.body ]156 %tmp = trunc i64 %iv to i32157 %conv = sitofp i32 %tmp to float158 %call = tail call float @__exp2f_finite(float %conv)159 %arrayidx = getelementptr inbounds float, ptr %varray, i64 %iv160 store float %call, ptr %arrayidx, align 4161 %iv.next = add nuw nsw i64 %iv, 1162 %exitcond = icmp eq i64 %iv.next, 1000163 br i1 %exitcond, label %for.end, label %for.body, !llvm.loop !4164 165for.end:166 ret void167}168 169define void @exp2_finite(ptr nocapture %varray) {170; CHECK-LABEL: @exp2_finite(171; CHECK: call <4 x double> @amd_vrd4_exp2(<4 x double> {{.*}})172; CHECK: ret void173;174entry:175 br label %for.body176 177for.body:178 %iv = phi i64 [ 0, %entry ], [ %iv.next, %for.body ]179 %tmp = trunc i64 %iv to i32180 %conv = sitofp i32 %tmp to double181 %call = tail call double @__exp2_finite(double %conv)182 %arrayidx = getelementptr inbounds double, ptr %varray, i64 %iv183 store double %call, ptr %arrayidx, align 4184 %iv.next = add nuw nsw i64 %iv, 1185 %exitcond = icmp eq i64 %iv.next, 1000186 br i1 %exitcond, label %for.end, label %for.body, !llvm.loop !4187 188for.end:189 ret void190}191 192define void @log2_f32(ptr nocapture %varray) {193; CHECK-LABEL: @log2_f32194; CHECK: <4 x float> @amd_vrs4_log2f195; CHECK: ret196entry:197 br label %for.body198 199for.body: ; preds = %for.body, %entry200 %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.body ]201 %tmp = trunc i64 %indvars.iv to i32202 %conv = sitofp i32 %tmp to float203 %call = tail call fast float @__log2f_finite(float %conv)204 %arrayidx = getelementptr inbounds float, ptr %varray, i64 %indvars.iv205 store float %call, ptr %arrayidx, align 4206 %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1207 %exitcond = icmp eq i64 %indvars.iv.next, 1000208 br i1 %exitcond, label %for.end, label %for.body, !llvm.loop !4209 210for.end: ; preds = %for.body211 ret void212}213 214define void @log2_f64(ptr nocapture %varray) {215; CHECK-LABEL: @log2_f64216; CHECK: <4 x double> @amd_vrd4_log2217; CHECK: ret218entry:219 br label %for.body220 221for.body: ; preds = %for.body, %entry222 %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.body ]223 %tmp = trunc i64 %indvars.iv to i32224 %conv = sitofp i32 %tmp to double225 %call = tail call fast double @__log2_finite(double %conv)226 %arrayidx = getelementptr inbounds double, ptr %varray, i64 %indvars.iv227 store double %call, ptr %arrayidx, align 4228 %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1229 %exitcond = icmp eq i64 %indvars.iv.next, 1000230 br i1 %exitcond, label %for.end, label %for.body, !llvm.loop !4231 232for.end: ; preds = %for.body233 ret void234}235 236define void @log10_f32(ptr nocapture %varray) {237; CHECK-LABEL: @log10_f32238; CHECK: <4 x float> @amd_vrs4_log10f239; CHECK: ret240entry:241 br label %for.body242 243for.body: ; preds = %for.body, %entry244 %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.body ]245 %tmp = trunc i64 %indvars.iv to i32246 %conv = sitofp i32 %tmp to float247 %call = tail call fast float @__log10f_finite(float %conv)248 %arrayidx = getelementptr inbounds float, ptr %varray, i64 %indvars.iv249 store float %call, ptr %arrayidx, align 4250 %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1251 %exitcond = icmp eq i64 %indvars.iv.next, 1000252 br i1 %exitcond, label %for.end, label %for.body, !llvm.loop !4253 254for.end: ; preds = %for.body255 ret void256}257 258define void @log10_finite(ptr nocapture %varray) {259; CHECK-LABEL: @log10_finite(260; CHECK: call <2 x double> @amd_vrd2_log10(<2 x double> {{.*}})261; CHECK: ret void262;263entry:264 br label %for.body265 266for.body:267 %iv = phi i64 [ 0, %entry ], [ %iv.next, %for.body ]268 %tmp = trunc i64 %iv to i32269 %conv = sitofp i32 %tmp to double270 %call = tail call double @__log10_finite(double %conv)271 %arrayidx = getelementptr inbounds double, ptr %varray, i64 %iv272 store double %call, ptr %arrayidx, align 4273 %iv.next = add nuw nsw i64 %iv, 1274 %exitcond = icmp eq i64 %iv.next, 1000275 br i1 %exitcond, label %for.end, label %for.body, !llvm.loop !1276 277for.end:278 ret void279}280 281define void @exp10_finite(ptr nocapture %varray) {282; CHECK-LABEL: @exp10_finite(283; CHECK: call <2 x double> @amd_vrd2_exp10(<2 x double> {{.*}})284; CHECK: ret void285;286entry:287 br label %for.body288 289for.body:290 %iv = phi i64 [ 0, %entry ], [ %iv.next, %for.body ]291 %tmp = trunc i64 %iv to i32292 %conv = sitofp i32 %tmp to double293 %call = tail call double @__exp10_finite(double %conv)294 %arrayidx = getelementptr inbounds double, ptr %varray, i64 %iv295 store double %call, ptr %arrayidx, align 4296 %iv.next = add nuw nsw i64 %iv, 1297 %exitcond = icmp eq i64 %iv.next, 1000298 br i1 %exitcond, label %for.end, label %for.body, !llvm.loop !1299 300for.end:301 ret void302}303 304define void @exp10_f32(ptr nocapture %varray) {305; CHECK-LABEL: @exp10_f32306; CHECK: <4 x float> @amd_vrs4_exp10f307; CHECK: ret308entry:309 br label %for.body310 311for.body: ; preds = %for.body, %entry312 %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.body ]313 %tmp = trunc i64 %indvars.iv to i32314 %conv = sitofp i32 %tmp to float315 %call = tail call fast float @__exp10f_finite(float %conv)316 %arrayidx = getelementptr inbounds float, ptr %varray, i64 %indvars.iv317 store float %call, ptr %arrayidx, align 4318 %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1319 %exitcond = icmp eq i64 %indvars.iv.next, 1000320 br i1 %exitcond, label %for.end, label %for.body, !llvm.loop !4321 322for.end: ; preds = %for.body323 ret void324}325 326define void @asin_finite(ptr nocapture %varray) {327; CHECK-LABEL: @asin_finite(328; CHECK: call <8 x double> @amd_vrd8_asin(<8 x double> {{.*}})329; CHECK: ret void330;331entry:332 br label %for.body333 334for.body:335 %iv = phi i64 [ 0, %entry ], [ %iv.next, %for.body ]336 %tmp = trunc i64 %iv to i32337 %conv = sitofp i32 %tmp to double338 %call = tail call double @__asin_finite(double %conv)339 %arrayidx = getelementptr inbounds double, ptr %varray, i64 %iv340 store double %call, ptr %arrayidx, align 4341 %iv.next = add nuw nsw i64 %iv, 1342 %exitcond = icmp eq i64 %iv.next, 1000343 br i1 %exitcond, label %for.end, label %for.body, !llvm.loop !7344 345for.end:346 ret void347}348 349define void @asinf_finite(ptr nocapture %varray) {350; CHECK-LABEL: @asinf_finite351; CHECK: <4 x float> @amd_vrs4_asinf352; CHECK: ret353entry:354 br label %for.body355 356for.body: ; preds = %for.body, %entry357 %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.body ]358 %tmp = trunc i64 %indvars.iv to i32359 %conv = sitofp i32 %tmp to float360 %call = tail call fast float @__asinf_finite(float %conv)361 %arrayidx = getelementptr inbounds float, ptr %varray, i64 %indvars.iv362 store float %call, ptr %arrayidx, align 4363 %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1364 %exitcond = icmp eq i64 %indvars.iv.next, 1000365 br i1 %exitcond, label %for.end, label %for.body, !llvm.loop !4366 367for.end: ; preds = %for.body368 ret void369}370 371define void @acosf_finite(ptr nocapture %varray) {372; CHECK-LABEL: @acosf_finite373; CHECK: <4 x float> @amd_vrs4_acosf374; CHECK: ret375entry:376 br label %for.body377 378for.body: ; preds = %for.body, %entry379 %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.body ]380 %tmp = trunc i64 %indvars.iv to i32381 %conv = sitofp i32 %tmp to float382 %call = tail call fast float @__acosf_finite(float %conv)383 %arrayidx = getelementptr inbounds float, ptr %varray, i64 %indvars.iv384 store float %call, ptr %arrayidx, align 4385 %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1386 %exitcond = icmp eq i64 %indvars.iv.next, 1000387 br i1 %exitcond, label %for.end, label %for.body, !llvm.loop !4388 389for.end: ; preds = %for.body390 ret void391}392 393!1 = distinct !{!1, !2, !3}394!2 = !{!"llvm.loop.vectorize.width", i32 2}395!3 = !{!"llvm.loop.vectorize.enable", i1 true}396 397!4 = distinct !{!4, !5, !6}398!5 = !{!"llvm.loop.vectorize.width", i32 4}399!6 = !{!"llvm.loop.vectorize.enable", i1 true}400 401!7 = distinct !{!7, !8, !9}402!8 = !{!"llvm.loop.vectorize.width", i32 8}403!9 = !{!"llvm.loop.vectorize.enable", i1 true}404 405declare float @__expf_finite(float) #0406declare double @__exp_finite(double) #0407declare double @__log_finite(double) #0408declare float @__logf_finite(float) #0409declare float @__powf_finite(float, float) #0410declare double @__pow_finite(double, double) #0411declare float @__exp2f_finite(float) #0412declare double @__exp2_finite(double) #0413declare float @__log2f_finite(float) #0414declare double @__log2_finite(double) #0415declare float @__log10f_finite(float) #0416declare double @__log10_finite(double) #0417declare double @__exp10_finite(double) #0418declare float @__exp10f_finite(float) #0419declare double @__asin_finite(double) #0420declare float @__asinf_finite(float) #0421declare float @__acosf_finite(float) #0