brintos

brintos / llvm-project-archived public Read only

0
0
Text · 14.4 KiB · 9899ede Raw
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