xref: /llvm-project/llvm/test/Transforms/LoopVectorize/RISCV/riscv-vector-reverse.ll (revision 2c87133c6212d4bd02b5e64adbb51f4e66bc2351)
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