1907 lines · plain
1; RUN: opt < %s -passes=loop-vectorize,dce,instcombine -force-vector-interleave=1 -force-vector-width=4 -S | FileCheck %s2 3define void @sqrt_f32(i32 %n, ptr %y, ptr %x) {4; CHECK-LABEL: @sqrt_f32(5; CHECK: llvm.sqrt.v4f326; CHECK: ret void7;8entry:9 %cmp6 = icmp sgt i32 %n, 010 br i1 %cmp6, label %for.body, label %for.end11 12for.body: ; preds = %entry, %for.body13 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]14 %arrayidx = getelementptr inbounds float, ptr %y, i64 %indvars.iv15 %0 = load float, ptr %arrayidx, align 416 %call = tail call float @llvm.sqrt.f32(float %0)17 %arrayidx2 = getelementptr inbounds float, ptr %x, i64 %indvars.iv18 store float %call, ptr %arrayidx2, align 419 %indvars.iv.next = add i64 %indvars.iv, 120 %lftr.wideiv = trunc i64 %indvars.iv.next to i3221 %exitcond = icmp eq i32 %lftr.wideiv, %n22 br i1 %exitcond, label %for.end, label %for.body23 24for.end: ; preds = %for.body, %entry25 ret void26}27 28declare float @llvm.sqrt.f32(float)29 30define void @sqrt_f64(i32 %n, ptr %y, ptr %x) {31; CHECK-LABEL: @sqrt_f64(32; CHECK: llvm.sqrt.v4f6433; CHECK: ret void34;35entry:36 %cmp6 = icmp sgt i32 %n, 037 br i1 %cmp6, label %for.body, label %for.end38 39for.body: ; preds = %entry, %for.body40 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]41 %arrayidx = getelementptr inbounds double, ptr %y, i64 %indvars.iv42 %0 = load double, ptr %arrayidx, align 843 %call = tail call double @llvm.sqrt.f64(double %0)44 %arrayidx2 = getelementptr inbounds double, ptr %x, i64 %indvars.iv45 store double %call, ptr %arrayidx2, align 846 %indvars.iv.next = add i64 %indvars.iv, 147 %lftr.wideiv = trunc i64 %indvars.iv.next to i3248 %exitcond = icmp eq i32 %lftr.wideiv, %n49 br i1 %exitcond, label %for.end, label %for.body50 51for.end: ; preds = %for.body, %entry52 ret void53}54 55declare double @llvm.sqrt.f64(double)56 57define void @sin_f32(i32 %n, ptr %y, ptr %x) {58; CHECK-LABEL: @sin_f32(59; CHECK: llvm.sin.v4f3260; CHECK: ret void61;62entry:63 %cmp6 = icmp sgt i32 %n, 064 br i1 %cmp6, label %for.body, label %for.end65 66for.body: ; preds = %entry, %for.body67 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]68 %arrayidx = getelementptr inbounds float, ptr %y, i64 %indvars.iv69 %0 = load float, ptr %arrayidx, align 470 %call = tail call float @llvm.sin.f32(float %0)71 %arrayidx2 = getelementptr inbounds float, ptr %x, i64 %indvars.iv72 store float %call, ptr %arrayidx2, align 473 %indvars.iv.next = add i64 %indvars.iv, 174 %lftr.wideiv = trunc i64 %indvars.iv.next to i3275 %exitcond = icmp eq i32 %lftr.wideiv, %n76 br i1 %exitcond, label %for.end, label %for.body77 78for.end: ; preds = %for.body, %entry79 ret void80}81 82declare float @llvm.sin.f32(float)83 84define void @sin_f64(i32 %n, ptr %y, ptr %x) {85; CHECK-LABEL: @sin_f64(86; CHECK: llvm.sin.v4f6487; CHECK: ret void88;89entry:90 %cmp6 = icmp sgt i32 %n, 091 br i1 %cmp6, label %for.body, label %for.end92 93for.body: ; preds = %entry, %for.body94 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]95 %arrayidx = getelementptr inbounds double, ptr %y, i64 %indvars.iv96 %0 = load double, ptr %arrayidx, align 897 %call = tail call double @llvm.sin.f64(double %0)98 %arrayidx2 = getelementptr inbounds double, ptr %x, i64 %indvars.iv99 store double %call, ptr %arrayidx2, align 8100 %indvars.iv.next = add i64 %indvars.iv, 1101 %lftr.wideiv = trunc i64 %indvars.iv.next to i32102 %exitcond = icmp eq i32 %lftr.wideiv, %n103 br i1 %exitcond, label %for.end, label %for.body104 105for.end: ; preds = %for.body, %entry106 ret void107}108 109declare double @llvm.sin.f64(double)110 111define void @cos_f32(i32 %n, ptr %y, ptr %x) {112; CHECK-LABEL: @cos_f32(113; CHECK: llvm.cos.v4f32114; CHECK: ret void115;116entry:117 %cmp6 = icmp sgt i32 %n, 0118 br i1 %cmp6, label %for.body, label %for.end119 120for.body: ; preds = %entry, %for.body121 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]122 %arrayidx = getelementptr inbounds float, ptr %y, i64 %indvars.iv123 %0 = load float, ptr %arrayidx, align 4124 %call = tail call float @llvm.cos.f32(float %0)125 %arrayidx2 = getelementptr inbounds float, ptr %x, i64 %indvars.iv126 store float %call, ptr %arrayidx2, align 4127 %indvars.iv.next = add i64 %indvars.iv, 1128 %lftr.wideiv = trunc i64 %indvars.iv.next to i32129 %exitcond = icmp eq i32 %lftr.wideiv, %n130 br i1 %exitcond, label %for.end, label %for.body131 132for.end: ; preds = %for.body, %entry133 ret void134}135 136declare float @llvm.cos.f32(float)137 138define void @cos_f64(i32 %n, ptr %y, ptr %x) {139; CHECK-LABEL: @cos_f64(140; CHECK: llvm.cos.v4f64141; CHECK: ret void142;143entry:144 %cmp6 = icmp sgt i32 %n, 0145 br i1 %cmp6, label %for.body, label %for.end146 147for.body: ; preds = %entry, %for.body148 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]149 %arrayidx = getelementptr inbounds double, ptr %y, i64 %indvars.iv150 %0 = load double, ptr %arrayidx, align 8151 %call = tail call double @llvm.cos.f64(double %0)152 %arrayidx2 = getelementptr inbounds double, ptr %x, i64 %indvars.iv153 store double %call, ptr %arrayidx2, align 8154 %indvars.iv.next = add i64 %indvars.iv, 1155 %lftr.wideiv = trunc i64 %indvars.iv.next to i32156 %exitcond = icmp eq i32 %lftr.wideiv, %n157 br i1 %exitcond, label %for.end, label %for.body158 159for.end: ; preds = %for.body, %entry160 ret void161}162 163declare double @llvm.cos.f64(double)164 165define void @tan_f32(i32 %n, ptr %y, ptr %x) {166; CHECK-LABEL: @tan_f32(167; CHECK: llvm.tan.v4f32168; CHECK: ret void169;170entry:171 %cmp6 = icmp sgt i32 %n, 0172 br i1 %cmp6, label %for.body, label %for.end173 174for.body: ; preds = %entry, %for.body175 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]176 %arrayidx = getelementptr inbounds float, ptr %y, i64 %indvars.iv177 %0 = load float, ptr %arrayidx, align 4178 %call = tail call float @llvm.tan.f32(float %0)179 %arrayidx2 = getelementptr inbounds float, ptr %x, i64 %indvars.iv180 store float %call, ptr %arrayidx2, align 4181 %indvars.iv.next = add i64 %indvars.iv, 1182 %lftr.wideiv = trunc i64 %indvars.iv.next to i32183 %exitcond = icmp eq i32 %lftr.wideiv, %n184 br i1 %exitcond, label %for.end, label %for.body185 186for.end: ; preds = %for.body, %entry187 ret void188}189 190declare float @llvm.tan.f32(float)191 192define void @tan_f64(i32 %n, ptr %y, ptr %x) {193; CHECK-LABEL: @tan_f64(194; CHECK: llvm.tan.v4f64195; CHECK: ret void196;197entry:198 %cmp6 = icmp sgt i32 %n, 0199 br i1 %cmp6, label %for.body, label %for.end200 201for.body: ; preds = %entry, %for.body202 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]203 %arrayidx = getelementptr inbounds double, ptr %y, i64 %indvars.iv204 %0 = load double, ptr %arrayidx, align 8205 %call = tail call double @llvm.tan.f64(double %0)206 %arrayidx2 = getelementptr inbounds double, ptr %x, i64 %indvars.iv207 store double %call, ptr %arrayidx2, align 8208 %indvars.iv.next = add i64 %indvars.iv, 1209 %lftr.wideiv = trunc i64 %indvars.iv.next to i32210 %exitcond = icmp eq i32 %lftr.wideiv, %n211 br i1 %exitcond, label %for.end, label %for.body212 213for.end: ; preds = %for.body, %entry214 ret void215}216 217declare double @llvm.tan.f64(double)218 219define void @exp_f32(i32 %n, ptr %y, ptr %x) {220; CHECK-LABEL: @exp_f32(221; CHECK: llvm.exp.v4f32222; CHECK: ret void223;224entry:225 %cmp6 = icmp sgt i32 %n, 0226 br i1 %cmp6, label %for.body, label %for.end227 228for.body: ; preds = %entry, %for.body229 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]230 %arrayidx = getelementptr inbounds float, ptr %y, i64 %indvars.iv231 %0 = load float, ptr %arrayidx, align 4232 %call = tail call float @llvm.exp.f32(float %0)233 %arrayidx2 = getelementptr inbounds float, ptr %x, i64 %indvars.iv234 store float %call, ptr %arrayidx2, align 4235 %indvars.iv.next = add i64 %indvars.iv, 1236 %lftr.wideiv = trunc i64 %indvars.iv.next to i32237 %exitcond = icmp eq i32 %lftr.wideiv, %n238 br i1 %exitcond, label %for.end, label %for.body239 240for.end: ; preds = %for.body, %entry241 ret void242}243 244declare float @llvm.exp.f32(float)245 246define void @exp_f64(i32 %n, ptr %y, ptr %x) {247; CHECK-LABEL: @exp_f64(248; CHECK: llvm.exp.v4f64249; CHECK: ret void250;251entry:252 %cmp6 = icmp sgt i32 %n, 0253 br i1 %cmp6, label %for.body, label %for.end254 255for.body: ; preds = %entry, %for.body256 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]257 %arrayidx = getelementptr inbounds double, ptr %y, i64 %indvars.iv258 %0 = load double, ptr %arrayidx, align 8259 %call = tail call double @llvm.exp.f64(double %0)260 %arrayidx2 = getelementptr inbounds double, ptr %x, i64 %indvars.iv261 store double %call, ptr %arrayidx2, align 8262 %indvars.iv.next = add i64 %indvars.iv, 1263 %lftr.wideiv = trunc i64 %indvars.iv.next to i32264 %exitcond = icmp eq i32 %lftr.wideiv, %n265 br i1 %exitcond, label %for.end, label %for.body266 267for.end: ; preds = %for.body, %entry268 ret void269}270 271declare double @llvm.exp.f64(double)272 273define void @exp2_f32(i32 %n, ptr %y, ptr %x) {274; CHECK-LABEL: @exp2_f32(275; CHECK: llvm.exp2.v4f32276; CHECK: ret void277;278entry:279 %cmp6 = icmp sgt i32 %n, 0280 br i1 %cmp6, label %for.body, label %for.end281 282for.body: ; preds = %entry, %for.body283 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]284 %arrayidx = getelementptr inbounds float, ptr %y, i64 %indvars.iv285 %0 = load float, ptr %arrayidx, align 4286 %call = tail call float @llvm.exp2.f32(float %0)287 %arrayidx2 = getelementptr inbounds float, ptr %x, i64 %indvars.iv288 store float %call, ptr %arrayidx2, align 4289 %indvars.iv.next = add i64 %indvars.iv, 1290 %lftr.wideiv = trunc i64 %indvars.iv.next to i32291 %exitcond = icmp eq i32 %lftr.wideiv, %n292 br i1 %exitcond, label %for.end, label %for.body293 294for.end: ; preds = %for.body, %entry295 ret void296}297 298declare float @llvm.exp2.f32(float)299 300define void @exp2_f64(i32 %n, ptr %y, ptr %x) {301; CHECK-LABEL: @exp2_f64(302; CHECK: llvm.exp2.v4f64303; CHECK: ret void304;305entry:306 %cmp6 = icmp sgt i32 %n, 0307 br i1 %cmp6, label %for.body, label %for.end308 309for.body: ; preds = %entry, %for.body310 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]311 %arrayidx = getelementptr inbounds double, ptr %y, i64 %indvars.iv312 %0 = load double, ptr %arrayidx, align 8313 %call = tail call double @llvm.exp2.f64(double %0)314 %arrayidx2 = getelementptr inbounds double, ptr %x, i64 %indvars.iv315 store double %call, ptr %arrayidx2, align 8316 %indvars.iv.next = add i64 %indvars.iv, 1317 %lftr.wideiv = trunc i64 %indvars.iv.next to i32318 %exitcond = icmp eq i32 %lftr.wideiv, %n319 br i1 %exitcond, label %for.end, label %for.body320 321for.end: ; preds = %for.body, %entry322 ret void323}324 325declare double @llvm.exp2.f64(double)326 327define void @ldexp_f32i32(i32 %n, ptr %y, ptr %x, i32 %exp) {328; CHECK-LABEL: @ldexp_f32i32(329; CHECK: llvm.ldexp.v4f32.v4i32330; CHECK: ret void331;332entry:333 br label %for.body334 335for.body: ; preds = %entry, %for.body336 %iv = phi i32 [ 0, %entry ], [ %iv.next, %for.body ]337 %arrayidx = getelementptr inbounds float, ptr %y, i32 %iv338 %0 = load float, ptr %arrayidx, align 4339 %call = tail call float @llvm.ldexp.f32.i32(float %0, i32 %exp)340 %arrayidx2 = getelementptr inbounds float, ptr %x, i32 %iv341 store float %call, ptr %arrayidx2, align 4342 %iv.next = add i32 %iv, 1343 %exitcond = icmp eq i32 %iv.next, %n344 br i1 %exitcond, label %for.end, label %for.body345 346for.end: ; preds = %for.body, %entry347 ret void348}349 350declare float @llvm.ldexp.f32.i32(float, i32)351 352define void @ldexp_f64i32(i32 %n, ptr %y, ptr %x, i32 %exp) {353; CHECK-LABEL: @ldexp_f64i32(354; CHECK: llvm.ldexp.v4f64.v4i32355; CHECK: ret void356;357entry:358 br label %for.body359 360for.body: ; preds = %entry, %for.body361 %iv = phi i32 [ 0, %entry ], [ %iv.next, %for.body ]362 %arrayidx = getelementptr inbounds double, ptr %y, i32 %iv363 %0 = load double, ptr %arrayidx, align 8364 %call = tail call double @llvm.ldexp.f64.i32(double %0, i32 %exp)365 %arrayidx2 = getelementptr inbounds double, ptr %x, i32 %iv366 store double %call, ptr %arrayidx2, align 8367 %iv.next = add i32 %iv, 1368 %exitcond = icmp eq i32 %iv.next, %n369 br i1 %exitcond, label %for.end, label %for.body370 371for.end: ; preds = %for.body, %entry372 ret void373}374 375declare double @llvm.ldexp.f64.i32(double, i32)376 377define void @log_f32(i32 %n, ptr %y, ptr %x) {378; CHECK-LABEL: @log_f32(379; CHECK: llvm.log.v4f32380; CHECK: ret void381;382entry:383 %cmp6 = icmp sgt i32 %n, 0384 br i1 %cmp6, label %for.body, label %for.end385 386for.body: ; preds = %entry, %for.body387 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]388 %arrayidx = getelementptr inbounds float, ptr %y, i64 %indvars.iv389 %0 = load float, ptr %arrayidx, align 4390 %call = tail call float @llvm.log.f32(float %0)391 %arrayidx2 = getelementptr inbounds float, ptr %x, i64 %indvars.iv392 store float %call, ptr %arrayidx2, align 4393 %indvars.iv.next = add i64 %indvars.iv, 1394 %lftr.wideiv = trunc i64 %indvars.iv.next to i32395 %exitcond = icmp eq i32 %lftr.wideiv, %n396 br i1 %exitcond, label %for.end, label %for.body397 398for.end: ; preds = %for.body, %entry399 ret void400}401 402declare float @llvm.log.f32(float)403 404define void @log_f64(i32 %n, ptr %y, ptr %x) {405; CHECK-LABEL: @log_f64(406; CHECK: llvm.log.v4f64407; CHECK: ret void408;409entry:410 %cmp6 = icmp sgt i32 %n, 0411 br i1 %cmp6, label %for.body, label %for.end412 413for.body: ; preds = %entry, %for.body414 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]415 %arrayidx = getelementptr inbounds double, ptr %y, i64 %indvars.iv416 %0 = load double, ptr %arrayidx, align 8417 %call = tail call double @llvm.log.f64(double %0)418 %arrayidx2 = getelementptr inbounds double, ptr %x, i64 %indvars.iv419 store double %call, ptr %arrayidx2, align 8420 %indvars.iv.next = add i64 %indvars.iv, 1421 %lftr.wideiv = trunc i64 %indvars.iv.next to i32422 %exitcond = icmp eq i32 %lftr.wideiv, %n423 br i1 %exitcond, label %for.end, label %for.body424 425for.end: ; preds = %for.body, %entry426 ret void427}428 429declare double @llvm.log.f64(double)430 431define void @log10_f32(i32 %n, ptr %y, ptr %x) {432; CHECK-LABEL: @log10_f32(433; CHECK: llvm.log10.v4f32434; CHECK: ret void435;436entry:437 %cmp6 = icmp sgt i32 %n, 0438 br i1 %cmp6, label %for.body, label %for.end439 440for.body: ; preds = %entry, %for.body441 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]442 %arrayidx = getelementptr inbounds float, ptr %y, i64 %indvars.iv443 %0 = load float, ptr %arrayidx, align 4444 %call = tail call float @llvm.log10.f32(float %0)445 %arrayidx2 = getelementptr inbounds float, ptr %x, i64 %indvars.iv446 store float %call, ptr %arrayidx2, align 4447 %indvars.iv.next = add i64 %indvars.iv, 1448 %lftr.wideiv = trunc i64 %indvars.iv.next to i32449 %exitcond = icmp eq i32 %lftr.wideiv, %n450 br i1 %exitcond, label %for.end, label %for.body451 452for.end: ; preds = %for.body, %entry453 ret void454}455 456declare float @llvm.log10.f32(float)457 458define void @log10_f64(i32 %n, ptr %y, ptr %x) {459; CHECK-LABEL: @log10_f64(460; CHECK: llvm.log10.v4f64461; CHECK: ret void462;463entry:464 %cmp6 = icmp sgt i32 %n, 0465 br i1 %cmp6, label %for.body, label %for.end466 467for.body: ; preds = %entry, %for.body468 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]469 %arrayidx = getelementptr inbounds double, ptr %y, i64 %indvars.iv470 %0 = load double, ptr %arrayidx, align 8471 %call = tail call double @llvm.log10.f64(double %0)472 %arrayidx2 = getelementptr inbounds double, ptr %x, i64 %indvars.iv473 store double %call, ptr %arrayidx2, align 8474 %indvars.iv.next = add i64 %indvars.iv, 1475 %lftr.wideiv = trunc i64 %indvars.iv.next to i32476 %exitcond = icmp eq i32 %lftr.wideiv, %n477 br i1 %exitcond, label %for.end, label %for.body478 479for.end: ; preds = %for.body, %entry480 ret void481}482 483declare double @llvm.log10.f64(double)484 485define void @log2_f32(i32 %n, ptr %y, ptr %x) {486; CHECK-LABEL: @log2_f32(487; CHECK: llvm.log2.v4f32488; CHECK: ret void489;490entry:491 %cmp6 = icmp sgt i32 %n, 0492 br i1 %cmp6, label %for.body, label %for.end493 494for.body: ; preds = %entry, %for.body495 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]496 %arrayidx = getelementptr inbounds float, ptr %y, i64 %indvars.iv497 %0 = load float, ptr %arrayidx, align 4498 %call = tail call float @llvm.log2.f32(float %0)499 %arrayidx2 = getelementptr inbounds float, ptr %x, i64 %indvars.iv500 store float %call, ptr %arrayidx2, align 4501 %indvars.iv.next = add i64 %indvars.iv, 1502 %lftr.wideiv = trunc i64 %indvars.iv.next to i32503 %exitcond = icmp eq i32 %lftr.wideiv, %n504 br i1 %exitcond, label %for.end, label %for.body505 506for.end: ; preds = %for.body, %entry507 ret void508}509 510declare float @llvm.log2.f32(float)511 512define void @log2_f64(i32 %n, ptr %y, ptr %x) {513; CHECK-LABEL: @log2_f64(514; CHECK: llvm.log2.v4f64515; CHECK: ret void516;517entry:518 %cmp6 = icmp sgt i32 %n, 0519 br i1 %cmp6, label %for.body, label %for.end520 521for.body: ; preds = %entry, %for.body522 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]523 %arrayidx = getelementptr inbounds double, ptr %y, i64 %indvars.iv524 %0 = load double, ptr %arrayidx, align 8525 %call = tail call double @llvm.log2.f64(double %0)526 %arrayidx2 = getelementptr inbounds double, ptr %x, i64 %indvars.iv527 store double %call, ptr %arrayidx2, align 8528 %indvars.iv.next = add i64 %indvars.iv, 1529 %lftr.wideiv = trunc i64 %indvars.iv.next to i32530 %exitcond = icmp eq i32 %lftr.wideiv, %n531 br i1 %exitcond, label %for.end, label %for.body532 533for.end: ; preds = %for.body, %entry534 ret void535}536 537declare double @llvm.log2.f64(double)538 539define void @fabs_f32(i32 %n, ptr %y, ptr %x) {540; CHECK-LABEL: @fabs_f32(541; CHECK: llvm.fabs.v4f32542; CHECK: ret void543;544entry:545 %cmp6 = icmp sgt i32 %n, 0546 br i1 %cmp6, label %for.body, label %for.end547 548for.body: ; preds = %entry, %for.body549 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]550 %arrayidx = getelementptr inbounds float, ptr %y, i64 %indvars.iv551 %0 = load float, ptr %arrayidx, align 4552 %call = tail call float @llvm.fabs.f32(float %0)553 %arrayidx2 = getelementptr inbounds float, ptr %x, i64 %indvars.iv554 store float %call, ptr %arrayidx2, align 4555 %indvars.iv.next = add i64 %indvars.iv, 1556 %lftr.wideiv = trunc i64 %indvars.iv.next to i32557 %exitcond = icmp eq i32 %lftr.wideiv, %n558 br i1 %exitcond, label %for.end, label %for.body559 560for.end: ; preds = %for.body, %entry561 ret void562}563 564declare float @llvm.fabs.f32(float)565 566define void @fabs_f64(i32 %n, ptr %y, ptr %x) {567; CHECK-LABEL: @fabs_f64(568; CHECK: llvm.fabs.v4f64569; CHECK: ret void570;571entry:572 %cmp6 = icmp sgt i32 %n, 0573 br i1 %cmp6, label %for.body, label %for.end574 575for.body: ; preds = %entry, %for.body576 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]577 %arrayidx = getelementptr inbounds double, ptr %y, i64 %indvars.iv578 %0 = load double, ptr %arrayidx, align 8579 %call = tail call double @llvm.fabs(double %0)580 %arrayidx2 = getelementptr inbounds double, ptr %x, i64 %indvars.iv581 store double %call, ptr %arrayidx2, align 8582 %indvars.iv.next = add i64 %indvars.iv, 1583 %lftr.wideiv = trunc i64 %indvars.iv.next to i32584 %exitcond = icmp eq i32 %lftr.wideiv, %n585 br i1 %exitcond, label %for.end, label %for.body586 587for.end: ; preds = %for.body, %entry588 ret void589}590 591declare double @llvm.fabs(double)592 593define void @copysign_f32(i32 %n, ptr %y, ptr %x, ptr %z) {594; CHECK-LABEL: @copysign_f32(595; CHECK: llvm.copysign.v4f32596; CHECK: ret void597;598entry:599 %cmp6 = icmp sgt i32 %n, 0600 br i1 %cmp6, label %for.body, label %for.end601 602for.body: ; preds = %entry, %for.body603 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]604 %arrayidx = getelementptr inbounds float, ptr %y, i64 %indvars.iv605 %0 = load float, ptr %arrayidx, align 4606 %arrayidx1 = getelementptr inbounds float, ptr %z, i64 %indvars.iv607 %1 = load float, ptr %arrayidx1, align 4608 %call = tail call float @llvm.copysign.f32(float %0, float %1)609 %arrayidx2 = getelementptr inbounds float, ptr %x, i64 %indvars.iv610 store float %call, ptr %arrayidx2, align 4611 %indvars.iv.next = add i64 %indvars.iv, 1612 %lftr.wideiv = trunc i64 %indvars.iv.next to i32613 %exitcond = icmp eq i32 %lftr.wideiv, %n614 br i1 %exitcond, label %for.end, label %for.body615 616for.end: ; preds = %for.body, %entry617 ret void618}619 620declare float @llvm.copysign.f32(float, float)621 622define void @copysign_f64(i32 %n, ptr %y, ptr %x, ptr %z) {623; CHECK-LABEL: @copysign_f64(624; CHECK: llvm.copysign.v4f64625; CHECK: ret void626;627entry:628 %cmp6 = icmp sgt i32 %n, 0629 br i1 %cmp6, label %for.body, label %for.end630 631for.body: ; preds = %entry, %for.body632 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]633 %arrayidx = getelementptr inbounds double, ptr %y, i64 %indvars.iv634 %0 = load double, ptr %arrayidx, align 8635 %arrayidx1 = getelementptr inbounds double, ptr %z, i64 %indvars.iv636 %1 = load double, ptr %arrayidx1, align 8637 %call = tail call double @llvm.copysign(double %0, double %1)638 %arrayidx2 = getelementptr inbounds double, ptr %x, i64 %indvars.iv639 store double %call, ptr %arrayidx2, align 8640 %indvars.iv.next = add i64 %indvars.iv, 1641 %lftr.wideiv = trunc i64 %indvars.iv.next to i32642 %exitcond = icmp eq i32 %lftr.wideiv, %n643 br i1 %exitcond, label %for.end, label %for.body644 645for.end: ; preds = %for.body, %entry646 ret void647}648 649declare double @llvm.copysign(double, double)650 651define void @floor_f32(i32 %n, ptr %y, ptr %x) {652; CHECK-LABEL: @floor_f32(653; CHECK: llvm.floor.v4f32654; CHECK: ret void655;656entry:657 %cmp6 = icmp sgt i32 %n, 0658 br i1 %cmp6, label %for.body, label %for.end659 660for.body: ; preds = %entry, %for.body661 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]662 %arrayidx = getelementptr inbounds float, ptr %y, i64 %indvars.iv663 %0 = load float, ptr %arrayidx, align 4664 %call = tail call float @llvm.floor.f32(float %0)665 %arrayidx2 = getelementptr inbounds float, ptr %x, i64 %indvars.iv666 store float %call, ptr %arrayidx2, align 4667 %indvars.iv.next = add i64 %indvars.iv, 1668 %lftr.wideiv = trunc i64 %indvars.iv.next to i32669 %exitcond = icmp eq i32 %lftr.wideiv, %n670 br i1 %exitcond, label %for.end, label %for.body671 672for.end: ; preds = %for.body, %entry673 ret void674}675 676declare float @llvm.floor.f32(float)677 678define void @floor_f64(i32 %n, ptr %y, ptr %x) {679; CHECK-LABEL: @floor_f64(680; CHECK: llvm.floor.v4f64681; CHECK: ret void682;683entry:684 %cmp6 = icmp sgt i32 %n, 0685 br i1 %cmp6, label %for.body, label %for.end686 687for.body: ; preds = %entry, %for.body688 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]689 %arrayidx = getelementptr inbounds double, ptr %y, i64 %indvars.iv690 %0 = load double, ptr %arrayidx, align 8691 %call = tail call double @llvm.floor.f64(double %0)692 %arrayidx2 = getelementptr inbounds double, ptr %x, i64 %indvars.iv693 store double %call, ptr %arrayidx2, align 8694 %indvars.iv.next = add i64 %indvars.iv, 1695 %lftr.wideiv = trunc i64 %indvars.iv.next to i32696 %exitcond = icmp eq i32 %lftr.wideiv, %n697 br i1 %exitcond, label %for.end, label %for.body698 699for.end: ; preds = %for.body, %entry700 ret void701}702 703declare double @llvm.floor.f64(double)704 705define void @ceil_f32(i32 %n, ptr %y, ptr %x) {706; CHECK-LABEL: @ceil_f32(707; CHECK: llvm.ceil.v4f32708; CHECK: ret void709;710entry:711 %cmp6 = icmp sgt i32 %n, 0712 br i1 %cmp6, label %for.body, label %for.end713 714for.body: ; preds = %entry, %for.body715 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]716 %arrayidx = getelementptr inbounds float, ptr %y, i64 %indvars.iv717 %0 = load float, ptr %arrayidx, align 4718 %call = tail call float @llvm.ceil.f32(float %0)719 %arrayidx2 = getelementptr inbounds float, ptr %x, i64 %indvars.iv720 store float %call, ptr %arrayidx2, align 4721 %indvars.iv.next = add i64 %indvars.iv, 1722 %lftr.wideiv = trunc i64 %indvars.iv.next to i32723 %exitcond = icmp eq i32 %lftr.wideiv, %n724 br i1 %exitcond, label %for.end, label %for.body725 726for.end: ; preds = %for.body, %entry727 ret void728}729 730declare float @llvm.ceil.f32(float)731 732define void @ceil_f64(i32 %n, ptr %y, ptr %x) {733; CHECK-LABEL: @ceil_f64(734; CHECK: llvm.ceil.v4f64735; CHECK: ret void736;737entry:738 %cmp6 = icmp sgt i32 %n, 0739 br i1 %cmp6, label %for.body, label %for.end740 741for.body: ; preds = %entry, %for.body742 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]743 %arrayidx = getelementptr inbounds double, ptr %y, i64 %indvars.iv744 %0 = load double, ptr %arrayidx, align 8745 %call = tail call double @llvm.ceil.f64(double %0)746 %arrayidx2 = getelementptr inbounds double, ptr %x, i64 %indvars.iv747 store double %call, ptr %arrayidx2, align 8748 %indvars.iv.next = add i64 %indvars.iv, 1749 %lftr.wideiv = trunc i64 %indvars.iv.next to i32750 %exitcond = icmp eq i32 %lftr.wideiv, %n751 br i1 %exitcond, label %for.end, label %for.body752 753for.end: ; preds = %for.body, %entry754 ret void755}756 757declare double @llvm.ceil.f64(double)758 759define void @trunc_f32(i32 %n, ptr %y, ptr %x) {760; CHECK-LABEL: @trunc_f32(761; CHECK: llvm.trunc.v4f32762; CHECK: ret void763;764entry:765 %cmp6 = icmp sgt i32 %n, 0766 br i1 %cmp6, label %for.body, label %for.end767 768for.body: ; preds = %entry, %for.body769 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]770 %arrayidx = getelementptr inbounds float, ptr %y, i64 %indvars.iv771 %0 = load float, ptr %arrayidx, align 4772 %call = tail call float @llvm.trunc.f32(float %0)773 %arrayidx2 = getelementptr inbounds float, ptr %x, i64 %indvars.iv774 store float %call, ptr %arrayidx2, align 4775 %indvars.iv.next = add i64 %indvars.iv, 1776 %lftr.wideiv = trunc i64 %indvars.iv.next to i32777 %exitcond = icmp eq i32 %lftr.wideiv, %n778 br i1 %exitcond, label %for.end, label %for.body779 780for.end: ; preds = %for.body, %entry781 ret void782}783 784declare float @llvm.trunc.f32(float)785 786define void @trunc_f64(i32 %n, ptr %y, ptr %x) {787; CHECK-LABEL: @trunc_f64(788; CHECK: llvm.trunc.v4f64789; CHECK: ret void790;791entry:792 %cmp6 = icmp sgt i32 %n, 0793 br i1 %cmp6, label %for.body, label %for.end794 795for.body: ; preds = %entry, %for.body796 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]797 %arrayidx = getelementptr inbounds double, ptr %y, i64 %indvars.iv798 %0 = load double, ptr %arrayidx, align 8799 %call = tail call double @llvm.trunc.f64(double %0)800 %arrayidx2 = getelementptr inbounds double, ptr %x, i64 %indvars.iv801 store double %call, ptr %arrayidx2, align 8802 %indvars.iv.next = add i64 %indvars.iv, 1803 %lftr.wideiv = trunc i64 %indvars.iv.next to i32804 %exitcond = icmp eq i32 %lftr.wideiv, %n805 br i1 %exitcond, label %for.end, label %for.body806 807for.end: ; preds = %for.body, %entry808 ret void809}810 811declare double @llvm.trunc.f64(double)812 813define void @rint_f32(i32 %n, ptr %y, ptr %x) {814; CHECK-LABEL: @rint_f32(815; CHECK: llvm.rint.v4f32816; CHECK: ret void817;818entry:819 %cmp6 = icmp sgt i32 %n, 0820 br i1 %cmp6, label %for.body, label %for.end821 822for.body: ; preds = %entry, %for.body823 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]824 %arrayidx = getelementptr inbounds float, ptr %y, i64 %indvars.iv825 %0 = load float, ptr %arrayidx, align 4826 %call = tail call float @llvm.rint.f32(float %0)827 %arrayidx2 = getelementptr inbounds float, ptr %x, i64 %indvars.iv828 store float %call, ptr %arrayidx2, align 4829 %indvars.iv.next = add i64 %indvars.iv, 1830 %lftr.wideiv = trunc i64 %indvars.iv.next to i32831 %exitcond = icmp eq i32 %lftr.wideiv, %n832 br i1 %exitcond, label %for.end, label %for.body833 834for.end: ; preds = %for.body, %entry835 ret void836}837 838declare float @llvm.rint.f32(float)839 840define void @rint_f64(i32 %n, ptr %y, ptr %x) {841; CHECK-LABEL: @rint_f64(842; CHECK: llvm.rint.v4f64843; CHECK: ret void844;845entry:846 %cmp6 = icmp sgt i32 %n, 0847 br i1 %cmp6, label %for.body, label %for.end848 849for.body: ; preds = %entry, %for.body850 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]851 %arrayidx = getelementptr inbounds double, ptr %y, i64 %indvars.iv852 %0 = load double, ptr %arrayidx, align 8853 %call = tail call double @llvm.rint.f64(double %0)854 %arrayidx2 = getelementptr inbounds double, ptr %x, i64 %indvars.iv855 store double %call, ptr %arrayidx2, align 8856 %indvars.iv.next = add i64 %indvars.iv, 1857 %lftr.wideiv = trunc i64 %indvars.iv.next to i32858 %exitcond = icmp eq i32 %lftr.wideiv, %n859 br i1 %exitcond, label %for.end, label %for.body860 861for.end: ; preds = %for.body, %entry862 ret void863}864 865declare double @llvm.rint.f64(double)866 867define void @nearbyint_f32(i32 %n, ptr %y, ptr %x) {868; CHECK-LABEL: @nearbyint_f32(869; CHECK: llvm.nearbyint.v4f32870; CHECK: ret void871;872entry:873 %cmp6 = icmp sgt i32 %n, 0874 br i1 %cmp6, label %for.body, label %for.end875 876for.body: ; preds = %entry, %for.body877 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]878 %arrayidx = getelementptr inbounds float, ptr %y, i64 %indvars.iv879 %0 = load float, ptr %arrayidx, align 4880 %call = tail call float @llvm.nearbyint.f32(float %0)881 %arrayidx2 = getelementptr inbounds float, ptr %x, i64 %indvars.iv882 store float %call, ptr %arrayidx2, align 4883 %indvars.iv.next = add i64 %indvars.iv, 1884 %lftr.wideiv = trunc i64 %indvars.iv.next to i32885 %exitcond = icmp eq i32 %lftr.wideiv, %n886 br i1 %exitcond, label %for.end, label %for.body887 888for.end: ; preds = %for.body, %entry889 ret void890}891 892declare float @llvm.nearbyint.f32(float)893 894define void @nearbyint_f64(i32 %n, ptr %y, ptr %x) {895; CHECK-LABEL: @nearbyint_f64(896; CHECK: llvm.nearbyint.v4f64897; CHECK: ret void898;899entry:900 %cmp6 = icmp sgt i32 %n, 0901 br i1 %cmp6, label %for.body, label %for.end902 903for.body: ; preds = %entry, %for.body904 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]905 %arrayidx = getelementptr inbounds double, ptr %y, i64 %indvars.iv906 %0 = load double, ptr %arrayidx, align 8907 %call = tail call double @llvm.nearbyint.f64(double %0)908 %arrayidx2 = getelementptr inbounds double, ptr %x, i64 %indvars.iv909 store double %call, ptr %arrayidx2, align 8910 %indvars.iv.next = add i64 %indvars.iv, 1911 %lftr.wideiv = trunc i64 %indvars.iv.next to i32912 %exitcond = icmp eq i32 %lftr.wideiv, %n913 br i1 %exitcond, label %for.end, label %for.body914 915for.end: ; preds = %for.body, %entry916 ret void917}918 919declare double @llvm.nearbyint.f64(double)920 921define void @round_f32(i32 %n, ptr %y, ptr %x) {922; CHECK-LABEL: @round_f32(923; CHECK: llvm.round.v4f32924; CHECK: ret void925;926entry:927 %cmp6 = icmp sgt i32 %n, 0928 br i1 %cmp6, label %for.body, label %for.end929 930for.body: ; preds = %entry, %for.body931 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]932 %arrayidx = getelementptr inbounds float, ptr %y, i64 %indvars.iv933 %0 = load float, ptr %arrayidx, align 4934 %call = tail call float @llvm.round.f32(float %0)935 %arrayidx2 = getelementptr inbounds float, ptr %x, i64 %indvars.iv936 store float %call, ptr %arrayidx2, align 4937 %indvars.iv.next = add i64 %indvars.iv, 1938 %lftr.wideiv = trunc i64 %indvars.iv.next to i32939 %exitcond = icmp eq i32 %lftr.wideiv, %n940 br i1 %exitcond, label %for.end, label %for.body941 942for.end: ; preds = %for.body, %entry943 ret void944}945 946declare float @llvm.round.f32(float)947 948define void @round_f64(i32 %n, ptr %y, ptr %x) {949; CHECK-LABEL: @round_f64(950; CHECK: llvm.round.v4f64951; CHECK: ret void952;953entry:954 %cmp6 = icmp sgt i32 %n, 0955 br i1 %cmp6, label %for.body, label %for.end956 957for.body: ; preds = %entry, %for.body958 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]959 %arrayidx = getelementptr inbounds double, ptr %y, i64 %indvars.iv960 %0 = load double, ptr %arrayidx, align 8961 %call = tail call double @llvm.round.f64(double %0)962 %arrayidx2 = getelementptr inbounds double, ptr %x, i64 %indvars.iv963 store double %call, ptr %arrayidx2, align 8964 %indvars.iv.next = add i64 %indvars.iv, 1965 %lftr.wideiv = trunc i64 %indvars.iv.next to i32966 %exitcond = icmp eq i32 %lftr.wideiv, %n967 br i1 %exitcond, label %for.end, label %for.body968 969for.end: ; preds = %for.body, %entry970 ret void971}972 973declare double @llvm.round.f64(double)974 975define void @roundeven_f32(i32 %n, ptr %y, ptr %x) {976; CHECK-LABEL: @roundeven_f32(977; CHECK: llvm.roundeven.v4f32978; CHECK: ret void979;980entry:981 %cmp6 = icmp sgt i32 %n, 0982 br i1 %cmp6, label %for.body, label %for.end983 984for.body: ; preds = %entry, %for.body985 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]986 %arrayidx = getelementptr inbounds float, ptr %y, i64 %indvars.iv987 %0 = load float, ptr %arrayidx, align 4988 %call = tail call float @llvm.roundeven.f32(float %0)989 %arrayidx2 = getelementptr inbounds float, ptr %x, i64 %indvars.iv990 store float %call, ptr %arrayidx2, align 4991 %indvars.iv.next = add i64 %indvars.iv, 1992 %lftr.wideiv = trunc i64 %indvars.iv.next to i32993 %exitcond = icmp eq i32 %lftr.wideiv, %n994 br i1 %exitcond, label %for.end, label %for.body995 996for.end: ; preds = %for.body, %entry997 ret void998}999 1000declare float @llvm.roundeven.f32(float)1001 1002define void @roundeven_f64(i32 %n, ptr %y, ptr %x) {1003; CHECK-LABEL: @roundeven_f64(1004; CHECK: llvm.roundeven.v4f641005; CHECK: ret void1006;1007entry:1008 %cmp6 = icmp sgt i32 %n, 01009 br i1 %cmp6, label %for.body, label %for.end1010 1011for.body: ; preds = %entry, %for.body1012 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]1013 %arrayidx = getelementptr inbounds double, ptr %y, i64 %indvars.iv1014 %0 = load double, ptr %arrayidx, align 81015 %call = tail call double @llvm.roundeven.f64(double %0)1016 %arrayidx2 = getelementptr inbounds double, ptr %x, i64 %indvars.iv1017 store double %call, ptr %arrayidx2, align 81018 %indvars.iv.next = add i64 %indvars.iv, 11019 %lftr.wideiv = trunc i64 %indvars.iv.next to i321020 %exitcond = icmp eq i32 %lftr.wideiv, %n1021 br i1 %exitcond, label %for.end, label %for.body1022 1023for.end: ; preds = %for.body, %entry1024 ret void1025}1026 1027declare double @llvm.roundeven.f64(double)1028 1029 1030define void @lround_i32f32(i32 %n, ptr %y, ptr %x) {1031; CHECK-LABEL: @lround_i32f32(1032; CHECK: llvm.lround.v4i32.v4f321033; CHECK: ret void1034;1035entry:1036 br label %for.body1037 1038for.body: ; preds = %entry, %for.body1039 %iv = phi i32 [ 0, %entry ], [ %iv.next, %for.body ]1040 %arrayidx = getelementptr inbounds float, ptr %y, i32 %iv1041 %0 = load float, ptr %arrayidx, align 41042 %call = tail call i32 @llvm.lround.i32.f32(float %0)1043 %arrayidx2 = getelementptr inbounds i32, ptr %x, i32 %iv1044 store i32 %call, ptr %arrayidx2, align 41045 %iv.next = add i32 %iv, 11046 %exitcond = icmp eq i32 %iv.next, %n1047 br i1 %exitcond, label %for.end, label %for.body1048 1049for.end: ; preds = %for.body, %entry1050 ret void1051}1052 1053declare i32 @llvm.lround.i32.f32(float)1054 1055define void @lround_i32f64(i32 %n, ptr %y, ptr %x) {1056; CHECK-LABEL: @lround_i32f64(1057; CHECK: llvm.lround.v4i32.v4f641058; CHECK: ret void1059;1060entry:1061 br label %for.body1062 1063for.body: ; preds = %entry, %for.body1064 %iv = phi i32 [ 0, %entry ], [ %iv.next, %for.body ]1065 %arrayidx = getelementptr inbounds double, ptr %y, i32 %iv1066 %0 = load double, ptr %arrayidx, align 81067 %call = tail call i32 @llvm.lround.i32.f64(double %0)1068 %arrayidx2 = getelementptr inbounds i32, ptr %x, i32 %iv1069 store i32 %call, ptr %arrayidx2, align 81070 %iv.next = add i32 %iv, 11071 %exitcond = icmp eq i32 %iv.next, %n1072 br i1 %exitcond, label %for.end, label %for.body1073 1074for.end: ; preds = %for.body, %entry1075 ret void1076}1077 1078declare i32 @llvm.lround.i32.f64(double)1079 1080define void @lround_i64f32(i32 %n, ptr %y, ptr %x) {1081; CHECK-LABEL: @lround_i64f32(1082; CHECK: llvm.lround.v4i64.v4f321083; CHECK: ret void1084;1085entry:1086 br label %for.body1087 1088for.body: ; preds = %entry, %for.body1089 %iv = phi i32 [ 0, %entry ], [ %iv.next, %for.body ]1090 %arrayidx = getelementptr inbounds float, ptr %y, i32 %iv1091 %0 = load float, ptr %arrayidx, align 41092 %call = tail call i64 @llvm.lround.i64.f32(float %0)1093 %arrayidx2 = getelementptr inbounds i64, ptr %x, i32 %iv1094 store i64 %call, ptr %arrayidx2, align 41095 %iv.next = add i32 %iv, 11096 %exitcond = icmp eq i32 %iv.next, %n1097 br i1 %exitcond, label %for.end, label %for.body1098 1099for.end: ; preds = %for.body, %entry1100 ret void1101}1102 1103declare i64 @llvm.lround.i64.f32(float)1104 1105define void @lround_i64f64(i32 %n, ptr %y, ptr %x) {1106; CHECK-LABEL: @lround_i64f64(1107; CHECK: llvm.lround.v4i64.v4f641108; CHECK: ret void1109;1110entry:1111 br label %for.body1112 1113for.body: ; preds = %entry, %for.body1114 %iv = phi i32 [ 0, %entry ], [ %iv.next, %for.body ]1115 %arrayidx = getelementptr inbounds double, ptr %y, i32 %iv1116 %0 = load double, ptr %arrayidx, align 81117 %call = tail call i64 @llvm.lround.i64.f64(double %0)1118 %arrayidx2 = getelementptr inbounds i64, ptr %x, i32 %iv1119 store i64 %call, ptr %arrayidx2, align 81120 %iv.next = add i32 %iv, 11121 %exitcond = icmp eq i32 %iv.next, %n1122 br i1 %exitcond, label %for.end, label %for.body1123 1124for.end: ; preds = %for.body, %entry1125 ret void1126}1127 1128declare i64 @llvm.lround.i64.f64(double)1129 1130define void @llround_i64f32(i32 %n, ptr %y, ptr %x) {1131; CHECK-LABEL: @llround_i64f32(1132; CHECK: llvm.llround.v4i64.v4f321133; CHECK: ret void1134;1135entry:1136 br label %for.body1137 1138for.body: ; preds = %entry, %for.body1139 %iv = phi i32 [ 0, %entry ], [ %iv.next, %for.body ]1140 %arrayidx = getelementptr inbounds float, ptr %y, i32 %iv1141 %0 = load float, ptr %arrayidx, align 41142 %call = tail call i64 @llvm.llround.i64.f32(float %0)1143 %arrayidx2 = getelementptr inbounds i64, ptr %x, i32 %iv1144 store i64 %call, ptr %arrayidx2, align 41145 %iv.next = add i32 %iv, 11146 %exitcond = icmp eq i32 %iv.next, %n1147 br i1 %exitcond, label %for.end, label %for.body1148 1149for.end: ; preds = %for.body, %entry1150 ret void1151}1152 1153declare i64 @llvm.llround.i64.f32(float)1154 1155define void @llround_i64f64(i32 %n, ptr %y, ptr %x) {1156; CHECK-LABEL: @llround_i64f64(1157; CHECK: llvm.llround.v4i64.v4f641158; CHECK: ret void1159;1160entry:1161 br label %for.body1162 1163for.body: ; preds = %entry, %for.body1164 %iv = phi i32 [ 0, %entry ], [ %iv.next, %for.body ]1165 %arrayidx = getelementptr inbounds double, ptr %y, i32 %iv1166 %0 = load double, ptr %arrayidx, align 81167 %call = tail call i64 @llvm.llround.i64.f64(double %0)1168 %arrayidx2 = getelementptr inbounds i64, ptr %x, i32 %iv1169 store i64 %call, ptr %arrayidx2, align 81170 %iv.next = add i32 %iv, 11171 %exitcond = icmp eq i32 %iv.next, %n1172 br i1 %exitcond, label %for.end, label %for.body1173 1174for.end: ; preds = %for.body, %entry1175 ret void1176}1177 1178declare i64 @llvm.llround.i64.f64(double)1179 1180define void @fma_f32(i32 %n, ptr %y, ptr %x, ptr %z, ptr %w) {1181; CHECK-LABEL: @fma_f32(1182; CHECK: llvm.fma.v4f321183; CHECK: ret void1184;1185entry:1186 %cmp12 = icmp sgt i32 %n, 01187 br i1 %cmp12, label %for.body, label %for.end1188 1189for.body: ; preds = %entry, %for.body1190 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]1191 %arrayidx = getelementptr inbounds float, ptr %y, i64 %indvars.iv1192 %0 = load float, ptr %arrayidx, align 41193 %arrayidx2 = getelementptr inbounds float, ptr %w, i64 %indvars.iv1194 %1 = load float, ptr %arrayidx2, align 41195 %arrayidx4 = getelementptr inbounds float, ptr %z, i64 %indvars.iv1196 %2 = load float, ptr %arrayidx4, align 41197 %3 = tail call float @llvm.fma.f32(float %0, float %2, float %1)1198 %arrayidx6 = getelementptr inbounds float, ptr %x, i64 %indvars.iv1199 store float %3, ptr %arrayidx6, align 41200 %indvars.iv.next = add i64 %indvars.iv, 11201 %lftr.wideiv = trunc i64 %indvars.iv.next to i321202 %exitcond = icmp eq i32 %lftr.wideiv, %n1203 br i1 %exitcond, label %for.end, label %for.body1204 1205for.end: ; preds = %for.body, %entry1206 ret void1207}1208 1209declare float @llvm.fma.f32(float, float, float)1210 1211define void @fma_f64(i32 %n, ptr %y, ptr %x, ptr %z, ptr %w) {1212; CHECK-LABEL: @fma_f64(1213; CHECK: llvm.fma.v4f641214; CHECK: ret void1215;1216entry:1217 %cmp12 = icmp sgt i32 %n, 01218 br i1 %cmp12, label %for.body, label %for.end1219 1220for.body: ; preds = %entry, %for.body1221 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]1222 %arrayidx = getelementptr inbounds double, ptr %y, i64 %indvars.iv1223 %0 = load double, ptr %arrayidx, align 81224 %arrayidx2 = getelementptr inbounds double, ptr %w, i64 %indvars.iv1225 %1 = load double, ptr %arrayidx2, align 81226 %arrayidx4 = getelementptr inbounds double, ptr %z, i64 %indvars.iv1227 %2 = load double, ptr %arrayidx4, align 81228 %3 = tail call double @llvm.fma.f64(double %0, double %2, double %1)1229 %arrayidx6 = getelementptr inbounds double, ptr %x, i64 %indvars.iv1230 store double %3, ptr %arrayidx6, align 81231 %indvars.iv.next = add i64 %indvars.iv, 11232 %lftr.wideiv = trunc i64 %indvars.iv.next to i321233 %exitcond = icmp eq i32 %lftr.wideiv, %n1234 br i1 %exitcond, label %for.end, label %for.body1235 1236for.end: ; preds = %for.body, %entry1237 ret void1238}1239 1240declare double @llvm.fma.f64(double, double, double)1241 1242define void @fmuladd_f32(i32 %n, ptr %y, ptr %x, ptr %z, ptr %w) {1243; CHECK-LABEL: @fmuladd_f32(1244; CHECK: llvm.fmuladd.v4f321245; CHECK: ret void1246;1247entry:1248 %cmp12 = icmp sgt i32 %n, 01249 br i1 %cmp12, label %for.body, label %for.end1250 1251for.body: ; preds = %entry, %for.body1252 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]1253 %arrayidx = getelementptr inbounds float, ptr %y, i64 %indvars.iv1254 %0 = load float, ptr %arrayidx, align 41255 %arrayidx2 = getelementptr inbounds float, ptr %w, i64 %indvars.iv1256 %1 = load float, ptr %arrayidx2, align 41257 %arrayidx4 = getelementptr inbounds float, ptr %z, i64 %indvars.iv1258 %2 = load float, ptr %arrayidx4, align 41259 %3 = tail call float @llvm.fmuladd.f32(float %0, float %2, float %1)1260 %arrayidx6 = getelementptr inbounds float, ptr %x, i64 %indvars.iv1261 store float %3, ptr %arrayidx6, align 41262 %indvars.iv.next = add i64 %indvars.iv, 11263 %lftr.wideiv = trunc i64 %indvars.iv.next to i321264 %exitcond = icmp eq i32 %lftr.wideiv, %n1265 br i1 %exitcond, label %for.end, label %for.body1266 1267for.end: ; preds = %for.body, %entry1268 ret void1269}1270 1271declare float @llvm.fmuladd.f32(float, float, float)1272 1273define void @fmuladd_f64(i32 %n, ptr %y, ptr %x, ptr %z, ptr %w) {1274; CHECK-LABEL: @fmuladd_f64(1275; CHECK: llvm.fmuladd.v4f641276; CHECK: ret void1277;1278entry:1279 %cmp12 = icmp sgt i32 %n, 01280 br i1 %cmp12, label %for.body, label %for.end1281 1282for.body: ; preds = %entry, %for.body1283 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]1284 %arrayidx = getelementptr inbounds double, ptr %y, i64 %indvars.iv1285 %0 = load double, ptr %arrayidx, align 81286 %arrayidx2 = getelementptr inbounds double, ptr %w, i64 %indvars.iv1287 %1 = load double, ptr %arrayidx2, align 81288 %arrayidx4 = getelementptr inbounds double, ptr %z, i64 %indvars.iv1289 %2 = load double, ptr %arrayidx4, align 81290 %3 = tail call double @llvm.fmuladd.f64(double %0, double %2, double %1)1291 %arrayidx6 = getelementptr inbounds double, ptr %x, i64 %indvars.iv1292 store double %3, ptr %arrayidx6, align 81293 %indvars.iv.next = add i64 %indvars.iv, 11294 %lftr.wideiv = trunc i64 %indvars.iv.next to i321295 %exitcond = icmp eq i32 %lftr.wideiv, %n1296 br i1 %exitcond, label %for.end, label %for.body1297 1298for.end: ; preds = %for.body, %entry1299 ret void1300}1301 1302declare double @llvm.fmuladd.f64(double, double, double)1303 1304define void @pow_f32(i32 %n, ptr %y, ptr %x, ptr %z) {1305; CHECK-LABEL: @pow_f32(1306; CHECK: llvm.pow.v4f321307; CHECK: ret void1308;1309entry:1310 %cmp9 = icmp sgt i32 %n, 01311 br i1 %cmp9, label %for.body, label %for.end1312 1313for.body: ; preds = %entry, %for.body1314 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]1315 %arrayidx = getelementptr inbounds float, ptr %y, i64 %indvars.iv1316 %0 = load float, ptr %arrayidx, align 41317 %arrayidx2 = getelementptr inbounds float, ptr %z, i64 %indvars.iv1318 %1 = load float, ptr %arrayidx2, align 41319 %call = tail call float @llvm.pow.f32(float %0, float %1)1320 %arrayidx4 = getelementptr inbounds float, ptr %x, i64 %indvars.iv1321 store float %call, ptr %arrayidx4, align 41322 %indvars.iv.next = add i64 %indvars.iv, 11323 %lftr.wideiv = trunc i64 %indvars.iv.next to i321324 %exitcond = icmp eq i32 %lftr.wideiv, %n1325 br i1 %exitcond, label %for.end, label %for.body1326 1327for.end: ; preds = %for.body, %entry1328 ret void1329}1330 1331declare float @llvm.pow.f32(float, float)1332 1333define void @pow_f64(i32 %n, ptr %y, ptr %x, ptr %z) {1334; CHECK-LABEL: @pow_f64(1335; CHECK: llvm.pow.v4f641336; CHECK: ret void1337;1338entry:1339 %cmp9 = icmp sgt i32 %n, 01340 br i1 %cmp9, label %for.body, label %for.end1341 1342for.body: ; preds = %entry, %for.body1343 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]1344 %arrayidx = getelementptr inbounds double, ptr %y, i64 %indvars.iv1345 %0 = load double, ptr %arrayidx, align 81346 %arrayidx2 = getelementptr inbounds double, ptr %z, i64 %indvars.iv1347 %1 = load double, ptr %arrayidx2, align 81348 %call = tail call double @llvm.pow.f64(double %0, double %1)1349 %arrayidx4 = getelementptr inbounds double, ptr %x, i64 %indvars.iv1350 store double %call, ptr %arrayidx4, align 81351 %indvars.iv.next = add i64 %indvars.iv, 11352 %lftr.wideiv = trunc i64 %indvars.iv.next to i321353 %exitcond = icmp eq i32 %lftr.wideiv, %n1354 br i1 %exitcond, label %for.end, label %for.body1355 1356for.end: ; preds = %for.body, %entry1357 ret void1358}1359 1360define void @fabs_libm(ptr %x) {1361; CHECK: fabs_libm1362; CHECK: call <4 x float> @llvm.fabs.v4f321363; CHECK: ret void1364;1365entry:1366 br label %for.body1367 1368for.body: ; preds = %entry, %for.body1369 %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.body ]1370 %arrayidx = getelementptr inbounds float, ptr %x, i64 %indvars.iv1371 %0 = load float, ptr %arrayidx, align 41372 %call = tail call float @fabsf(float %0) nounwind readnone1373 store float %call, ptr %arrayidx, align 41374 %indvars.iv.next = add i64 %indvars.iv, 11375 %lftr.wideiv = trunc i64 %indvars.iv.next to i321376 %exitcond = icmp eq i32 %lftr.wideiv, 10241377 br i1 %exitcond, label %for.end, label %for.body1378 1379for.end: ; preds = %for.body1380 ret void1381}1382 1383declare float @fabsf(float) nounwind readnone1384 1385declare double @llvm.pow.f64(double, double)1386 1387; Make sure we don't replace calls to functions with standard library function1388; signatures but defined with internal linkage.1389 1390define internal float @roundf(float %x) {1391 ret float 0.000000001392}1393define void @internal_round(ptr %x) {1394; CHECK-LABEL: internal_round1395; CHECK-NOT: load <4 x float>1396; CHECK: ret void1397;1398entry:1399 br label %for.body1400 1401for.body: ; preds = %entry, %for.body1402 %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.body ]1403 %arrayidx = getelementptr inbounds float, ptr %x, i64 %indvars.iv1404 %0 = load float, ptr %arrayidx, align 41405 %call = tail call float @roundf(float %0)1406 store float %call, ptr %arrayidx, align 41407 %indvars.iv.next = add i64 %indvars.iv, 11408 %lftr.wideiv = trunc i64 %indvars.iv.next to i321409 %exitcond = icmp eq i32 %lftr.wideiv, 10241410 br i1 %exitcond, label %for.end, label %for.body1411 1412for.end: ; preds = %for.body1413 ret void1414}1415 1416; Make sure we don't replace calls to functions with standard library names but1417; different signatures.1418 1419declare void @round(double %f)1420 1421define void @wrong_signature(ptr %x) {1422; CHECK-LABEL: wrong_signature1423; CHECK-NOT: load <4 x double>1424; CHECK: ret void1425;1426entry:1427 br label %for.body1428 1429for.body: ; preds = %entry, %for.body1430 %indvars.iv = phi i64 [ 0, %entry ], [ %indvars.iv.next, %for.body ]1431 %arrayidx = getelementptr inbounds double, ptr %x, i64 %indvars.iv1432 %0 = load double, ptr %arrayidx, align 41433 store double %0, ptr %arrayidx, align 41434 tail call void @round(double %0)1435 %indvars.iv.next = add i64 %indvars.iv, 11436 %lftr.wideiv = trunc i64 %indvars.iv.next to i321437 %exitcond = icmp eq i32 %lftr.wideiv, 10241438 br i1 %exitcond, label %for.end, label %for.body1439 1440for.end: ; preds = %for.body1441 ret void1442}1443 1444declare double @llvm.powi.f64.i32(double %Val, i32 %power)1445 1446define void @powi_f64(i32 %n, ptr %y, ptr %x, i32 %P) {1447; CHECK-LABEL: @powi_f64(1448; CHECK: llvm.powi.v4f641449; CHECK: ret void1450;1451entry:1452 %cmp9 = icmp sgt i32 %n, 01453 br i1 %cmp9, label %for.body, label %for.end1454 1455for.body: ; preds = %entry, %for.body1456 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]1457 %arrayidx = getelementptr inbounds double, ptr %y, i64 %indvars.iv1458 %0 = load double, ptr %arrayidx, align 81459 %call = tail call double @llvm.powi.f64.i32(double %0, i32 %P)1460 %arrayidx4 = getelementptr inbounds double, ptr %x, i64 %indvars.iv1461 store double %call, ptr %arrayidx4, align 81462 %indvars.iv.next = add i64 %indvars.iv, 11463 %lftr.wideiv = trunc i64 %indvars.iv.next to i321464 %exitcond = icmp eq i32 %lftr.wideiv, %n1465 br i1 %exitcond, label %for.end, label %for.body1466 1467for.end: ; preds = %for.body, %entry1468 ret void1469}1470 1471define void @powi_f64_neg(i32 %n, ptr %y, ptr %x) {1472; CHECK-LABEL: @powi_f64_neg(1473; CHECK-NOT: llvm.powi.v4f641474; CHECK: ret void1475;1476entry:1477 %cmp9 = icmp sgt i32 %n, 01478 br i1 %cmp9, label %for.body, label %for.end1479 1480for.body: ; preds = %entry, %for.body1481 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]1482 %arrayidx = getelementptr inbounds double, ptr %y, i64 %indvars.iv1483 %0 = load double, ptr %arrayidx, align 81484 %1 = trunc i64 %indvars.iv to i321485 %call = tail call double @llvm.powi.f64.i32(double %0, i32 %1)1486 %arrayidx4 = getelementptr inbounds double, ptr %x, i64 %indvars.iv1487 store double %call, ptr %arrayidx4, align 81488 %indvars.iv.next = add i64 %indvars.iv, 11489 %lftr.wideiv = trunc i64 %indvars.iv.next to i321490 %exitcond = icmp eq i32 %lftr.wideiv, %n1491 br i1 %exitcond, label %for.end, label %for.body1492 1493for.end: ; preds = %for.body, %entry1494 ret void1495}1496 1497declare i64 @llvm.cttz.i64 (i64, i1)1498 1499define void @cttz_f64(i32 %n, ptr %y, ptr %x) {1500; CHECK-LABEL: @cttz_f64(1501; CHECK: llvm.cttz.v4i641502; CHECK: ret void1503;1504entry:1505 %cmp9 = icmp sgt i32 %n, 01506 br i1 %cmp9, label %for.body, label %for.end1507 1508for.body: ; preds = %entry, %for.body1509 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]1510 %arrayidx = getelementptr inbounds i64, ptr %y, i64 %indvars.iv1511 %0 = load i64, ptr %arrayidx, align 81512 %call = tail call i64 @llvm.cttz.i64(i64 %0, i1 true)1513 %arrayidx4 = getelementptr inbounds i64, ptr %x, i64 %indvars.iv1514 store i64 %call, ptr %arrayidx4, align 81515 %indvars.iv.next = add i64 %indvars.iv, 11516 %lftr.wideiv = trunc i64 %indvars.iv.next to i321517 %exitcond = icmp eq i32 %lftr.wideiv, %n1518 br i1 %exitcond, label %for.end, label %for.body1519 1520for.end: ; preds = %for.body, %entry1521 ret void1522}1523 1524declare i64 @llvm.ctlz.i64 (i64, i1)1525 1526define void @ctlz_f64(i32 %n, ptr %y, ptr %x) {1527; CHECK-LABEL: @ctlz_f64(1528; CHECK: llvm.ctlz.v4i641529; CHECK: ret void1530;1531entry:1532 %cmp9 = icmp sgt i32 %n, 01533 br i1 %cmp9, label %for.body, label %for.end1534 1535for.body: ; preds = %entry, %for.body1536 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]1537 %arrayidx = getelementptr inbounds i64, ptr %y, i64 %indvars.iv1538 %0 = load i64, ptr %arrayidx, align 81539 %call = tail call i64 @llvm.ctlz.i64(i64 %0, i1 true)1540 %arrayidx4 = getelementptr inbounds i64, ptr %x, i64 %indvars.iv1541 store i64 %call, ptr %arrayidx4, align 81542 %indvars.iv.next = add i64 %indvars.iv, 11543 %lftr.wideiv = trunc i64 %indvars.iv.next to i321544 %exitcond = icmp eq i32 %lftr.wideiv, %n1545 br i1 %exitcond, label %for.end, label %for.body1546 1547for.end: ; preds = %for.body, %entry1548 ret void1549}1550 1551declare i64 @llvm.abs.i64 (i64, i1)1552 1553define void @abs_i64(i32 %n, ptr %y, ptr %x) {1554; CHECK-LABEL: @abs_i64(1555; CHECK: llvm.abs.v4i64(<4 x i64> [[WIDE_LOADX:%.*]], i1 true)1556; CHECK: ret void1557;1558entry:1559 %cmp9 = icmp sgt i32 %n, 01560 br i1 %cmp9, label %for.body, label %for.end1561 1562for.body: ; preds = %entry, %for.body1563 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]1564 %arrayidx = getelementptr inbounds i64, ptr %y, i64 %indvars.iv1565 %0 = load i64, ptr %arrayidx, align 81566 %call = tail call i64 @llvm.abs.i64(i64 %0, i1 true)1567 %arrayidx4 = getelementptr inbounds i64, ptr %x, i64 %indvars.iv1568 store i64 %call, ptr %arrayidx4, align 81569 %indvars.iv.next = add i64 %indvars.iv, 11570 %lftr.wideiv = trunc i64 %indvars.iv.next to i321571 %exitcond = icmp eq i32 %lftr.wideiv, %n1572 br i1 %exitcond, label %for.end, label %for.body1573 1574for.end: ; preds = %for.body, %entry1575 ret void1576}1577 1578declare i32 @llvm.smin.i32 (i32, i32)1579 1580define void @smin_i32(i32 %n, ptr %x, ptr %y) {1581; CHECK-LABEL: @smin_i32(1582; CHECK: call <4 x i32> @llvm.smin.v4i32(<4 x i32> [[WIDE_LOADX:%.*]], <4 x i32> [[WIDE_LOADY:%.*]])1583; CHECK: ret void1584;1585entry:1586 %cmp = icmp sgt i32 %n, 01587 br i1 %cmp, label %loop, label %end1588 1589loop:1590 %iv = phi i32 [ %iv.next, %loop ], [ 0, %entry ]1591 %xi = getelementptr inbounds i32, ptr %x, i32 %iv1592 %yi = getelementptr inbounds i32, ptr %y, i32 %iv1593 %xld = load i32, ptr %xi, align 41594 %yld = load i32, ptr %yi, align 41595 %call = tail call i32 @llvm.smin.i32(i32 %xld, i32 %yld)1596 store i32 %call, ptr %xi, align 41597 %iv.next = add i32 %iv, 11598 %exitcond = icmp eq i32 %iv.next, %n1599 br i1 %exitcond, label %end, label %loop1600 1601end:1602 ret void1603}1604 1605declare i32 @llvm.smax.i32 (i32, i32)1606 1607define void @smax_i32(i32 %n, ptr %x, ptr %y) {1608; CHECK-LABEL: @smax_i32(1609; CHECK: call <4 x i32> @llvm.smax.v4i32(<4 x i32> [[WIDE_LOADX:%.*]], <4 x i32> [[WIDE_LOADY:%.*]])1610; CHECK: ret void1611;1612entry:1613 %cmp = icmp sgt i32 %n, 01614 br i1 %cmp, label %loop, label %end1615 1616loop:1617 %iv = phi i32 [ %iv.next, %loop ], [ 0, %entry ]1618 %xi = getelementptr inbounds i32, ptr %x, i32 %iv1619 %yi = getelementptr inbounds i32, ptr %y, i32 %iv1620 %xld = load i32, ptr %xi, align 41621 %yld = load i32, ptr %yi, align 41622 %call = tail call i32 @llvm.smax.i32(i32 %xld, i32 %yld)1623 store i32 %call, ptr %xi, align 41624 %iv.next = add i32 %iv, 11625 %exitcond = icmp eq i32 %iv.next, %n1626 br i1 %exitcond, label %end, label %loop1627 1628end:1629 ret void1630}1631 1632declare i32 @llvm.umin.i32 (i32, i32)1633 1634define void @umin_i32(i32 %n, ptr %x, ptr %y) {1635; CHECK-LABEL: @umin_i32(1636; CHECK: call <4 x i32> @llvm.umin.v4i32(<4 x i32> [[WIDE_LOADX:%.*]], <4 x i32> [[WIDE_LOADY:%.*]])1637; CHECK: ret void1638;1639entry:1640 %cmp = icmp sgt i32 %n, 01641 br i1 %cmp, label %loop, label %end1642 1643loop:1644 %iv = phi i32 [ %iv.next, %loop ], [ 0, %entry ]1645 %xi = getelementptr inbounds i32, ptr %x, i32 %iv1646 %yi = getelementptr inbounds i32, ptr %y, i32 %iv1647 %xld = load i32, ptr %xi, align 41648 %yld = load i32, ptr %yi, align 41649 %call = tail call i32 @llvm.umin.i32(i32 %xld, i32 %yld)1650 store i32 %call, ptr %xi, align 41651 %iv.next = add i32 %iv, 11652 %exitcond = icmp eq i32 %iv.next, %n1653 br i1 %exitcond, label %end, label %loop1654 1655end:1656 ret void1657}1658 1659declare i32 @llvm.umax.i32 (i32, i32)1660 1661define void @umax_i32(i32 %n, ptr %x, ptr %y) {1662; CHECK-LABEL: @umax_i32(1663; CHECK: call <4 x i32> @llvm.umax.v4i32(<4 x i32> [[WIDE_LOADX:%.*]], <4 x i32> [[WIDE_LOADY:%.*]])1664; CHECK: ret void1665;1666entry:1667 %cmp = icmp sgt i32 %n, 01668 br i1 %cmp, label %loop, label %end1669 1670loop:1671 %iv = phi i32 [ %iv.next, %loop ], [ 0, %entry ]1672 %xi = getelementptr inbounds i32, ptr %x, i32 %iv1673 %yi = getelementptr inbounds i32, ptr %y, i32 %iv1674 %xld = load i32, ptr %xi, align 41675 %yld = load i32, ptr %yi, align 41676 %call = tail call i32 @llvm.umax.i32(i32 %xld, i32 %yld)1677 store i32 %call, ptr %xi, align 41678 %iv.next = add i32 %iv, 11679 %exitcond = icmp eq i32 %iv.next, %n1680 br i1 %exitcond, label %end, label %loop1681 1682end:1683 ret void1684}1685 1686declare i32 @llvm.fshl.i32 (i32, i32, i32)1687 1688define void @fshl_i32(i32 %n, ptr %x, ptr %y, i32 %shAmt) {1689; CHECK-LABEL: @fshl_i32(1690; CHECK: call <4 x i32> @llvm.fshl.v4i32(<4 x i32> [[WIDE_LOADX:%.*]], <4 x i32> [[WIDE_LOADY:%.*]], <4 x i32> [[SPLAT:%.*]])1691; CHECK: ret void1692;1693entry:1694 %cmp = icmp sgt i32 %n, 01695 br i1 %cmp, label %loop, label %end1696 1697loop:1698 %iv = phi i32 [ %iv.next, %loop ], [ 0, %entry ]1699 %xi = getelementptr inbounds i32, ptr %x, i32 %iv1700 %yi = getelementptr inbounds i32, ptr %y, i32 %iv1701 %xld = load i32, ptr %xi, align 41702 %yld = load i32, ptr %yi, align 41703 %call = tail call i32 @llvm.fshl.i32(i32 %xld, i32 %yld, i32 %shAmt)1704 store i32 %call, ptr %xi, align 41705 %iv.next = add i32 %iv, 11706 %exitcond = icmp eq i32 %iv.next, %n1707 br i1 %exitcond, label %end, label %loop1708 1709end:1710 ret void1711}1712 1713declare i32 @llvm.fshr.i32 (i32, i32, i32)1714 1715define void @fshr_i32(i32 %n, ptr %x, ptr %y, i32 %shAmt) {1716; CHECK-LABEL: @fshr_i32(1717; CHECK: call <4 x i32> @llvm.fshr.v4i32(<4 x i32> [[WIDE_LOADX:%.*]], <4 x i32> [[WIDE_LOADY:%.*]], <4 x i32> [[SPLAT:%.*]])1718; CHECK: ret void1719;1720entry:1721 %cmp = icmp sgt i32 %n, 01722 br i1 %cmp, label %loop, label %end1723 1724loop:1725 %iv = phi i32 [ %iv.next, %loop ], [ 0, %entry ]1726 %xi = getelementptr inbounds i32, ptr %x, i32 %iv1727 %yi = getelementptr inbounds i32, ptr %y, i32 %iv1728 %xld = load i32, ptr %xi, align 41729 %yld = load i32, ptr %yi, align 41730 %call = tail call i32 @llvm.fshr.i32(i32 %xld, i32 %yld, i32 %shAmt)1731 store i32 %call, ptr %xi, align 41732 %iv.next = add i32 %iv, 11733 %exitcond = icmp eq i32 %iv.next, %n1734 br i1 %exitcond, label %end, label %loop1735 1736end:1737 ret void1738}1739 1740declare float @llvm.minnum.f32(float, float)1741 1742define void @minnum_f32(i32 %n, ptr %y, ptr %x, ptr %z) {1743; CHECK-LABEL: @minnum_f32(1744; CHECK: llvm.minnum.v4f321745; CHECK: ret void1746;1747entry:1748 %cmp9 = icmp sgt i32 %n, 01749 br i1 %cmp9, label %for.body, label %for.end1750 1751for.body: ; preds = %entry, %for.body1752 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]1753 %arrayidx = getelementptr inbounds float, ptr %y, i64 %indvars.iv1754 %0 = load float, ptr %arrayidx, align 41755 %arrayidx2 = getelementptr inbounds float, ptr %z, i64 %indvars.iv1756 %1 = load float, ptr %arrayidx2, align 41757 %call = tail call float @llvm.minnum.f32(float %0, float %1)1758 %arrayidx4 = getelementptr inbounds float, ptr %x, i64 %indvars.iv1759 store float %call, ptr %arrayidx4, align 41760 %indvars.iv.next = add i64 %indvars.iv, 11761 %lftr.wideiv = trunc i64 %indvars.iv.next to i321762 %exitcond = icmp eq i32 %lftr.wideiv, %n1763 br i1 %exitcond, label %for.end, label %for.body1764 1765for.end: ; preds = %for.body, %entry1766 ret void1767}1768 1769declare float @llvm.maxnum.f32(float, float)1770 1771define void @maxnum_f32(i32 %n, ptr %y, ptr %x, ptr %z) {1772; CHECK-LABEL: @maxnum_f32(1773; CHECK: llvm.maxnum.v4f321774; CHECK: ret void1775;1776entry:1777 %cmp9 = icmp sgt i32 %n, 01778 br i1 %cmp9, label %for.body, label %for.end1779 1780for.body: ; preds = %entry, %for.body1781 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]1782 %arrayidx = getelementptr inbounds float, ptr %y, i64 %indvars.iv1783 %0 = load float, ptr %arrayidx, align 41784 %arrayidx2 = getelementptr inbounds float, ptr %z, i64 %indvars.iv1785 %1 = load float, ptr %arrayidx2, align 41786 %call = tail call float @llvm.maxnum.f32(float %0, float %1)1787 %arrayidx4 = getelementptr inbounds float, ptr %x, i64 %indvars.iv1788 store float %call, ptr %arrayidx4, align 41789 %indvars.iv.next = add i64 %indvars.iv, 11790 %lftr.wideiv = trunc i64 %indvars.iv.next to i321791 %exitcond = icmp eq i32 %lftr.wideiv, %n1792 br i1 %exitcond, label %for.end, label %for.body1793 1794for.end: ; preds = %for.body, %entry1795 ret void1796}1797 1798declare float @llvm.minimum.f32(float, float)1799 1800define void @minimum_f32(i32 %n, ptr %y, ptr %x, ptr %z) {1801; CHECK-LABEL: @minimum_f32(1802; CHECK: llvm.minimum.v4f321803; CHECK: ret void1804;1805entry:1806 %cmp9 = icmp sgt i32 %n, 01807 br i1 %cmp9, label %for.body, label %for.end1808 1809for.body: ; preds = %entry, %for.body1810 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]1811 %arrayidx = getelementptr inbounds float, ptr %y, i64 %indvars.iv1812 %0 = load float, ptr %arrayidx, align 41813 %arrayidx2 = getelementptr inbounds float, ptr %z, i64 %indvars.iv1814 %1 = load float, ptr %arrayidx2, align 41815 %call = tail call float @llvm.minimum.f32(float %0, float %1)1816 %arrayidx4 = getelementptr inbounds float, ptr %x, i64 %indvars.iv1817 store float %call, ptr %arrayidx4, align 41818 %indvars.iv.next = add i64 %indvars.iv, 11819 %lftr.wideiv = trunc i64 %indvars.iv.next to i321820 %exitcond = icmp eq i32 %lftr.wideiv, %n1821 br i1 %exitcond, label %for.end, label %for.body1822 1823for.end: ; preds = %for.body, %entry1824 ret void1825}1826 1827declare float @llvm.maximum.f32(float, float)1828 1829define void @maximum_f32(i32 %n, ptr %y, ptr %x, ptr %z) {1830; CHECK-LABEL: @maximum_f32(1831; CHECK: llvm.maximum.v4f321832; CHECK: ret void1833;1834entry:1835 %cmp9 = icmp sgt i32 %n, 01836 br i1 %cmp9, label %for.body, label %for.end1837 1838for.body: ; preds = %entry, %for.body1839 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ 0, %entry ]1840 %arrayidx = getelementptr inbounds float, ptr %y, i64 %indvars.iv1841 %0 = load float, ptr %arrayidx, align 41842 %arrayidx2 = getelementptr inbounds float, ptr %z, i64 %indvars.iv1843 %1 = load float, ptr %arrayidx2, align 41844 %call = tail call float @llvm.maximum.f32(float %0, float %1)1845 %arrayidx4 = getelementptr inbounds float, ptr %x, i64 %indvars.iv1846 store float %call, ptr %arrayidx4, align 41847 %indvars.iv.next = add i64 %indvars.iv, 11848 %lftr.wideiv = trunc i64 %indvars.iv.next to i321849 %exitcond = icmp eq i32 %lftr.wideiv, %n1850 br i1 %exitcond, label %for.end, label %for.body1851 1852for.end: ; preds = %for.body, %entry1853 ret void1854}1855 1856declare i32 @llvm.lrint.i32.f32(float)1857 1858define void @lrint_i32_f32(ptr %x, ptr %y, i64 %n) {1859; CHECK-LABEL: @lrint_i32_f32(1860; CHECK: llvm.lrint.v4i32.v4f321861; CHECK: ret void1862;1863entry:1864 %cmp = icmp sgt i64 %n, 01865 br i1 %cmp, label %for.body, label %exit1866 1867for.body: ; preds = %entry, %for.body1868 %iv = phi i64 [ 0, %entry ], [ %iv.next, %for.body ]1869 %gep.load = getelementptr inbounds float, ptr %x, i64 %iv1870 %0 = load float, ptr %gep.load, align 41871 %1 = tail call i32 @llvm.lrint.i32.f32(float %0)1872 %gep.store = getelementptr inbounds i32, ptr %y, i64 %iv1873 store i32 %1, ptr %gep.store, align 41874 %iv.next = add nuw nsw i64 %iv, 11875 %exitcond = icmp eq i64 %iv.next, %n1876 br i1 %exitcond, label %exit, label %for.body1877 1878exit: ; preds = %for.body, %entry1879 ret void1880}1881 1882declare i64 @llvm.llrint.i64.f32(float)1883 1884define void @llrint_i64_f32(ptr %x, ptr %y, i64 %n) {1885; CHECK-LABEL: @llrint_i64_f32(1886; CHECK: llvm.llrint.v4i64.v4f321887; CHECK: ret void1888;1889entry:1890 %cmp = icmp sgt i64 %n, 01891 br i1 %cmp, label %for.body, label %exit1892 1893for.body: ; preds = %entry, %for.body1894 %iv = phi i64 [ 0, %entry ], [ %iv.next, %for.body ]1895 %gep.load = getelementptr inbounds float, ptr %x, i64 %iv1896 %0 = load float, ptr %gep.load, align 41897 %1 = tail call i64 @llvm.llrint.i64.f32(float %0)1898 %gep.store = getelementptr inbounds i64, ptr %y, i64 %iv1899 store i64 %1, ptr %gep.store, align 41900 %iv.next = add nuw nsw i64 %iv, 11901 %exitcond = icmp eq i64 %iv.next, %n1902 br i1 %exitcond, label %exit, label %for.body1903 1904exit: ; preds = %for.body, %entry1905 ret void1906}1907