1a8402682SLiqin.Weng; This is the loop in c++ being vectorize in this file with 2bfc03171SMaciej Gabka;vector.reverse 3a8402682SLiqin.Weng; #pragma clang loop vectorize_width(4, scalable) 4a8402682SLiqin.Weng; for (int i = N-1; i >= 0; --i) 5a8402682SLiqin.Weng; a[i] = b[i] + 1.0; 6a8402682SLiqin.Weng 7a8402682SLiqin.Weng; REQUIRES: asserts 8be51fa45SRoman Lebedev; RUN: opt -passes=loop-vectorize,dce,instcombine -mtriple riscv64-linux-gnu \ 9a8402682SLiqin.Weng; RUN: -mattr=+v -debug-only=loop-vectorize -scalable-vectorization=on \ 106071de3dSPhilip Reames; RUN: -riscv-v-vector-bits-min=128 -disable-output < %s 2>&1 | FileCheck %s 11a8402682SLiqin.Weng 12a8402682SLiqin.Wengdefine void @vector_reverse_i64(ptr nocapture noundef writeonly %A, ptr nocapture noundef readonly %B, i32 noundef signext %n) { 136071de3dSPhilip Reames; CHECK-LABEL: 'vector_reverse_i64' 146071de3dSPhilip Reames; CHECK-NEXT: LV: Loop hints: force=enabled width=vscale x 4 interleave=0 156071de3dSPhilip Reames; CHECK-NEXT: LV: Found a loop: for.body 166071de3dSPhilip Reames; CHECK-NEXT: LV: Found an induction variable. 176071de3dSPhilip Reames; CHECK-NEXT: LV: Found an induction variable. 186071de3dSPhilip Reames; CHECK-NEXT: LV: Did not find one integer induction var. 196071de3dSPhilip Reames; CHECK-NEXT: LV: We can vectorize this loop (with a runtime bound check)! 20b72689a5SFlorian Hahn; CHECK-NEXT: LV: Loop does not require scalar epilogue 216071de3dSPhilip Reames; CHECK-NEXT: LV: Found trip count: 0 2272f339deSDavid Sherwood; CHECK-NEXT: LV: Found maximum trip count: 4294967295 236071de3dSPhilip Reames; CHECK-NEXT: LV: Scalable vectorization is available 246071de3dSPhilip Reames; CHECK-NEXT: LV: The max safe fixed VF is: 67108864. 256071de3dSPhilip Reames; CHECK-NEXT: LV: The max safe scalable VF is: vscale x 4294967295. 266071de3dSPhilip Reames; CHECK-NEXT: LV: Found uniform instruction: %cmp = icmp ugt i64 %indvars.iv, 1 276071de3dSPhilip Reames; CHECK-NEXT: LV: Found uniform instruction: %arrayidx = getelementptr inbounds i32, ptr %B, i64 %idxprom 286071de3dSPhilip Reames; CHECK-NEXT: LV: Found uniform instruction: %arrayidx3 = getelementptr inbounds i32, ptr %A, i64 %idxprom 296071de3dSPhilip Reames; CHECK-NEXT: LV: Found uniform instruction: %idxprom = zext i32 %i.0 to i64 306071de3dSPhilip Reames; CHECK-NEXT: LV: Found uniform instruction: %idxprom = zext i32 %i.0 to i64 316071de3dSPhilip Reames; CHECK-NEXT: LV: Found uniform instruction: %indvars.iv = phi i64 [ %0, %for.body.preheader ], [ %indvars.iv.next, %for.body ] 326071de3dSPhilip Reames; CHECK-NEXT: LV: Found uniform instruction: %indvars.iv.next = add nsw i64 %indvars.iv, -1 336071de3dSPhilip Reames; CHECK-NEXT: LV: Found uniform instruction: %i.0.in8 = phi i32 [ %n, %for.body.preheader ], [ %i.0, %for.body ] 346071de3dSPhilip Reames; CHECK-NEXT: LV: Found uniform instruction: %i.0 = add nsw i32 %i.0.in8, -1 350a5d52a7SSergey Kachkov; CHECK-NEXT: LV: Found an estimated cost of 0 for VF vscale x 4 For instruction: %indvars.iv = phi i64 [ %0, %for.body.preheader ], [ %indvars.iv.next, %for.body ] 360a5d52a7SSergey Kachkov; CHECK-NEXT: LV: Found an estimated cost of 0 for VF vscale x 4 For instruction: %i.0.in8 = phi i32 [ %n, %for.body.preheader ], [ %i.0, %for.body ] 376071de3dSPhilip Reames; CHECK-NEXT: LV: Found an estimated cost of 1 for VF vscale x 4 For instruction: %i.0 = add nsw i32 %i.0.in8, -1 386071de3dSPhilip Reames; CHECK-NEXT: LV: Found an estimated cost of 1 for VF vscale x 4 For instruction: %idxprom = zext i32 %i.0 to i64 396071de3dSPhilip Reames; CHECK-NEXT: LV: Found an estimated cost of 0 for VF vscale x 4 For instruction: %arrayidx = getelementptr inbounds i32, ptr %B, i64 %idxprom 406ee9c8afSShih-Po Hung; CHECK-NEXT: LV: Found an estimated cost of 13 for VF vscale x 4 For instruction: %1 = load i32, ptr %arrayidx, align 4 4173eacf94SPhilip Reames; CHECK-NEXT: LV: Found an estimated cost of 2 for VF vscale x 4 For instruction: %add9 = add i32 %1, 1 426071de3dSPhilip Reames; CHECK-NEXT: LV: Found an estimated cost of 0 for VF vscale x 4 For instruction: %arrayidx3 = getelementptr inbounds i32, ptr %A, i64 %idxprom 436ee9c8afSShih-Po Hung; CHECK-NEXT: LV: Found an estimated cost of 13 for VF vscale x 4 For instruction: store i32 %add9, ptr %arrayidx3, align 4 446071de3dSPhilip Reames; CHECK-NEXT: LV: Found an estimated cost of 1 for VF vscale x 4 For instruction: %cmp = icmp ugt i64 %indvars.iv, 1 456071de3dSPhilip Reames; CHECK-NEXT: LV: Found an estimated cost of 1 for VF vscale x 4 For instruction: %indvars.iv.next = add nsw i64 %indvars.iv, -1 460a5d52a7SSergey Kachkov; CHECK-NEXT: LV: Found an estimated cost of 0 for VF vscale x 4 For instruction: br i1 %cmp, label %for.body, label %for.cond.cleanup.loopexit, !llvm.loop !0 470e29a80fSPhilip Reames; CHECK-NEXT: LV: Using user VF vscale x 4. 4899d6c6d9SFlorian Hahn; CHECK-NEXT: LV: Loop does not require scalar epilogue 496071de3dSPhilip Reames; CHECK-NEXT: LV: Scalarizing: %i.0 = add nsw i32 %i.0.in8, -1 506071de3dSPhilip Reames; CHECK-NEXT: LV: Scalarizing: %idxprom = zext i32 %i.0 to i64 516071de3dSPhilip Reames; CHECK-NEXT: LV: Scalarizing: %arrayidx = getelementptr inbounds i32, ptr %B, i64 %idxprom 526071de3dSPhilip Reames; CHECK-NEXT: LV: Scalarizing: %arrayidx3 = getelementptr inbounds i32, ptr %A, i64 %idxprom 5312f9c7b2SFlorian Hahn; CHECK-NEXT: LV: Scalarizing: %cmp = icmp ugt i64 %indvars.iv, 1 5412f9c7b2SFlorian Hahn; CHECK-NEXT: LV: Scalarizing: %indvars.iv.next = add nsw i64 %indvars.iv, -1 550e29a80fSPhilip Reames; CHECK-NEXT: VPlan 'Initial VPlan for VF={vscale x 4},UF>=1' { 56266ff98cSShih-Po Hung; CHECK-NEXT: Live-in vp<[[VF:%.+]]> = VF 5726fca725SShih-Po Hung; CHECK-NEXT: Live-in vp<[[VFxUF:%.+]]> = VF * UF 5826fca725SShih-Po Hung; CHECK-NEXT: Live-in vp<[[VEC_TC:%.+]]> = vector-trip-count 5926fca725SShih-Po Hung; CHECK-NEXT: vp<[[TC:%.+]]> = original trip-count 6058854facSLuke Lau; CHECK-EMPTY: 6158854facSLuke Lau; CHECK-NEXT: ir-bb<for.body.preheader>: 62f0c5caa8SFlorian Hahn; CHECK-NEXT: IR %0 = zext i32 %n to i64 6326fca725SShih-Po Hung; CHECK-NEXT: EMIT vp<[[TC]]> = EXPAND SCEV (zext i32 %n to i64) 646c8f41d3SFlorian Hahn; CHECK-NEXT: Successor(s): vector.ph 6558854facSLuke Lau; CHECK-EMPTY: 6658854facSLuke Lau; CHECK-NEXT: vector.ph: 67*7f3428d3SFlorian Hahn; CHECK-NEXT: vp<[[END1:%.+]]> = DERIVED-IV ir<%0> + vp<[[VEC_TC]]> * ir<-1> 68*7f3428d3SFlorian Hahn; CHECK-NEXT: vp<[[END2:%.+]]> = DERIVED-IV ir<%n> + vp<[[VEC_TC]]> * ir<-1> 696071de3dSPhilip Reames; CHECK-NEXT: Successor(s): vector loop 7058854facSLuke Lau; CHECK-EMPTY: 7158854facSLuke Lau; CHECK-NEXT: <x1> vector loop: { 726071de3dSPhilip Reames; CHECK-NEXT: vector.body: 7326fca725SShih-Po Hung; CHECK-NEXT: EMIT vp<[[CAN_IV:%.+]]> = CANONICAL-INDUCTION 7426fca725SShih-Po Hung; CHECK-NEXT: vp<[[DEV_IV:%.+]]> = DERIVED-IV ir<%n> + vp<[[CAN_IV]]> * ir<-1> 7526fca725SShih-Po Hung; CHECK-NEXT: vp<[[STEPS:%.+]]> = SCALAR-STEPS vp<[[DEV_IV]]>, ir<-1> 7626fca725SShih-Po Hung; CHECK-NEXT: CLONE ir<%i.0> = add nsw vp<[[STEPS]]>, ir<-1> 776071de3dSPhilip Reames; CHECK-NEXT: CLONE ir<%idxprom> = zext ir<%i.0> 78299f0ff6SFlorian Hahn; CHECK-NEXT: CLONE ir<%arrayidx> = getelementptr inbounds ir<%B>, ir<%idxprom> 79266ff98cSShih-Po Hung; CHECK-NEXT: vp<[[VEC_PTR:%.+]]> = reverse-vector-pointer inbounds ir<%arrayidx>, vp<[[VF]]> 8026fca725SShih-Po Hung; CHECK-NEXT: WIDEN ir<%1> = load vp<[[VEC_PTR]]> 816071de3dSPhilip Reames; CHECK-NEXT: WIDEN ir<%add9> = add ir<%1>, ir<1> 82299f0ff6SFlorian Hahn; CHECK-NEXT: CLONE ir<%arrayidx3> = getelementptr inbounds ir<%A>, ir<%idxprom> 83266ff98cSShih-Po Hung; CHECK-NEXT: vp<[[VEC_PTR2:%.+]]> = reverse-vector-pointer inbounds ir<%arrayidx3>, vp<[[VF]]> 8426fca725SShih-Po Hung; CHECK-NEXT: WIDEN store vp<[[VEC_PTR2]]>, ir<%add9> 8526fca725SShih-Po Hung; CHECK-NEXT: EMIT vp<[[CAN_IV_NEXT:%.+]]> = add nuw vp<[[CAN_IV]]>, vp<[[VFxUF]]> 8626fca725SShih-Po Hung; CHECK-NEXT: EMIT branch-on-count vp<[[CAN_IV_NEXT]]>, vp<[[VEC_TC]]> 876071de3dSPhilip Reames; CHECK-NEXT: No successors 886071de3dSPhilip Reames; CHECK-NEXT: } 896071de3dSPhilip Reames; CHECK-NEXT: Successor(s): middle.block 9099d6c6d9SFlorian Hahn; CHECK-EMPTY: 9158854facSLuke Lau; CHECK-NEXT: middle.block: 9226fca725SShih-Po Hung; CHECK-NEXT: EMIT vp<[[CMP:%.+]]> = icmp eq vp<[[TC]]>, vp<[[VEC_TC]]> 9326fca725SShih-Po Hung; CHECK-NEXT: EMIT branch-on-cond vp<[[CMP]]> 9499d6c6d9SFlorian Hahn; CHECK-NEXT: Successor(s): ir-bb<for.cond.cleanup.loopexit>, scalar.ph 9599d6c6d9SFlorian Hahn; CHECK-EMPTY: 9658854facSLuke Lau; CHECK-NEXT: scalar.ph: 97*7f3428d3SFlorian Hahn; CHECK-NEXT: EMIT vp<[[RESUME1:%.+]]> = resume-phi vp<[[END1]]>, ir<%0> 98*7f3428d3SFlorian Hahn; CHECK-NEXT: EMIT vp<[[RESUME2:%.+]]>.1 = resume-phi vp<[[END2]]>, ir<%n> 99b021464dSFlorian Hahn; CHECK-NEXT: Successor(s): ir-bb<for.body> 100b021464dSFlorian Hahn; CHECK-EMPTY: 101b021464dSFlorian Hahn; CHECK-NEXT: ir-bb<for.body>: 102*7f3428d3SFlorian Hahn; CHECK-NEXT: IR %indvars.iv = phi i64 [ %0, %for.body.preheader ], [ %indvars.iv.next, %for.body ] (extra operand: vp<[[RESUME1]]> from scalar.ph) 103*7f3428d3SFlorian Hahn; CHECK-NEXT: IR %i.0.in8 = phi i32 [ %n, %for.body.preheader ], [ %i.0, %for.body ] (extra operand: vp<[[RESUME2]]>.1 from scalar.ph) 104b021464dSFlorian Hahn; CHECK: IR %indvars.iv.next = add nsw i64 %indvars.iv, -1 1056071de3dSPhilip Reames; CHECK-NEXT: No successors 1066797b0f0SFlorian Hahn; CHECK-EMPTY: 1076797b0f0SFlorian Hahn; CHECK-NEXT: ir-bb<for.cond.cleanup.loopexit>: 1086797b0f0SFlorian Hahn; CHECK-NEXT: No successors 1096071de3dSPhilip Reames; CHECK-NEXT: } 1100a5d52a7SSergey Kachkov; CHECK-NEXT: LV: Found an estimated cost of 0 for VF vscale x 4 For instruction: %indvars.iv = phi i64 [ %0, %for.body.preheader ], [ %indvars.iv.next, %for.body ] 1110a5d52a7SSergey Kachkov; CHECK-NEXT: LV: Found an estimated cost of 0 for VF vscale x 4 For instruction: %i.0.in8 = phi i32 [ %n, %for.body.preheader ], [ %i.0, %for.body ] 1126071de3dSPhilip Reames; CHECK-NEXT: LV: Found an estimated cost of 1 for VF vscale x 4 For instruction: %i.0 = add nsw i32 %i.0.in8, -1 1136071de3dSPhilip Reames; CHECK-NEXT: LV: Found an estimated cost of 1 for VF vscale x 4 For instruction: %idxprom = zext i32 %i.0 to i64 1146071de3dSPhilip Reames; CHECK-NEXT: LV: Found an estimated cost of 0 for VF vscale x 4 For instruction: %arrayidx = getelementptr inbounds i32, ptr %B, i64 %idxprom 1156ee9c8afSShih-Po Hung; CHECK-NEXT: LV: Found an estimated cost of 13 for VF vscale x 4 For instruction: %1 = load i32, ptr %arrayidx, align 4 11673eacf94SPhilip Reames; CHECK-NEXT: LV: Found an estimated cost of 2 for VF vscale x 4 For instruction: %add9 = add i32 %1, 1 1176071de3dSPhilip Reames; CHECK-NEXT: LV: Found an estimated cost of 0 for VF vscale x 4 For instruction: %arrayidx3 = getelementptr inbounds i32, ptr %A, i64 %idxprom 1186ee9c8afSShih-Po Hung; CHECK-NEXT: LV: Found an estimated cost of 13 for VF vscale x 4 For instruction: store i32 %add9, ptr %arrayidx3, align 4 1196071de3dSPhilip Reames; CHECK-NEXT: LV: Found an estimated cost of 1 for VF vscale x 4 For instruction: %cmp = icmp ugt i64 %indvars.iv, 1 1206071de3dSPhilip Reames; CHECK-NEXT: LV: Found an estimated cost of 1 for VF vscale x 4 For instruction: %indvars.iv.next = add nsw i64 %indvars.iv, -1 1210a5d52a7SSergey Kachkov; CHECK-NEXT: LV: Found an estimated cost of 0 for VF vscale x 4 For instruction: br i1 %cmp, label %for.body, label %for.cond.cleanup.loopexit, !llvm.loop !0 1226071de3dSPhilip Reames; CHECK-NEXT: LV(REG): Calculating max register usage: 1236071de3dSPhilip Reames; CHECK-NEXT: LV(REG): At #0 Interval # 0 1246071de3dSPhilip Reames; CHECK-NEXT: LV(REG): At #1 Interval # 1 1256071de3dSPhilip Reames; CHECK-NEXT: LV(REG): At #2 Interval # 2 1266071de3dSPhilip Reames; CHECK-NEXT: LV(REG): At #3 Interval # 2 1276071de3dSPhilip Reames; CHECK-NEXT: LV(REG): At #4 Interval # 2 1286071de3dSPhilip Reames; CHECK-NEXT: LV(REG): At #5 Interval # 3 1296071de3dSPhilip Reames; CHECK-NEXT: LV(REG): At #6 Interval # 3 1306071de3dSPhilip Reames; CHECK-NEXT: LV(REG): At #7 Interval # 3 1316071de3dSPhilip Reames; CHECK-NEXT: LV(REG): At #9 Interval # 1 1326071de3dSPhilip Reames; CHECK-NEXT: LV(REG): At #10 Interval # 2 1330e29a80fSPhilip Reames; CHECK-NEXT: LV(REG): VF = vscale x 4 1346071de3dSPhilip Reames; CHECK-NEXT: LV(REG): Found max usage: 2 item 1356071de3dSPhilip Reames; CHECK-NEXT: LV(REG): RegisterClass: RISCV::GPRRC, 3 registers 1366071de3dSPhilip Reames; CHECK-NEXT: LV(REG): RegisterClass: RISCV::VRRC, 2 registers 1370e29a80fSPhilip Reames; CHECK-NEXT: LV(REG): Found invariant usage: 1 item 1384f9a5447Ssgokhale; CHECK-NEXT: LV(REG): RegisterClass: RISCV::GPRRC, 1 registers 1396071de3dSPhilip Reames; CHECK-NEXT: LV: The target has 31 registers of RISCV::GPRRC register class 1406071de3dSPhilip Reames; CHECK-NEXT: LV: The target has 32 registers of RISCV::VRRC register class 14149e5cd2aSKolya Panchenko; CHECK-NEXT: LV: Loop does not require scalar epilogue 1426ee9c8afSShih-Po Hung; CHECK-NEXT: LV: Loop cost is 32 14315f9cf16SLuke Lau; CHECK-NEXT: LV: IC is 1 1440e29a80fSPhilip Reames; CHECK-NEXT: LV: VF is vscale x 4 1456071de3dSPhilip Reames; CHECK-NEXT: LV: Not Interleaving. 1466071de3dSPhilip Reames; CHECK-NEXT: LV: Interleaving is not beneficial. 1470e29a80fSPhilip Reames; CHECK-NEXT: LV: Found a vectorizable loop (vscale x 4) in <stdin> 14867a55e01SFlorian Hahn; CHECK-NEXT: LEV: Epilogue vectorization is not profitable for this loop 149156da986SFlorian Hahn; CHECK: Executing best plan with VF=vscale x 4, UF=1 1508ec40675SFlorian Hahn; CHECK-NEXT: VPlan 'Final VPlan for VF={vscale x 4},UF={1}' { 151156da986SFlorian Hahn; CHECK-NEXT: Live-in ir<[[VF:%.+]]> = VF 152156da986SFlorian Hahn; CHECK-NEXT: Live-in ir<[[VFxUF:%.+]]>.1 = VF * UF 153156da986SFlorian Hahn; CHECK-NEXT: Live-in ir<[[VEC_TC:%.+]]> = vector-trip-count 15426fca725SShih-Po Hung; CHECK-NEXT: vp<[[TC:%.+]]> = original trip-count 15558854facSLuke Lau; CHECK-EMPTY: 15658854facSLuke Lau; CHECK-NEXT: ir-bb<for.body.preheader>: 157f0c5caa8SFlorian Hahn; CHECK-NEXT: IR %0 = zext i32 %n to i64 15826fca725SShih-Po Hung; CHECK-NEXT: EMIT vp<[[TC]]> = EXPAND SCEV (zext i32 %n to i64) 1596c8f41d3SFlorian Hahn; CHECK-NEXT: Successor(s): ir-bb<scalar.ph>, ir-bb<vector.scevcheck> 16058854facSLuke Lau; CHECK-EMPTY: 1616c8f41d3SFlorian Hahn; CHECK-NEXT: ir-bb<vector.scevcheck>: 1626c8f41d3SFlorian Hahn; CHECK-NEXT: IR %3 = add nsw i64 %0, -1 1636c8f41d3SFlorian Hahn; CHECK-NEXT: IR %4 = add i32 %n, -1 1646c8f41d3SFlorian Hahn; CHECK-NEXT: IR %5 = trunc i64 %3 to i32 1656c8f41d3SFlorian Hahn; CHECK-NEXT: IR %mul = call { i32, i1 } @llvm.umul.with.overflow.i32(i32 1, i32 %5) 1666c8f41d3SFlorian Hahn; CHECK-NEXT: IR %mul.result = extractvalue { i32, i1 } %mul, 0 1676c8f41d3SFlorian Hahn; CHECK-NEXT: IR %mul.overflow = extractvalue { i32, i1 } %mul, 1 1686c8f41d3SFlorian Hahn; CHECK-NEXT: IR %6 = sub i32 %4, %mul.result 1696c8f41d3SFlorian Hahn; CHECK-NEXT: IR %7 = icmp ugt i32 %6, %4 1706c8f41d3SFlorian Hahn; CHECK-NEXT: IR %8 = or i1 %7, %mul.overflow 1716c8f41d3SFlorian Hahn; CHECK-NEXT: IR %9 = icmp ugt i64 %3, 4294967295 1726c8f41d3SFlorian Hahn; CHECK-NEXT: IR %10 = or i1 %8, %9 1736c8f41d3SFlorian Hahn; CHECK-NEXT: Successor(s): ir-bb<scalar.ph>, ir-bb<vector.memcheck> 1746c8f41d3SFlorian Hahn; CHECK-EMPTY: 1756c8f41d3SFlorian Hahn; CHECK-NEXT: ir-bb<vector.memcheck>: 1766c8f41d3SFlorian Hahn; CHECK-NEXT: IR %11 = call i64 @llvm.vscale.i64() 1776c8f41d3SFlorian Hahn; CHECK-NEXT: IR %12 = mul i64 %11, 4 1786c8f41d3SFlorian Hahn; CHECK-NEXT: IR %13 = mul i64 %12, 4 1796c8f41d3SFlorian Hahn; CHECK-NEXT: IR %14 = sub i64 %B1, %A2 1806c8f41d3SFlorian Hahn; CHECK-NEXT: IR %diff.check = icmp ult i64 %14, %13 1816c8f41d3SFlorian Hahn; CHECK-NEXT: Successor(s): ir-bb<scalar.ph>, ir-bb<vector.ph> 1826c8f41d3SFlorian Hahn; CHECK-EMPTY: 1836c8f41d3SFlorian Hahn; CHECK-NEXT: ir-bb<vector.ph>: 1846c8f41d3SFlorian Hahn; CHECK-NEXT: IR %15 = call i64 @llvm.vscale.i64() 1856c8f41d3SFlorian Hahn; CHECK-NEXT: IR %16 = mul i64 %15, 4 1866c8f41d3SFlorian Hahn; CHECK-NEXT: IR %n.mod.vf = urem i64 %0, %16 1876c8f41d3SFlorian Hahn; CHECK-NEXT: IR %n.vec = sub i64 %0, %n.mod.vf 1886c8f41d3SFlorian Hahn; CHECK-NEXT: IR %17 = call i64 @llvm.vscale.i64() 1896c8f41d3SFlorian Hahn; CHECK-NEXT: IR %18 = mul i64 %17, 4 190*7f3428d3SFlorian Hahn; CHECK-NEXT: vp<[[END1:%.+]]> = DERIVED-IV ir<%0> + ir<[[VEC_TC]]> * ir<-1> 191*7f3428d3SFlorian Hahn; CHECK-NEXT: vp<[[END2:%.+]]> = DERIVED-IV ir<%n> + ir<[[VEC_TC]]> * ir<-1> 19258854facSLuke Lau; CHECK-NEXT: Successor(s): vector loop 19358854facSLuke Lau; CHECK-EMPTY: 19458854facSLuke Lau; CHECK-NEXT: <x1> vector loop: { 19558854facSLuke Lau; CHECK-NEXT: vector.body: 196156da986SFlorian Hahn; CHECK-NEXT: SCALAR-PHI vp<[[CAN_IV:%.+]]> = phi ir<0>, vp<[[CAN_IV_NEXT:%.+]]> 19726fca725SShih-Po Hung; CHECK-NEXT: vp<[[DEV_IV:%.+]]> = DERIVED-IV ir<%n> + vp<[[CAN_IV]]> * ir<-1> 19826fca725SShih-Po Hung; CHECK-NEXT: vp<[[STEPS:%.+]]> = SCALAR-STEPS vp<[[DEV_IV]]>, ir<-1> 19926fca725SShih-Po Hung; CHECK-NEXT: CLONE ir<%i.0> = add nsw vp<[[STEPS]]>, ir<-1> 20058854facSLuke Lau; CHECK-NEXT: CLONE ir<%idxprom> = zext ir<%i.0> 20158854facSLuke Lau; CHECK-NEXT: CLONE ir<%arrayidx> = getelementptr inbounds ir<%B>, ir<%idxprom> 202156da986SFlorian Hahn; CHECK-NEXT: vp<[[VEC_PTR:%.+]]> = reverse-vector-pointer inbounds ir<%arrayidx>, ir<[[VF]]> 203156da986SFlorian Hahn; CHECK-NEXT: WIDEN ir<[[L:%.+]]> = load vp<[[VEC_PTR]]> 204156da986SFlorian Hahn; CHECK-NEXT: WIDEN ir<%add9> = add ir<[[L]]>, ir<1> 20558854facSLuke Lau; CHECK-NEXT: CLONE ir<%arrayidx3> = getelementptr inbounds ir<%A>, ir<%idxprom> 206156da986SFlorian Hahn; CHECK-NEXT: vp<[[VEC_PTR2:%.+]]> = reverse-vector-pointer inbounds ir<%arrayidx3>, ir<[[VF]]> 20726fca725SShih-Po Hung; CHECK-NEXT: WIDEN store vp<[[VEC_PTR2]]>, ir<%add9> 208156da986SFlorian Hahn; CHECK-NEXT: EMIT vp<[[CAN_IV_NEXT]]> = add nuw vp<[[CAN_IV]]>, ir<[[VFxUF]]>.1 209156da986SFlorian Hahn; CHECK-NEXT: EMIT branch-on-count vp<[[CAN_IV_NEXT]]>, ir<[[VEC_TC]]> 21058854facSLuke Lau; CHECK-NEXT: No successors 21158854facSLuke Lau; CHECK-NEXT: } 212156da986SFlorian Hahn; CHECK-NEXT: Successor(s): ir-bb<middle.block> 21358854facSLuke Lau; CHECK-EMPTY: 214156da986SFlorian Hahn; CHECK-NEXT: ir-bb<middle.block>: 215156da986SFlorian Hahn; CHECK-NEXT: EMIT vp<[[CMP:%.+]]> = icmp eq vp<[[TC]]>, ir<[[VEC_TC]]> 21626fca725SShih-Po Hung; CHECK-NEXT: EMIT branch-on-cond vp<[[CMP]]> 217156da986SFlorian Hahn; CHECK-NEXT: Successor(s): ir-bb<for.cond.cleanup.loopexit>, ir-bb<scalar.ph> 21858854facSLuke Lau; CHECK-EMPTY: 2196c8f41d3SFlorian Hahn; CHECK-NEXT: ir-bb<for.cond.cleanup.loopexit>: 2206c8f41d3SFlorian Hahn; CHECK-NEXT: No successors 2216c8f41d3SFlorian Hahn; CHECK-EMPTY: 222156da986SFlorian Hahn; CHECK-NEXT: ir-bb<scalar.ph>: 223*7f3428d3SFlorian Hahn; CHECK-NEXT: EMIT vp<[[RESUME_1:%.+]]> = resume-phi vp<[[END1]]>, ir<%0> 224*7f3428d3SFlorian Hahn; CHECK-NEXT: EMIT vp<[[RESUME_2:%.+]]>.1 = resume-phi vp<[[END2]]>, ir<%n> 225b021464dSFlorian Hahn; CHECK-NEXT: Successor(s): ir-bb<for.body> 226b021464dSFlorian Hahn; CHECK-EMPTY: 227b021464dSFlorian Hahn; CHECK-NEXT: ir-bb<for.body>: 2286c8f41d3SFlorian Hahn; CHECK-NEXT: IR %indvars.iv = phi i64 [ %0, %scalar.ph ], [ %indvars.iv.next, %for.body ] (extra operand: vp<[[RESUME_1]]> from ir-bb<scalar.ph>) 2296c8f41d3SFlorian Hahn; CHECK-NEXT: IR %i.0.in8 = phi i32 [ %n, %scalar.ph ], [ %i.0, %for.body ] (extra operand: vp<[[RESUME_2]]>.1 from ir-bb<scalar.ph>) 230b021464dSFlorian Hahn; CHECK: IR %indvars.iv.next = add nsw i64 %indvars.iv, -1 23158854facSLuke Lau; CHECK-NEXT: No successors 23258854facSLuke Lau; CHECK-NEXT: } 2336071de3dSPhilip Reames; 234a8402682SLiqin.Wengentry: 235a8402682SLiqin.Weng %cmp7 = icmp sgt i32 %n, 0 236a8402682SLiqin.Weng br i1 %cmp7, label %for.body.preheader, label %for.cond.cleanup 237a8402682SLiqin.Weng 238a8402682SLiqin.Wengfor.body.preheader: ; preds = %entry 239a8402682SLiqin.Weng %0 = zext i32 %n to i64 240a8402682SLiqin.Weng br label %for.body 241a8402682SLiqin.Weng 242a8402682SLiqin.Wengfor.cond.cleanup: ; preds = %for.body, %entry 243a8402682SLiqin.Weng ret void 244a8402682SLiqin.Weng 245a8402682SLiqin.Wengfor.body: ; preds = %for.body.preheader, %for.body 246a8402682SLiqin.Weng %indvars.iv = phi i64 [ %0, %for.body.preheader ], [ %indvars.iv.next, %for.body ] 247a8402682SLiqin.Weng %i.0.in8 = phi i32 [ %n, %for.body.preheader ], [ %i.0, %for.body ] 248a8402682SLiqin.Weng %i.0 = add nsw i32 %i.0.in8, -1 249a8402682SLiqin.Weng %idxprom = zext i32 %i.0 to i64 250a8402682SLiqin.Weng %arrayidx = getelementptr inbounds i32, ptr %B, i64 %idxprom 251a8402682SLiqin.Weng %1 = load i32, ptr %arrayidx, align 4 252a8402682SLiqin.Weng %add9 = add i32 %1, 1 253a8402682SLiqin.Weng %arrayidx3 = getelementptr inbounds i32, ptr %A, i64 %idxprom 254a8402682SLiqin.Weng store i32 %add9, ptr %arrayidx3, align 4 255a8402682SLiqin.Weng %cmp = icmp ugt i64 %indvars.iv, 1 256a8402682SLiqin.Weng %indvars.iv.next = add nsw i64 %indvars.iv, -1 257a8402682SLiqin.Weng br i1 %cmp, label %for.body, label %for.cond.cleanup, !llvm.loop !0 258a8402682SLiqin.Weng} 259a8402682SLiqin.Weng 260a8402682SLiqin.Wengdefine void @vector_reverse_f32(ptr nocapture noundef writeonly %A, ptr nocapture noundef readonly %B, i32 noundef signext %n) { 2616071de3dSPhilip Reames; CHECK-LABEL: 'vector_reverse_f32' 2626071de3dSPhilip Reames; CHECK-NEXT: LV: Loop hints: force=enabled width=vscale x 4 interleave=0 2636071de3dSPhilip Reames; CHECK-NEXT: LV: Found a loop: for.body 2646071de3dSPhilip Reames; CHECK-NEXT: LV: Found an induction variable. 2656071de3dSPhilip Reames; CHECK-NEXT: LV: Found an induction variable. 2666071de3dSPhilip Reames; CHECK-NEXT: LV: Found FP op with unsafe algebra. 2676071de3dSPhilip Reames; CHECK-NEXT: LV: Did not find one integer induction var. 2686071de3dSPhilip Reames; CHECK-NEXT: LV: We can vectorize this loop (with a runtime bound check)! 269b72689a5SFlorian Hahn; CHECK-NEXT: LV: Loop does not require scalar epilogue 2706071de3dSPhilip Reames; CHECK-NEXT: LV: Found trip count: 0 27172f339deSDavid Sherwood; CHECK-NEXT: LV: Found maximum trip count: 4294967295 2726071de3dSPhilip Reames; CHECK-NEXT: LV: Scalable vectorization is available 2736071de3dSPhilip Reames; CHECK-NEXT: LV: The max safe fixed VF is: 67108864. 2746071de3dSPhilip Reames; CHECK-NEXT: LV: The max safe scalable VF is: vscale x 4294967295. 2756071de3dSPhilip Reames; CHECK-NEXT: LV: Found uniform instruction: %cmp = icmp ugt i64 %indvars.iv, 1 2766071de3dSPhilip Reames; CHECK-NEXT: LV: Found uniform instruction: %arrayidx = getelementptr inbounds float, ptr %B, i64 %idxprom 2776071de3dSPhilip Reames; CHECK-NEXT: LV: Found uniform instruction: %arrayidx3 = getelementptr inbounds float, ptr %A, i64 %idxprom 2786071de3dSPhilip Reames; CHECK-NEXT: LV: Found uniform instruction: %idxprom = zext i32 %i.0 to i64 2796071de3dSPhilip Reames; CHECK-NEXT: LV: Found uniform instruction: %idxprom = zext i32 %i.0 to i64 2806071de3dSPhilip Reames; CHECK-NEXT: LV: Found uniform instruction: %indvars.iv = phi i64 [ %0, %for.body.preheader ], [ %indvars.iv.next, %for.body ] 2816071de3dSPhilip Reames; CHECK-NEXT: LV: Found uniform instruction: %indvars.iv.next = add nsw i64 %indvars.iv, -1 2826071de3dSPhilip Reames; CHECK-NEXT: LV: Found uniform instruction: %i.0.in8 = phi i32 [ %n, %for.body.preheader ], [ %i.0, %for.body ] 2836071de3dSPhilip Reames; CHECK-NEXT: LV: Found uniform instruction: %i.0 = add nsw i32 %i.0.in8, -1 2840a5d52a7SSergey Kachkov; CHECK-NEXT: LV: Found an estimated cost of 0 for VF vscale x 4 For instruction: %indvars.iv = phi i64 [ %0, %for.body.preheader ], [ %indvars.iv.next, %for.body ] 2850a5d52a7SSergey Kachkov; CHECK-NEXT: LV: Found an estimated cost of 0 for VF vscale x 4 For instruction: %i.0.in8 = phi i32 [ %n, %for.body.preheader ], [ %i.0, %for.body ] 2866071de3dSPhilip Reames; CHECK-NEXT: LV: Found an estimated cost of 1 for VF vscale x 4 For instruction: %i.0 = add nsw i32 %i.0.in8, -1 2876071de3dSPhilip Reames; CHECK-NEXT: LV: Found an estimated cost of 1 for VF vscale x 4 For instruction: %idxprom = zext i32 %i.0 to i64 2886071de3dSPhilip Reames; CHECK-NEXT: LV: Found an estimated cost of 0 for VF vscale x 4 For instruction: %arrayidx = getelementptr inbounds float, ptr %B, i64 %idxprom 2896ee9c8afSShih-Po Hung; CHECK-NEXT: LV: Found an estimated cost of 13 for VF vscale x 4 For instruction: %1 = load float, ptr %arrayidx, align 4 29058854facSLuke Lau; CHECK-NEXT: LV: Found an estimated cost of 4 for VF vscale x 4 For instruction: %conv1 = fadd float %1, 1.000000e+00 2916071de3dSPhilip Reames; CHECK-NEXT: LV: Found an estimated cost of 0 for VF vscale x 4 For instruction: %arrayidx3 = getelementptr inbounds float, ptr %A, i64 %idxprom 2926ee9c8afSShih-Po Hung; CHECK-NEXT: LV: Found an estimated cost of 13 for VF vscale x 4 For instruction: store float %conv1, ptr %arrayidx3, align 4 2936071de3dSPhilip Reames; CHECK-NEXT: LV: Found an estimated cost of 1 for VF vscale x 4 For instruction: %cmp = icmp ugt i64 %indvars.iv, 1 2946071de3dSPhilip Reames; CHECK-NEXT: LV: Found an estimated cost of 1 for VF vscale x 4 For instruction: %indvars.iv.next = add nsw i64 %indvars.iv, -1 2950a5d52a7SSergey Kachkov; CHECK-NEXT: LV: Found an estimated cost of 0 for VF vscale x 4 For instruction: br i1 %cmp, label %for.body, label %for.cond.cleanup.loopexit, !llvm.loop !0 2960e29a80fSPhilip Reames; CHECK-NEXT: LV: Using user VF vscale x 4. 29799d6c6d9SFlorian Hahn; CHECK-NEXT: LV: Loop does not require scalar epilogue 2986071de3dSPhilip Reames; CHECK-NEXT: LV: Scalarizing: %i.0 = add nsw i32 %i.0.in8, -1 2996071de3dSPhilip Reames; CHECK-NEXT: LV: Scalarizing: %idxprom = zext i32 %i.0 to i64 3006071de3dSPhilip Reames; CHECK-NEXT: LV: Scalarizing: %arrayidx = getelementptr inbounds float, ptr %B, i64 %idxprom 3016071de3dSPhilip Reames; CHECK-NEXT: LV: Scalarizing: %arrayidx3 = getelementptr inbounds float, ptr %A, i64 %idxprom 30212f9c7b2SFlorian Hahn; CHECK-NEXT: LV: Scalarizing: %cmp = icmp ugt i64 %indvars.iv, 1 30312f9c7b2SFlorian Hahn; CHECK-NEXT: LV: Scalarizing: %indvars.iv.next = add nsw i64 %indvars.iv, -1 3040e29a80fSPhilip Reames; CHECK-NEXT: VPlan 'Initial VPlan for VF={vscale x 4},UF>=1' { 305266ff98cSShih-Po Hung; CHECK-NEXT: Live-in vp<[[VF:%.+]]> = VF 30626fca725SShih-Po Hung; CHECK-NEXT: Live-in vp<[[VFxUF:%.+]]> = VF * UF 30726fca725SShih-Po Hung; CHECK-NEXT: Live-in vp<[[VEC_TC:%.+]]> = vector-trip-count 30826fca725SShih-Po Hung; CHECK-NEXT: vp<[[TC:%.+]]> = original trip-count 30958854facSLuke Lau; CHECK-EMPTY: 31058854facSLuke Lau; CHECK-NEXT: ir-bb<for.body.preheader>: 311f0c5caa8SFlorian Hahn; CHECK-NEXT: IR %0 = zext i32 %n to i64 31226fca725SShih-Po Hung; CHECK-NEXT: EMIT vp<[[TC]]> = EXPAND SCEV (zext i32 %n to i64) 3136c8f41d3SFlorian Hahn; CHECK-NEXT: Successor(s): vector.ph 31458854facSLuke Lau; CHECK-EMPTY: 31558854facSLuke Lau; CHECK-NEXT: vector.ph: 316*7f3428d3SFlorian Hahn; CHECK-NEXT: vp<[[END1:%.+]]> = DERIVED-IV ir<%0> + vp<[[VEC_TC]]> * ir<-1> 317*7f3428d3SFlorian Hahn; CHECK-NEXT: vp<[[END2:%.+]]> = DERIVED-IV ir<%n> + vp<[[VEC_TC]]> * ir<-1> 3186071de3dSPhilip Reames; CHECK-NEXT: Successor(s): vector loop 31958854facSLuke Lau; CHECK-EMPTY: 32058854facSLuke Lau; CHECK-NEXT: <x1> vector loop: { 3216071de3dSPhilip Reames; CHECK-NEXT: vector.body: 32226fca725SShih-Po Hung; CHECK-NEXT: EMIT vp<[[CAN_IV:%.+]]> = CANONICAL-INDUCTION 32326fca725SShih-Po Hung; CHECK-NEXT: vp<[[DEV_IV:%.+]]> = DERIVED-IV ir<%n> + vp<[[CAN_IV]]> * ir<-1> 32426fca725SShih-Po Hung; CHECK-NEXT: vp<[[STEPS:%.+]]> = SCALAR-STEPS vp<[[DEV_IV]]>, ir<-1> 32526fca725SShih-Po Hung; CHECK-NEXT: CLONE ir<%i.0> = add nsw vp<[[STEPS]]>, ir<-1> 3266071de3dSPhilip Reames; CHECK-NEXT: CLONE ir<%idxprom> = zext ir<%i.0> 327299f0ff6SFlorian Hahn; CHECK-NEXT: CLONE ir<%arrayidx> = getelementptr inbounds ir<%B>, ir<%idxprom> 328266ff98cSShih-Po Hung; CHECK-NEXT: vp<[[VEC_PTR:%.+]]> = reverse-vector-pointer inbounds ir<%arrayidx>, vp<[[VF]]> 32926fca725SShih-Po Hung; CHECK-NEXT: WIDEN ir<%1> = load vp<[[VEC_PTR]]> 3306071de3dSPhilip Reames; CHECK-NEXT: WIDEN ir<%conv1> = fadd ir<%1>, ir<1.000000e+00> 331299f0ff6SFlorian Hahn; CHECK-NEXT: CLONE ir<%arrayidx3> = getelementptr inbounds ir<%A>, ir<%idxprom> 332266ff98cSShih-Po Hung; CHECK-NEXT: vp<[[VEC_PTR2:%.+]]> = reverse-vector-pointer inbounds ir<%arrayidx3>, vp<[[VF]]> 33326fca725SShih-Po Hung; CHECK-NEXT: WIDEN store vp<[[VEC_PTR2]]>, ir<%conv1> 33426fca725SShih-Po Hung; CHECK-NEXT: EMIT vp<[[CAN_IV_NEXT:%.+]]> = add nuw vp<[[CAN_IV]]>, vp<[[VFxUF]]> 33526fca725SShih-Po Hung; CHECK-NEXT: EMIT branch-on-count vp<[[CAN_IV_NEXT]]>, vp<[[VEC_TC]]> 3366071de3dSPhilip Reames; CHECK-NEXT: No successors 3376071de3dSPhilip Reames; CHECK-NEXT: } 3386071de3dSPhilip Reames; CHECK-NEXT: Successor(s): middle.block 33999d6c6d9SFlorian Hahn; CHECK-EMPTY: 34058854facSLuke Lau; CHECK-NEXT: middle.block: 34126fca725SShih-Po Hung; CHECK-NEXT: EMIT vp<[[CMP:%.+]]> = icmp eq vp<[[TC]]>, vp<[[VEC_TC]]> 34226fca725SShih-Po Hung; CHECK-NEXT: EMIT branch-on-cond vp<[[CMP]]> 34399d6c6d9SFlorian Hahn; CHECK-NEXT: Successor(s): ir-bb<for.cond.cleanup.loopexit>, scalar.ph 34499d6c6d9SFlorian Hahn; CHECK-EMPTY: 34599d6c6d9SFlorian Hahn; CHECK-NEXT: scalar.ph: 346*7f3428d3SFlorian Hahn; CHECK-NEXT: EMIT vp<[[RESUME1:%.+]]> = resume-phi vp<[[END1]]>, ir<%0> 347*7f3428d3SFlorian Hahn; CHECK-NEXT: EMIT vp<[[RESUME2:%.+]]>.1 = resume-phi vp<[[END2]]>, ir<%n> 348b021464dSFlorian Hahn; CHECK-NEXT: Successor(s): ir-bb<for.body> 349b021464dSFlorian Hahn; CHECK-EMPTY: 350b021464dSFlorian Hahn; CHECK-NEXT: ir-bb<for.body>: 351*7f3428d3SFlorian Hahn; CHECK-NEXT: IR %indvars.iv = phi i64 [ %0, %for.body.preheader ], [ %indvars.iv.next, %for.body ] (extra operand: vp<[[RESUME1]]> from scalar.ph) 352*7f3428d3SFlorian Hahn; CHECK-NEXT: IR %i.0.in8 = phi i32 [ %n, %for.body.preheader ], [ %i.0, %for.body ] (extra operand: vp<[[RESUME2]]>.1 from scalar.ph) 353b021464dSFlorian Hahn; CHECK: IR %indvars.iv.next = add nsw i64 %indvars.iv, -1 3546071de3dSPhilip Reames; CHECK-NEXT: No successors 3556797b0f0SFlorian Hahn; CHECK-EMPTY: 3566797b0f0SFlorian Hahn; CHECK-NEXT: ir-bb<for.cond.cleanup.loopexit>: 3576797b0f0SFlorian Hahn; CHECK-NEXT: No successors 3586071de3dSPhilip Reames; CHECK-NEXT: } 3590a5d52a7SSergey Kachkov; CHECK-NEXT: LV: Found an estimated cost of 0 for VF vscale x 4 For instruction: %indvars.iv = phi i64 [ %0, %for.body.preheader ], [ %indvars.iv.next, %for.body ] 3600a5d52a7SSergey Kachkov; CHECK-NEXT: LV: Found an estimated cost of 0 for VF vscale x 4 For instruction: %i.0.in8 = phi i32 [ %n, %for.body.preheader ], [ %i.0, %for.body ] 3616071de3dSPhilip Reames; CHECK-NEXT: LV: Found an estimated cost of 1 for VF vscale x 4 For instruction: %i.0 = add nsw i32 %i.0.in8, -1 3626071de3dSPhilip Reames; CHECK-NEXT: LV: Found an estimated cost of 1 for VF vscale x 4 For instruction: %idxprom = zext i32 %i.0 to i64 3636071de3dSPhilip Reames; CHECK-NEXT: LV: Found an estimated cost of 0 for VF vscale x 4 For instruction: %arrayidx = getelementptr inbounds float, ptr %B, i64 %idxprom 3646ee9c8afSShih-Po Hung; CHECK-NEXT: LV: Found an estimated cost of 13 for VF vscale x 4 For instruction: %1 = load float, ptr %arrayidx, align 4 36558854facSLuke Lau; CHECK-NEXT: LV: Found an estimated cost of 4 for VF vscale x 4 For instruction: %conv1 = fadd float %1, 1.000000e+00 3666071de3dSPhilip Reames; CHECK-NEXT: LV: Found an estimated cost of 0 for VF vscale x 4 For instruction: %arrayidx3 = getelementptr inbounds float, ptr %A, i64 %idxprom 3676ee9c8afSShih-Po Hung; CHECK-NEXT: LV: Found an estimated cost of 13 for VF vscale x 4 For instruction: store float %conv1, ptr %arrayidx3, align 4 3686071de3dSPhilip Reames; CHECK-NEXT: LV: Found an estimated cost of 1 for VF vscale x 4 For instruction: %cmp = icmp ugt i64 %indvars.iv, 1 3696071de3dSPhilip Reames; CHECK-NEXT: LV: Found an estimated cost of 1 for VF vscale x 4 For instruction: %indvars.iv.next = add nsw i64 %indvars.iv, -1 3700a5d52a7SSergey Kachkov; CHECK-NEXT: LV: Found an estimated cost of 0 for VF vscale x 4 For instruction: br i1 %cmp, label %for.body, label %for.cond.cleanup.loopexit, !llvm.loop !0 3716071de3dSPhilip Reames; CHECK-NEXT: LV(REG): Calculating max register usage: 3726071de3dSPhilip Reames; CHECK-NEXT: LV(REG): At #0 Interval # 0 3736071de3dSPhilip Reames; CHECK-NEXT: LV(REG): At #1 Interval # 1 3746071de3dSPhilip Reames; CHECK-NEXT: LV(REG): At #2 Interval # 2 3756071de3dSPhilip Reames; CHECK-NEXT: LV(REG): At #3 Interval # 2 3766071de3dSPhilip Reames; CHECK-NEXT: LV(REG): At #4 Interval # 2 3776071de3dSPhilip Reames; CHECK-NEXT: LV(REG): At #5 Interval # 3 3786071de3dSPhilip Reames; CHECK-NEXT: LV(REG): At #6 Interval # 3 3796071de3dSPhilip Reames; CHECK-NEXT: LV(REG): At #7 Interval # 3 3806071de3dSPhilip Reames; CHECK-NEXT: LV(REG): At #9 Interval # 1 3816071de3dSPhilip Reames; CHECK-NEXT: LV(REG): At #10 Interval # 2 3820e29a80fSPhilip Reames; CHECK-NEXT: LV(REG): VF = vscale x 4 3836071de3dSPhilip Reames; CHECK-NEXT: LV(REG): Found max usage: 2 item 3846071de3dSPhilip Reames; CHECK-NEXT: LV(REG): RegisterClass: RISCV::GPRRC, 3 registers 3856071de3dSPhilip Reames; CHECK-NEXT: LV(REG): RegisterClass: RISCV::VRRC, 2 registers 3860e29a80fSPhilip Reames; CHECK-NEXT: LV(REG): Found invariant usage: 1 item 3874f9a5447Ssgokhale; CHECK-NEXT: LV(REG): RegisterClass: RISCV::GPRRC, 1 registers 3886071de3dSPhilip Reames; CHECK-NEXT: LV: The target has 31 registers of RISCV::GPRRC register class 3896071de3dSPhilip Reames; CHECK-NEXT: LV: The target has 32 registers of RISCV::VRRC register class 39049e5cd2aSKolya Panchenko; CHECK-NEXT: LV: Loop does not require scalar epilogue 39158854facSLuke Lau; CHECK-NEXT: LV: Loop cost is 34 39215f9cf16SLuke Lau; CHECK-NEXT: LV: IC is 1 3930e29a80fSPhilip Reames; CHECK-NEXT: LV: VF is vscale x 4 3946071de3dSPhilip Reames; CHECK-NEXT: LV: Not Interleaving. 3956071de3dSPhilip Reames; CHECK-NEXT: LV: Interleaving is not beneficial. 3960e29a80fSPhilip Reames; CHECK-NEXT: LV: Found a vectorizable loop (vscale x 4) in <stdin> 39767a55e01SFlorian Hahn; CHECK-NEXT: LEV: Epilogue vectorization is not profitable for this loop 398156da986SFlorian Hahn; CHECK: Executing best plan with VF=vscale x 4, UF=1 3998ec40675SFlorian Hahn; CHECK-NEXT: VPlan 'Final VPlan for VF={vscale x 4},UF={1}' { 400156da986SFlorian Hahn; CHECK-NEXT: Live-in ir<[[VF:%.+]]> = VF 401156da986SFlorian Hahn; CHECK-NEXT: Live-in ir<[[VFxUF:%.+]]>.1 = VF * UF 402156da986SFlorian Hahn; CHECK-NEXT: Live-in ir<[[VEC_TC:%.+]]> = vector-trip-count 40326fca725SShih-Po Hung; CHECK-NEXT: vp<[[TC:%.+]]> = original trip-count 40458854facSLuke Lau; CHECK-EMPTY: 40558854facSLuke Lau; CHECK-NEXT: ir-bb<for.body.preheader>: 406f0c5caa8SFlorian Hahn; CHECK-NEXT: IR %0 = zext i32 %n to i64 40726fca725SShih-Po Hung; CHECK-NEXT: EMIT vp<[[TC]]> = EXPAND SCEV (zext i32 %n to i64) 4086c8f41d3SFlorian Hahn; CHECK-NEXT: Successor(s): ir-bb<scalar.ph>, ir-bb<vector.scevcheck> 40958854facSLuke Lau; CHECK-EMPTY: 4106c8f41d3SFlorian Hahn; CHECK-NEXT: ir-bb<vector.scevcheck>: 4116c8f41d3SFlorian Hahn; CHECK-NEXT: IR %3 = add nsw i64 %0, -1 4126c8f41d3SFlorian Hahn; CHECK-NEXT: IR %4 = add i32 %n, -1 4136c8f41d3SFlorian Hahn; CHECK-NEXT: IR %5 = trunc i64 %3 to i32 4146c8f41d3SFlorian Hahn; CHECK-NEXT: IR %mul = call { i32, i1 } @llvm.umul.with.overflow.i32(i32 1, i32 %5) 4156c8f41d3SFlorian Hahn; CHECK-NEXT: IR %mul.result = extractvalue { i32, i1 } %mul, 0 4166c8f41d3SFlorian Hahn; CHECK-NEXT: IR %mul.overflow = extractvalue { i32, i1 } %mul, 1 4176c8f41d3SFlorian Hahn; CHECK-NEXT: IR %6 = sub i32 %4, %mul.result 4186c8f41d3SFlorian Hahn; CHECK-NEXT: IR %7 = icmp ugt i32 %6, %4 4196c8f41d3SFlorian Hahn; CHECK-NEXT: IR %8 = or i1 %7, %mul.overflow 4206c8f41d3SFlorian Hahn; CHECK-NEXT: IR %9 = icmp ugt i64 %3, 4294967295 4216c8f41d3SFlorian Hahn; CHECK-NEXT: IR %10 = or i1 %8, %9 4226c8f41d3SFlorian Hahn; CHECK-NEXT: Successor(s): ir-bb<scalar.ph>, ir-bb<vector.memcheck> 4236c8f41d3SFlorian Hahn; CHECK-EMPTY: 4246c8f41d3SFlorian Hahn; CHECK-NEXT: ir-bb<vector.memcheck>: 4256c8f41d3SFlorian Hahn; CHECK-NEXT: IR %11 = call i64 @llvm.vscale.i64() 4266c8f41d3SFlorian Hahn; CHECK-NEXT: IR %12 = mul i64 %11, 4 4276c8f41d3SFlorian Hahn; CHECK-NEXT: IR %13 = mul i64 %12, 4 4286c8f41d3SFlorian Hahn; CHECK-NEXT: IR %14 = sub i64 %B1, %A2 4296c8f41d3SFlorian Hahn; CHECK-NEXT: IR %diff.check = icmp ult i64 %14, %13 4306c8f41d3SFlorian Hahn; CHECK-NEXT: Successor(s): ir-bb<scalar.ph>, ir-bb<vector.ph> 4316c8f41d3SFlorian Hahn; CHECK-EMPTY: 4326c8f41d3SFlorian Hahn; CHECK-NEXT: ir-bb<vector.ph>: 4336c8f41d3SFlorian Hahn; CHECK-NEXT: IR %15 = call i64 @llvm.vscale.i64() 4346c8f41d3SFlorian Hahn; CHECK-NEXT: IR %16 = mul i64 %15, 4 4356c8f41d3SFlorian Hahn; CHECK-NEXT: IR %n.mod.vf = urem i64 %0, %16 4366c8f41d3SFlorian Hahn; CHECK-NEXT: IR %n.vec = sub i64 %0, %n.mod.vf 4376c8f41d3SFlorian Hahn; CHECK-NEXT: IR %17 = call i64 @llvm.vscale.i64() 4386c8f41d3SFlorian Hahn; CHECK-NEXT: IR %18 = mul i64 %17, 4 439*7f3428d3SFlorian Hahn; CHECK-NEXT: vp<[[END1:%.+]]> = DERIVED-IV ir<%0> + ir<[[VEC_TC]]> * ir<-1> 440*7f3428d3SFlorian Hahn; CHECK-NEXT: vp<[[END2:%.+]]> = DERIVED-IV ir<%n> + ir<[[VEC_TC]]> * ir<-1> 44158854facSLuke Lau; CHECK-NEXT: Successor(s): vector loop 44258854facSLuke Lau; CHECK-EMPTY: 44358854facSLuke Lau; CHECK-NEXT: <x1> vector loop: { 44458854facSLuke Lau; CHECK-NEXT: vector.body: 445156da986SFlorian Hahn; CHECK-NEXT: SCALAR-PHI vp<[[CAN_IV:%.+]]> = phi ir<0>, vp<[[CAN_IV_NEXT:%.+]]> 44626fca725SShih-Po Hung; CHECK-NEXT: vp<[[DEV_IV:%.+]]> = DERIVED-IV ir<%n> + vp<[[CAN_IV]]> * ir<-1> 44726fca725SShih-Po Hung; CHECK-NEXT: vp<[[STEPS:%.+]]> = SCALAR-STEPS vp<[[DEV_IV]]>, ir<-1> 44826fca725SShih-Po Hung; CHECK-NEXT: CLONE ir<%i.0> = add nsw vp<[[STEPS]]>, ir<-1> 44958854facSLuke Lau; CHECK-NEXT: CLONE ir<%idxprom> = zext ir<%i.0> 45058854facSLuke Lau; CHECK-NEXT: CLONE ir<%arrayidx> = getelementptr inbounds ir<%B>, ir<%idxprom> 451156da986SFlorian Hahn; CHECK-NEXT: vp<[[VEC_PTR:%.+]]> = reverse-vector-pointer inbounds ir<%arrayidx>, ir<[[VF]]> 452156da986SFlorian Hahn; CHECK-NEXT: WIDEN ir<[[L:%.+]]> = load vp<[[VEC_PTR]]> 453156da986SFlorian Hahn; CHECK-NEXT: WIDEN ir<%conv1> = fadd ir<[[L]]>, ir<1.000000e+00> 45458854facSLuke Lau; CHECK-NEXT: CLONE ir<%arrayidx3> = getelementptr inbounds ir<%A>, ir<%idxprom> 455156da986SFlorian Hahn; CHECK-NEXT: vp<[[VEC_PTR:%.+]]> = reverse-vector-pointer inbounds ir<%arrayidx3>, ir<[[VF]]> 45626fca725SShih-Po Hung; CHECK-NEXT: WIDEN store vp<[[VEC_PTR]]>, ir<%conv1> 457156da986SFlorian Hahn; CHECK-NEXT: EMIT vp<[[CAN_IV_NEXT]]> = add nuw vp<[[CAN_IV]]>, ir<[[VFxUF]]>.1 458156da986SFlorian Hahn; CHECK-NEXT: EMIT branch-on-count vp<[[CAN_IV_NEXT]]>, ir<[[VEC_TC]]> 45958854facSLuke Lau; CHECK-NEXT: No successors 46058854facSLuke Lau; CHECK-NEXT: } 461156da986SFlorian Hahn; CHECK-NEXT: Successor(s): ir-bb<middle.block> 46258854facSLuke Lau; CHECK-EMPTY: 463156da986SFlorian Hahn; CHECK-NEXT: ir-bb<middle.block>: 464156da986SFlorian Hahn; CHECK-NEXT: EMIT vp<[[CMP:%.+]]> = icmp eq vp<[[TC]]>, ir<[[VEC_TC]]> 46526fca725SShih-Po Hung; CHECK-NEXT: EMIT branch-on-cond vp<[[CMP]]> 466156da986SFlorian Hahn; CHECK-NEXT: Successor(s): ir-bb<for.cond.cleanup.loopexit>, ir-bb<scalar.ph> 46758854facSLuke Lau; CHECK-EMPTY: 4686c8f41d3SFlorian Hahn; CHECK-NEXT: ir-bb<for.cond.cleanup.loopexit>: 4696c8f41d3SFlorian Hahn; CHECK-NEXT: No successors 4706c8f41d3SFlorian Hahn; CHECK-EMPTY: 471156da986SFlorian Hahn; CHECK-NEXT: ir-bb<scalar.ph>: 472*7f3428d3SFlorian Hahn; CHECK-NEXT: EMIT vp<[[RESUME1:%.+]]> = resume-phi vp<[[END1]]>, ir<%0> 473*7f3428d3SFlorian Hahn; CHECK-NEXT: EMIT vp<[[RESUME2:%.+]]>.1 = resume-phi vp<[[END2]]>, ir<%n> 474b021464dSFlorian Hahn; CHECK-NEXT: Successor(s): ir-bb<for.body> 475b021464dSFlorian Hahn; CHECK-EMPTY: 476b021464dSFlorian Hahn; CHECK-NEXT: ir-bb<for.body>: 4776c8f41d3SFlorian Hahn; CHECK-NEXT: IR %indvars.iv = phi i64 [ %0, %scalar.ph ], [ %indvars.iv.next, %for.body ] (extra operand: vp<[[RESUME1]]> from ir-bb<scalar.ph>) 4786c8f41d3SFlorian Hahn; CHECK-NEXT: IR %i.0.in8 = phi i32 [ %n, %scalar.ph ], [ %i.0, %for.body ] (extra operand: vp<[[RESUME2]]>.1 from ir-bb<scalar.ph>) 479b021464dSFlorian Hahn; CHECK: IR %indvars.iv.next = add nsw i64 %indvars.iv, -1 48058854facSLuke Lau; CHECK-NEXT: No successors 48158854facSLuke Lau; CHECK-NEXT: } 4826071de3dSPhilip Reames; 483a8402682SLiqin.Wengentry: 484a8402682SLiqin.Weng %cmp7 = icmp sgt i32 %n, 0 485a8402682SLiqin.Weng br i1 %cmp7, label %for.body.preheader, label %for.cond.cleanup 486a8402682SLiqin.Weng 487a8402682SLiqin.Wengfor.body.preheader: ; preds = %entry 488a8402682SLiqin.Weng %0 = zext i32 %n to i64 489a8402682SLiqin.Weng br label %for.body 490a8402682SLiqin.Weng 491a8402682SLiqin.Wengfor.cond.cleanup: ; preds = %for.body, %entry 492a8402682SLiqin.Weng ret void 493a8402682SLiqin.Weng 494a8402682SLiqin.Wengfor.body: ; preds = %for.body.preheader, %for.body 495a8402682SLiqin.Weng %indvars.iv = phi i64 [ %0, %for.body.preheader ], [ %indvars.iv.next, %for.body ] 496a8402682SLiqin.Weng %i.0.in8 = phi i32 [ %n, %for.body.preheader ], [ %i.0, %for.body ] 497a8402682SLiqin.Weng %i.0 = add nsw i32 %i.0.in8, -1 498a8402682SLiqin.Weng %idxprom = zext i32 %i.0 to i64 499a8402682SLiqin.Weng %arrayidx = getelementptr inbounds float, ptr %B, i64 %idxprom 500a8402682SLiqin.Weng %1 = load float, ptr %arrayidx, align 4 501a8402682SLiqin.Weng %conv1 = fadd float %1, 1.000000e+00 502a8402682SLiqin.Weng %arrayidx3 = getelementptr inbounds float, ptr %A, i64 %idxprom 503a8402682SLiqin.Weng store float %conv1, ptr %arrayidx3, align 4 504a8402682SLiqin.Weng %cmp = icmp ugt i64 %indvars.iv, 1 505a8402682SLiqin.Weng %indvars.iv.next = add nsw i64 %indvars.iv, -1 506a8402682SLiqin.Weng br i1 %cmp, label %for.body, label %for.cond.cleanup, !llvm.loop !0 507a8402682SLiqin.Weng} 508a8402682SLiqin.Weng 509a8402682SLiqin.Weng!0 = distinct !{!0, !1, !2, !3, !4} 510a8402682SLiqin.Weng!1 = !{!"llvm.loop.mustprogress"} 511a8402682SLiqin.Weng!2 = !{!"llvm.loop.vectorize.width", i32 4} 512a8402682SLiqin.Weng!3 = !{!"llvm.loop.vectorize.scalable.enable", i1 true} 513a8402682SLiqin.Weng!4 = !{!"llvm.loop.vectorize.enable", i1 true} 514