417 lines · plain
1; RUN: opt -vector-library=SVML -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 10declare float @__expf_finite(float) #011 12; CHECK-LABEL: @exp_f3213; CHECK: <4 x float> @__svml_expf414; CHECK: ret15define void @exp_f32(ptr nocapture %varray) {16entry:17 br label %for.body18 19for.body: ; preds = %for.body, %entry20 %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.body ]21 %tmp = trunc i64 %indvars.iv to i3222 %conv = sitofp i32 %tmp to float23 %call = tail call fast float @__expf_finite(float %conv)24 %arrayidx = getelementptr inbounds float, ptr %varray, i64 %indvars.iv25 store float %call, ptr %arrayidx, align 426 %indvars.iv.next = add nuw nsw i64 %indvars.iv, 127 %exitcond = icmp eq i64 %indvars.iv.next, 100028 br i1 %exitcond, label %for.end, label %for.body, !llvm.loop !129 30for.end: ; preds = %for.body31 ret void32}33 34!1 = distinct !{!1, !2, !3}35!2 = !{!"llvm.loop.vectorize.width", i32 4}36!3 = !{!"llvm.loop.vectorize.enable", i1 true}37 38 39declare double @__exp_finite(double) #040 41; CHECK-LABEL: @exp_f6442; CHECK: <4 x double> @__svml_exp443; CHECK: ret44define void @exp_f64(ptr nocapture %varray) {45entry:46 br label %for.body47 48for.body: ; preds = %for.body, %entry49 %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.body ]50 %tmp = trunc i64 %indvars.iv to i3251 %conv = sitofp i32 %tmp to double52 %call = tail call fast double @__exp_finite(double %conv)53 %arrayidx = getelementptr inbounds double, ptr %varray, i64 %indvars.iv54 store double %call, ptr %arrayidx, align 455 %indvars.iv.next = add nuw nsw i64 %indvars.iv, 156 %exitcond = icmp eq i64 %indvars.iv.next, 100057 br i1 %exitcond, label %for.end, label %for.body, !llvm.loop !1158 59for.end: ; preds = %for.body60 ret void61}62 63!11 = distinct !{!11, !12, !13}64!12 = !{!"llvm.loop.vectorize.width", i32 4}65!13 = !{!"llvm.loop.vectorize.enable", i1 true}66 67 68 69 70declare float @__logf_finite(float) #071 72; CHECK-LABEL: @log_f3273; CHECK: <4 x float> @__svml_logf474; CHECK: ret75define void @log_f32(ptr nocapture %varray) {76entry:77 br label %for.body78 79for.body: ; preds = %for.body, %entry80 %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.body ]81 %tmp = trunc i64 %indvars.iv to i3282 %conv = sitofp i32 %tmp to float83 %call = tail call fast float @__logf_finite(float %conv)84 %arrayidx = getelementptr inbounds float, ptr %varray, i64 %indvars.iv85 store float %call, ptr %arrayidx, align 486 %indvars.iv.next = add nuw nsw i64 %indvars.iv, 187 %exitcond = icmp eq i64 %indvars.iv.next, 100088 br i1 %exitcond, label %for.end, label %for.body, !llvm.loop !2189 90for.end: ; preds = %for.body91 ret void92}93 94!21 = distinct !{!21, !22, !23}95!22 = !{!"llvm.loop.vectorize.width", i32 4}96!23 = !{!"llvm.loop.vectorize.enable", i1 true}97 98 99declare double @__log_finite(double) #0100 101; CHECK-LABEL: @log_f64102; CHECK: <4 x double> @__svml_log4103; CHECK: ret104define void @log_f64(ptr nocapture %varray) {105entry:106 br label %for.body107 108for.body: ; preds = %for.body, %entry109 %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.body ]110 %tmp = trunc i64 %indvars.iv to i32111 %conv = sitofp i32 %tmp to double112 %call = tail call fast double @__log_finite(double %conv)113 %arrayidx = getelementptr inbounds double, ptr %varray, i64 %indvars.iv114 store double %call, ptr %arrayidx, align 4115 %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1116 %exitcond = icmp eq i64 %indvars.iv.next, 1000117 br i1 %exitcond, label %for.end, label %for.body, !llvm.loop !31118 119for.end: ; preds = %for.body120 ret void121}122 123!31 = distinct !{!31, !32, !33}124!32 = !{!"llvm.loop.vectorize.width", i32 4}125!33 = !{!"llvm.loop.vectorize.enable", i1 true}126 127 128declare float @__powf_finite(float, float) #0129 130; CHECK-LABEL: @pow_f32131; CHECK: <4 x float> @__svml_powf4132; CHECK: ret133define void @pow_f32(ptr nocapture %varray, ptr nocapture readonly %exp) {134entry:135 br label %for.body136 137for.body: ; preds = %for.body, %entry138 %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.body ]139 %tmp = trunc i64 %indvars.iv to i32140 %conv = sitofp i32 %tmp to float141 %arrayidx = getelementptr inbounds float, ptr %exp, i64 %indvars.iv142 %tmp1 = load float, ptr %arrayidx, align 4143 %tmp2 = tail call fast float @__powf_finite(float %conv, float %tmp1)144 %arrayidx2 = getelementptr inbounds float, ptr %varray, i64 %indvars.iv145 store float %tmp2, ptr %arrayidx2, align 4146 %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1147 %exitcond = icmp eq i64 %indvars.iv.next, 1000148 br i1 %exitcond, label %for.end, label %for.body, !llvm.loop !41149 150for.end: ; preds = %for.body151 ret void152}153 154!41 = distinct !{!41, !42, !43}155!42 = !{!"llvm.loop.vectorize.width", i32 4}156!43 = !{!"llvm.loop.vectorize.enable", i1 true}157 158 159declare double @__pow_finite(double, double) #0160 161; CHECK-LABEL: @pow_f64162; CHECK: <4 x double> @__svml_pow4163; CHECK: ret164define void @pow_f64(ptr nocapture %varray, ptr nocapture readonly %exp) {165entry:166 br label %for.body167 168for.body: ; preds = %for.body, %entry169 %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.body ]170 %tmp = trunc i64 %indvars.iv to i32171 %conv = sitofp i32 %tmp to double172 %arrayidx = getelementptr inbounds double, ptr %exp, i64 %indvars.iv173 %tmp1 = load double, ptr %arrayidx, align 4174 %tmp2 = tail call fast double @__pow_finite(double %conv, double %tmp1)175 %arrayidx2 = getelementptr inbounds double, ptr %varray, i64 %indvars.iv176 store double %tmp2, ptr %arrayidx2, align 4177 %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1178 %exitcond = icmp eq i64 %indvars.iv.next, 1000179 br i1 %exitcond, label %for.end, label %for.body, !llvm.loop !51180 181for.end: ; preds = %for.body182 ret void183}184 185!51 = distinct !{!51, !52, !53}186!52 = !{!"llvm.loop.vectorize.width", i32 4}187!53 = !{!"llvm.loop.vectorize.enable", i1 true}188 189declare float @__exp2f_finite(float) #0190 191define void @exp2f_finite(ptr nocapture %varray) {192; CHECK-LABEL: @exp2f_finite(193; CHECK: call <4 x float> @__svml_exp2f4(<4 x float> %{{.*}})194; CHECK: ret void195;196entry:197 br label %for.body198 199for.body:200 %iv = phi i64 [ 0, %entry ], [ %iv.next, %for.body ]201 %tmp = trunc i64 %iv to i32202 %conv = sitofp i32 %tmp to float203 %call = tail call float @__exp2f_finite(float %conv)204 %arrayidx = getelementptr inbounds float, ptr %varray, i64 %iv205 store float %call, ptr %arrayidx, align 4206 %iv.next = add nuw nsw i64 %iv, 1207 %exitcond = icmp eq i64 %iv.next, 1000208 br i1 %exitcond, label %for.end, label %for.body, !llvm.loop !61209 210for.end:211 ret void212}213 214!61 = distinct !{!61, !62, !63}215!62 = !{!"llvm.loop.vectorize.width", i32 4}216!63 = !{!"llvm.loop.vectorize.enable", i1 true}217 218declare double @__exp2_finite(double) #0219 220define void @exp2_finite(ptr nocapture %varray) {221; CHECK-LABEL: @exp2_finite(222; CHECK: call <4 x double> @__svml_exp24(<4 x double> {{.*}})223; CHECK: ret void224;225entry:226 br label %for.body227 228for.body:229 %iv = phi i64 [ 0, %entry ], [ %iv.next, %for.body ]230 %tmp = trunc i64 %iv to i32231 %conv = sitofp i32 %tmp to double232 %call = tail call double @__exp2_finite(double %conv)233 %arrayidx = getelementptr inbounds double, ptr %varray, i64 %iv234 store double %call, ptr %arrayidx, align 4235 %iv.next = add nuw nsw i64 %iv, 1236 %exitcond = icmp eq i64 %iv.next, 1000237 br i1 %exitcond, label %for.end, label %for.body, !llvm.loop !71238 239for.end:240 ret void241}242 243!71 = distinct !{!71, !72, !73}244!72 = !{!"llvm.loop.vectorize.width", i32 4}245!73 = !{!"llvm.loop.vectorize.enable", i1 true}246 247declare float @__log2f_finite(float) #0248 249; CHECK-LABEL: @log2_f32250; CHECK: <4 x float> @__svml_log2f4251; CHECK: ret252define void @log2_f32(ptr nocapture %varray) {253entry:254 br label %for.body255 256for.body: ; preds = %for.body, %entry257 %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.body ]258 %tmp = trunc i64 %indvars.iv to i32259 %conv = sitofp i32 %tmp to float260 %call = tail call fast float @__log2f_finite(float %conv)261 %arrayidx = getelementptr inbounds float, ptr %varray, i64 %indvars.iv262 store float %call, ptr %arrayidx, align 4263 %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1264 %exitcond = icmp eq i64 %indvars.iv.next, 1000265 br i1 %exitcond, label %for.end, label %for.body, !llvm.loop !21266 267for.end: ; preds = %for.body268 ret void269}270 271!81 = distinct !{!21, !22, !23}272!82 = !{!"llvm.loop.vectorize.width", i32 4}273!83 = !{!"llvm.loop.vectorize.enable", i1 true}274 275 276declare double @__log2_finite(double) #0277 278; CHECK-LABEL: @log2_f64279; CHECK: <4 x double> @__svml_log24280; CHECK: ret281define void @log2_f64(ptr nocapture %varray) {282entry:283 br label %for.body284 285for.body: ; preds = %for.body, %entry286 %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.body ]287 %tmp = trunc i64 %indvars.iv to i32288 %conv = sitofp i32 %tmp to double289 %call = tail call fast double @__log2_finite(double %conv)290 %arrayidx = getelementptr inbounds double, ptr %varray, i64 %indvars.iv291 store double %call, ptr %arrayidx, align 4292 %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1293 %exitcond = icmp eq i64 %indvars.iv.next, 1000294 br i1 %exitcond, label %for.end, label %for.body, !llvm.loop !31295 296for.end: ; preds = %for.body297 ret void298}299 300!91 = distinct !{!31, !32, !33}301!92 = !{!"llvm.loop.vectorize.width", i32 4}302!93 = !{!"llvm.loop.vectorize.enable", i1 true}303 304declare float @__log10f_finite(float) #0305 306; CHECK-LABEL: @log10_f32307; CHECK: <4 x float> @__svml_log10f4308; CHECK: ret309define void @log10_f32(ptr nocapture %varray) {310entry:311 br label %for.body312 313for.body: ; preds = %for.body, %entry314 %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.body ]315 %tmp = trunc i64 %indvars.iv to i32316 %conv = sitofp i32 %tmp to float317 %call = tail call fast float @__log10f_finite(float %conv)318 %arrayidx = getelementptr inbounds float, ptr %varray, i64 %indvars.iv319 store float %call, ptr %arrayidx, align 4320 %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1321 %exitcond = icmp eq i64 %indvars.iv.next, 1000322 br i1 %exitcond, label %for.end, label %for.body, !llvm.loop !21323 324for.end: ; preds = %for.body325 ret void326}327 328!101 = distinct !{!21, !22, !23}329!102 = !{!"llvm.loop.vectorize.width", i32 4}330!103 = !{!"llvm.loop.vectorize.enable", i1 true}331 332 333declare double @__log10_finite(double) #0334 335; CHECK-LABEL: @log10_f64336; CHECK: <4 x double> @__svml_log104337; CHECK: ret338define void @log10_f64(ptr nocapture %varray) {339entry:340 br label %for.body341 342for.body: ; preds = %for.body, %entry343 %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.body ]344 %tmp = trunc i64 %indvars.iv to i32345 %conv = sitofp i32 %tmp to double346 %call = tail call fast double @__log10_finite(double %conv)347 %arrayidx = getelementptr inbounds double, ptr %varray, i64 %indvars.iv348 store double %call, ptr %arrayidx, align 4349 %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1350 %exitcond = icmp eq i64 %indvars.iv.next, 1000351 br i1 %exitcond, label %for.end, label %for.body, !llvm.loop !31352 353for.end: ; preds = %for.body354 ret void355}356 357!111 = distinct !{!31, !32, !33}358!112 = !{!"llvm.loop.vectorize.width", i32 4}359!113 = !{!"llvm.loop.vectorize.enable", i1 true}360 361declare float @__sqrtf_finite(float) #0362 363; CHECK-LABEL: @sqrt_f32364; CHECK: <4 x float> @__svml_sqrtf4365; CHECK: ret366define void @sqrt_f32(ptr nocapture %varray) {367entry:368 br label %for.body369 370for.body: ; preds = %for.body, %entry371 %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.body ]372 %tmp = trunc i64 %indvars.iv to i32373 %conv = sitofp i32 %tmp to float374 %call = tail call fast float @__sqrtf_finite(float %conv)375 %arrayidx = getelementptr inbounds float, ptr %varray, i64 %indvars.iv376 store float %call, ptr %arrayidx, align 4377 %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1378 %exitcond = icmp eq i64 %indvars.iv.next, 1000379 br i1 %exitcond, label %for.end, label %for.body, !llvm.loop !21380 381for.end: ; preds = %for.body382 ret void383}384 385!121 = distinct !{!21, !22, !23}386!122 = !{!"llvm.loop.vectorize.width", i32 4}387!123 = !{!"llvm.loop.vectorize.enable", i1 true}388 389 390declare double @__sqrt_finite(double) #0391 392; CHECK-LABEL: @sqrt_f64393; CHECK: <4 x double> @__svml_sqrt4394; CHECK: ret395define void @sqrt_f64(ptr nocapture %varray) {396entry:397 br label %for.body398 399for.body: ; preds = %for.body, %entry400 %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.body ]401 %tmp = trunc i64 %indvars.iv to i32402 %conv = sitofp i32 %tmp to double403 %call = tail call fast double @__sqrt_finite(double %conv)404 %arrayidx = getelementptr inbounds double, ptr %varray, i64 %indvars.iv405 store double %call, ptr %arrayidx, align 4406 %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1407 %exitcond = icmp eq i64 %indvars.iv.next, 1000408 br i1 %exitcond, label %for.end, label %for.body, !llvm.loop !31409 410for.end: ; preds = %for.body411 ret void412}413 414!131 = distinct !{!31, !32, !33}415!132 = !{!"llvm.loop.vectorize.width", i32 4}416!133 = !{!"llvm.loop.vectorize.enable", i1 true}417