1; RUN: opt -vector-library=SVML -inject-tli-mappings -loop-vectorize -S < %s | FileCheck %s 2 3; Test to verify that when math headers are built with 4; __FINITE_MATH_ONLY__ enabled, causing use of __<func>_finite 5; 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) #0 11 12; CHECK-LABEL: @exp_f32 13; CHECK: <4 x float> @__svml_expf4 14; CHECK: ret 15define void @exp_f32(float* nocapture %varray) { 16entry: 17 br label %for.body 18 19for.body: ; preds = %for.body, %entry 20 %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.body ] 21 %tmp = trunc i64 %indvars.iv to i32 22 %conv = sitofp i32 %tmp to float 23 %call = tail call fast float @__expf_finite(float %conv) 24 %arrayidx = getelementptr inbounds float, float* %varray, i64 %indvars.iv 25 store float %call, float* %arrayidx, align 4 26 %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1 27 %exitcond = icmp eq i64 %indvars.iv.next, 1000 28 br i1 %exitcond, label %for.end, label %for.body, !llvm.loop !1 29 30for.end: ; preds = %for.body 31 ret void 32} 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) #0 40 41; CHECK-LABEL: @exp_f64 42; CHECK: <4 x double> @__svml_exp4 43; CHECK: ret 44define void @exp_f64(double* nocapture %varray) { 45entry: 46 br label %for.body 47 48for.body: ; preds = %for.body, %entry 49 %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.body ] 50 %tmp = trunc i64 %indvars.iv to i32 51 %conv = sitofp i32 %tmp to double 52 %call = tail call fast double @__exp_finite(double %conv) 53 %arrayidx = getelementptr inbounds double, double* %varray, i64 %indvars.iv 54 store double %call, double* %arrayidx, align 4 55 %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1 56 %exitcond = icmp eq i64 %indvars.iv.next, 1000 57 br i1 %exitcond, label %for.end, label %for.body, !llvm.loop !11 58 59for.end: ; preds = %for.body 60 ret void 61} 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) #0 71 72; CHECK-LABEL: @log_f32 73; CHECK: <4 x float> @__svml_logf4 74; CHECK: ret 75define void @log_f32(float* nocapture %varray) { 76entry: 77 br label %for.body 78 79for.body: ; preds = %for.body, %entry 80 %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.body ] 81 %tmp = trunc i64 %indvars.iv to i32 82 %conv = sitofp i32 %tmp to float 83 %call = tail call fast float @__logf_finite(float %conv) 84 %arrayidx = getelementptr inbounds float, float* %varray, i64 %indvars.iv 85 store float %call, float* %arrayidx, align 4 86 %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1 87 %exitcond = icmp eq i64 %indvars.iv.next, 1000 88 br i1 %exitcond, label %for.end, label %for.body, !llvm.loop !21 89 90for.end: ; preds = %for.body 91 ret void 92} 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) #0 100 101; CHECK-LABEL: @log_f64 102; CHECK: <4 x double> @__svml_log4 103; CHECK: ret 104define void @log_f64(double* nocapture %varray) { 105entry: 106 br label %for.body 107 108for.body: ; preds = %for.body, %entry 109 %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.body ] 110 %tmp = trunc i64 %indvars.iv to i32 111 %conv = sitofp i32 %tmp to double 112 %call = tail call fast double @__log_finite(double %conv) 113 %arrayidx = getelementptr inbounds double, double* %varray, i64 %indvars.iv 114 store double %call, double* %arrayidx, align 4 115 %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1 116 %exitcond = icmp eq i64 %indvars.iv.next, 1000 117 br i1 %exitcond, label %for.end, label %for.body, !llvm.loop !31 118 119for.end: ; preds = %for.body 120 ret void 121} 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) #0 129 130; CHECK-LABEL: @pow_f32 131; CHECK: <4 x float> @__svml_powf4 132; CHECK: ret 133define void @pow_f32(float* nocapture %varray, float* nocapture readonly %exp) { 134entry: 135 br label %for.body 136 137for.body: ; preds = %for.body, %entry 138 %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.body ] 139 %tmp = trunc i64 %indvars.iv to i32 140 %conv = sitofp i32 %tmp to float 141 %arrayidx = getelementptr inbounds float, float* %exp, i64 %indvars.iv 142 %tmp1 = load float, float* %arrayidx, align 4 143 %tmp2 = tail call fast float @__powf_finite(float %conv, float %tmp1) 144 %arrayidx2 = getelementptr inbounds float, float* %varray, i64 %indvars.iv 145 store float %tmp2, float* %arrayidx2, align 4 146 %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1 147 %exitcond = icmp eq i64 %indvars.iv.next, 1000 148 br i1 %exitcond, label %for.end, label %for.body, !llvm.loop !41 149 150for.end: ; preds = %for.body 151 ret void 152} 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) #0 160 161; CHECK-LABEL: @pow_f64 162; CHECK: <4 x double> @__svml_pow4 163; CHECK: ret 164define void @pow_f64(double* nocapture %varray, double* nocapture readonly %exp) { 165entry: 166 br label %for.body 167 168for.body: ; preds = %for.body, %entry 169 %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.body ] 170 %tmp = trunc i64 %indvars.iv to i32 171 %conv = sitofp i32 %tmp to double 172 %arrayidx = getelementptr inbounds double, double* %exp, i64 %indvars.iv 173 %tmp1 = load double, double* %arrayidx, align 4 174 %tmp2 = tail call fast double @__pow_finite(double %conv, double %tmp1) 175 %arrayidx2 = getelementptr inbounds double, double* %varray, i64 %indvars.iv 176 store double %tmp2, double* %arrayidx2, align 4 177 %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1 178 %exitcond = icmp eq i64 %indvars.iv.next, 1000 179 br i1 %exitcond, label %for.end, label %for.body, !llvm.loop !51 180 181for.end: ; preds = %for.body 182 ret void 183} 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) #0 190 191define void @exp2f_finite(float* nocapture %varray) { 192; CHECK-LABEL: @exp2f_finite( 193; CHECK: call <4 x float> @__svml_exp2f4(<4 x float> %{{.*}}) 194; CHECK: ret void 195; 196entry: 197 br label %for.body 198 199for.body: 200 %iv = phi i64 [ 0, %entry ], [ %iv.next, %for.body ] 201 %tmp = trunc i64 %iv to i32 202 %conv = sitofp i32 %tmp to float 203 %call = tail call float @__exp2f_finite(float %conv) 204 %arrayidx = getelementptr inbounds float, float* %varray, i64 %iv 205 store float %call, float* %arrayidx, align 4 206 %iv.next = add nuw nsw i64 %iv, 1 207 %exitcond = icmp eq i64 %iv.next, 1000 208 br i1 %exitcond, label %for.end, label %for.body, !llvm.loop !61 209 210for.end: 211 ret void 212} 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) #0 219 220define void @exp2_finite(double* nocapture %varray) { 221; CHECK-LABEL: @exp2_finite( 222; CHECK: call <4 x double> @__svml_exp24(<4 x double> {{.*}}) 223; CHECK: ret void 224; 225entry: 226 br label %for.body 227 228for.body: 229 %iv = phi i64 [ 0, %entry ], [ %iv.next, %for.body ] 230 %tmp = trunc i64 %iv to i32 231 %conv = sitofp i32 %tmp to double 232 %call = tail call double @__exp2_finite(double %conv) 233 %arrayidx = getelementptr inbounds double, double* %varray, i64 %iv 234 store double %call, double* %arrayidx, align 4 235 %iv.next = add nuw nsw i64 %iv, 1 236 %exitcond = icmp eq i64 %iv.next, 1000 237 br i1 %exitcond, label %for.end, label %for.body, !llvm.loop !71 238 239for.end: 240 ret void 241} 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) #0 248 249; CHECK-LABEL: @log2_f32 250; CHECK: <4 x float> @__svml_log2f4 251; CHECK: ret 252define void @log2_f32(float* nocapture %varray) { 253entry: 254 br label %for.body 255 256for.body: ; preds = %for.body, %entry 257 %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.body ] 258 %tmp = trunc i64 %indvars.iv to i32 259 %conv = sitofp i32 %tmp to float 260 %call = tail call fast float @__log2f_finite(float %conv) 261 %arrayidx = getelementptr inbounds float, float* %varray, i64 %indvars.iv 262 store float %call, float* %arrayidx, align 4 263 %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1 264 %exitcond = icmp eq i64 %indvars.iv.next, 1000 265 br i1 %exitcond, label %for.end, label %for.body, !llvm.loop !21 266 267for.end: ; preds = %for.body 268 ret void 269} 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) #0 277 278; CHECK-LABEL: @log2_f64 279; CHECK: <4 x double> @__svml_log24 280; CHECK: ret 281define void @log2_f64(double* nocapture %varray) { 282entry: 283 br label %for.body 284 285for.body: ; preds = %for.body, %entry 286 %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.body ] 287 %tmp = trunc i64 %indvars.iv to i32 288 %conv = sitofp i32 %tmp to double 289 %call = tail call fast double @__log2_finite(double %conv) 290 %arrayidx = getelementptr inbounds double, double* %varray, i64 %indvars.iv 291 store double %call, double* %arrayidx, align 4 292 %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1 293 %exitcond = icmp eq i64 %indvars.iv.next, 1000 294 br i1 %exitcond, label %for.end, label %for.body, !llvm.loop !31 295 296for.end: ; preds = %for.body 297 ret void 298} 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) #0 305 306; CHECK-LABEL: @log10_f32 307; CHECK: <4 x float> @__svml_log10f4 308; CHECK: ret 309define void @log10_f32(float* nocapture %varray) { 310entry: 311 br label %for.body 312 313for.body: ; preds = %for.body, %entry 314 %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.body ] 315 %tmp = trunc i64 %indvars.iv to i32 316 %conv = sitofp i32 %tmp to float 317 %call = tail call fast float @__log10f_finite(float %conv) 318 %arrayidx = getelementptr inbounds float, float* %varray, i64 %indvars.iv 319 store float %call, float* %arrayidx, align 4 320 %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1 321 %exitcond = icmp eq i64 %indvars.iv.next, 1000 322 br i1 %exitcond, label %for.end, label %for.body, !llvm.loop !21 323 324for.end: ; preds = %for.body 325 ret void 326} 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) #0 334 335; CHECK-LABEL: @log10_f64 336; CHECK: <4 x double> @__svml_log104 337; CHECK: ret 338define void @log10_f64(double* nocapture %varray) { 339entry: 340 br label %for.body 341 342for.body: ; preds = %for.body, %entry 343 %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.body ] 344 %tmp = trunc i64 %indvars.iv to i32 345 %conv = sitofp i32 %tmp to double 346 %call = tail call fast double @__log10_finite(double %conv) 347 %arrayidx = getelementptr inbounds double, double* %varray, i64 %indvars.iv 348 store double %call, double* %arrayidx, align 4 349 %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1 350 %exitcond = icmp eq i64 %indvars.iv.next, 1000 351 br i1 %exitcond, label %for.end, label %for.body, !llvm.loop !31 352 353for.end: ; preds = %for.body 354 ret void 355} 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) #0 362 363; CHECK-LABEL: @sqrt_f32 364; CHECK: <4 x float> @__svml_sqrtf4 365; CHECK: ret 366define void @sqrt_f32(float* nocapture %varray) { 367entry: 368 br label %for.body 369 370for.body: ; preds = %for.body, %entry 371 %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.body ] 372 %tmp = trunc i64 %indvars.iv to i32 373 %conv = sitofp i32 %tmp to float 374 %call = tail call fast float @__sqrtf_finite(float %conv) 375 %arrayidx = getelementptr inbounds float, float* %varray, i64 %indvars.iv 376 store float %call, float* %arrayidx, align 4 377 %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1 378 %exitcond = icmp eq i64 %indvars.iv.next, 1000 379 br i1 %exitcond, label %for.end, label %for.body, !llvm.loop !21 380 381for.end: ; preds = %for.body 382 ret void 383} 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) #0 391 392; CHECK-LABEL: @sqrt_f64 393; CHECK: <4 x double> @__svml_sqrt4 394; CHECK: ret 395define void @sqrt_f64(double* nocapture %varray) { 396entry: 397 br label %for.body 398 399for.body: ; preds = %for.body, %entry 400 %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.body ] 401 %tmp = trunc i64 %indvars.iv to i32 402 %conv = sitofp i32 %tmp to double 403 %call = tail call fast double @__sqrt_finite(double %conv) 404 %arrayidx = getelementptr inbounds double, double* %varray, i64 %indvars.iv 405 store double %call, double* %arrayidx, align 4 406 %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1 407 %exitcond = icmp eq i64 %indvars.iv.next, 1000 408 br i1 %exitcond, label %for.end, label %for.body, !llvm.loop !31 409 410for.end: ; preds = %for.body 411 ret void 412} 413 414!131 = distinct !{!31, !32, !33} 415!132 = !{!"llvm.loop.vectorize.width", i32 4} 416!133 = !{!"llvm.loop.vectorize.enable", i1 true} 417