1; NOTE: Assertions have been autogenerated by utils/update_analyze_test_checks.py 2; This is the loop in c++ being vectorize in this file with 3;experimental.vector.reverse 4; #pragma clang loop vectorize_width(4, scalable) 5; for (int i = N-1; i >= 0; --i) 6; a[i] = b[i] + 1.0; 7 8; REQUIRES: asserts 9; RUN: opt -loop-vectorize -dce -instcombine -mtriple riscv64-linux-gnu \ 10; RUN: -mattr=+v -debug-only=loop-vectorize -scalable-vectorization=on \ 11; RUN: -riscv-v-vector-bits-min=128 -disable-output < %s 2>&1 | FileCheck %s 12 13define void @vector_reverse_i64(ptr nocapture noundef writeonly %A, ptr nocapture noundef readonly %B, i32 noundef signext %n) { 14; CHECK-LABEL: 'vector_reverse_i64' 15; CHECK-NEXT: LV: Loop hints: force=enabled width=vscale x 4 interleave=0 16; CHECK-NEXT: LV: Found a loop: for.body 17; CHECK-NEXT: LV: Found an induction variable. 18; CHECK-NEXT: LV: Found an induction variable. 19; CHECK-NEXT: LV: Did not find one integer induction var. 20; CHECK-NEXT: LV: We can vectorize this loop (with a runtime bound check)! 21; CHECK-NEXT: LV: Found trip count: 0 22; CHECK-NEXT: LV: Scalable vectorization is available 23; CHECK-NEXT: LV: The max safe fixed VF is: 67108864. 24; CHECK-NEXT: LV: The max safe scalable VF is: vscale x 4294967295. 25; CHECK-NEXT: LV: Found uniform instruction: %cmp = icmp ugt i64 %indvars.iv, 1 26; CHECK-NEXT: LV: Found uniform instruction: %arrayidx = getelementptr inbounds i32, ptr %B, i64 %idxprom 27; CHECK-NEXT: LV: Found uniform instruction: %arrayidx3 = getelementptr inbounds i32, ptr %A, i64 %idxprom 28; CHECK-NEXT: LV: Found uniform instruction: %idxprom = zext i32 %i.0 to i64 29; CHECK-NEXT: LV: Found uniform instruction: %idxprom = zext i32 %i.0 to i64 30; CHECK-NEXT: LV: Found uniform instruction: %indvars.iv = phi i64 [ %0, %for.body.preheader ], [ %indvars.iv.next, %for.body ] 31; CHECK-NEXT: LV: Found uniform instruction: %indvars.iv.next = add nsw i64 %indvars.iv, -1 32; CHECK-NEXT: LV: Found uniform instruction: %i.0.in8 = phi i32 [ %n, %for.body.preheader ], [ %i.0, %for.body ] 33; CHECK-NEXT: LV: Found uniform instruction: %i.0 = add nsw i32 %i.0.in8, -1 34; CHECK-NEXT: LV: Found an estimated cost of 1 for VF vscale x 4 For instruction: %indvars.iv = phi i64 [ %0, %for.body.preheader ], [ %indvars.iv.next, %for.body ] 35; CHECK-NEXT: LV: Found an estimated cost of 1 for VF vscale x 4 For instruction: %i.0.in8 = phi i32 [ %n, %for.body.preheader ], [ %i.0, %for.body ] 36; 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 37; CHECK-NEXT: LV: Found an estimated cost of 1 for VF vscale x 4 For instruction: %idxprom = zext i32 %i.0 to i64 38; CHECK-NEXT: LV: Found an estimated cost of 0 for VF vscale x 4 For instruction: %arrayidx = getelementptr inbounds i32, ptr %B, i64 %idxprom 39; CHECK-NEXT: LV: Found an estimated cost of 7 for VF vscale x 4 For instruction: %1 = load i32, ptr %arrayidx, align 4 40; CHECK-NEXT: LV: Found an estimated cost of 1 for VF vscale x 4 For instruction: %add9 = add i32 %1, 1 41; CHECK-NEXT: LV: Found an estimated cost of 0 for VF vscale x 4 For instruction: %arrayidx3 = getelementptr inbounds i32, ptr %A, i64 %idxprom 42; CHECK-NEXT: LV: Found an estimated cost of 7 for VF vscale x 4 For instruction: store i32 %add9, ptr %arrayidx3, align 4 43; CHECK-NEXT: LV: Found an estimated cost of 1 for VF vscale x 4 For instruction: %cmp = icmp ugt i64 %indvars.iv, 1 44; 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 45; CHECK-NEXT: LV: Found an estimated cost of 1 for VF vscale x 4 For instruction: br i1 %cmp, label %for.body, label %for.cond.cleanup.loopexit, !llvm.loop !0 46; CHECK-NEXT: LV: Using user VF vscale x 4. 47; CHECK-NEXT: LV: Scalarizing: %i.0 = add nsw i32 %i.0.in8, -1 48; CHECK-NEXT: LV: Scalarizing: %idxprom = zext i32 %i.0 to i64 49; CHECK-NEXT: LV: Scalarizing: %arrayidx = getelementptr inbounds i32, ptr %B, i64 %idxprom 50; CHECK-NEXT: LV: Scalarizing: %arrayidx3 = getelementptr inbounds i32, ptr %A, i64 %idxprom 51; CHECK-NEXT: LV: Scalarizing: %cmp = icmp ugt i64 %indvars.iv, 1 52; CHECK-NEXT: LV: Scalarizing: %indvars.iv.next = add nsw i64 %indvars.iv, -1 53; CHECK-NEXT: VPlan 'Initial VPlan for VF={vscale x 4},UF>=1' { 54; CHECK-NEXT: Live-in vp<%2> = vector-trip-count 55; CHECK: vector.ph: 56; CHECK-NEXT: Successor(s): vector loop 57; CHECK: <x1> vector loop: { 58; CHECK-NEXT: vector.body: 59; CHECK-NEXT: EMIT vp<%3> = CANONICAL-INDUCTION 60; CHECK-NEXT: vp<%4> = SCALAR-STEPS vp<%3>, ir<%n>, ir<-1> 61; CHECK-NEXT: CLONE ir<%i.0> = add vp<%4>, ir<-1> 62; CHECK-NEXT: CLONE ir<%idxprom> = zext ir<%i.0> 63; CHECK-NEXT: CLONE ir<%arrayidx> = getelementptr ir<%B>, ir<%idxprom> 64; CHECK-NEXT: WIDEN ir<%1> = load ir<%arrayidx> 65; CHECK-NEXT: WIDEN ir<%add9> = add ir<%1>, ir<1> 66; CHECK-NEXT: CLONE ir<%arrayidx3> = getelementptr ir<%A>, ir<%idxprom> 67; CHECK-NEXT: WIDEN store ir<%arrayidx3>, ir<%add9> 68; CHECK-NEXT: EMIT vp<%11> = VF * UF +(nuw) vp<%3> 69; CHECK-NEXT: EMIT branch-on-count vp<%11> vp<%2> 70; CHECK-NEXT: No successors 71; CHECK-NEXT: } 72; CHECK-NEXT: Successor(s): middle.block 73; CHECK: middle.block: 74; CHECK-NEXT: No successors 75; CHECK-NEXT: } 76; CHECK-NEXT: LV: Found an estimated cost of 1 for VF vscale x 4 For instruction: %indvars.iv = phi i64 [ %0, %for.body.preheader ], [ %indvars.iv.next, %for.body ] 77; CHECK-NEXT: LV: Found an estimated cost of 1 for VF vscale x 4 For instruction: %i.0.in8 = phi i32 [ %n, %for.body.preheader ], [ %i.0, %for.body ] 78; 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 79; CHECK-NEXT: LV: Found an estimated cost of 1 for VF vscale x 4 For instruction: %idxprom = zext i32 %i.0 to i64 80; CHECK-NEXT: LV: Found an estimated cost of 0 for VF vscale x 4 For instruction: %arrayidx = getelementptr inbounds i32, ptr %B, i64 %idxprom 81; CHECK-NEXT: LV: Found an estimated cost of 7 for VF vscale x 4 For instruction: %1 = load i32, ptr %arrayidx, align 4 82; CHECK-NEXT: LV: Found an estimated cost of 1 for VF vscale x 4 For instruction: %add9 = add i32 %1, 1 83; CHECK-NEXT: LV: Found an estimated cost of 0 for VF vscale x 4 For instruction: %arrayidx3 = getelementptr inbounds i32, ptr %A, i64 %idxprom 84; CHECK-NEXT: LV: Found an estimated cost of 7 for VF vscale x 4 For instruction: store i32 %add9, ptr %arrayidx3, align 4 85; CHECK-NEXT: LV: Found an estimated cost of 1 for VF vscale x 4 For instruction: %cmp = icmp ugt i64 %indvars.iv, 1 86; 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 87; CHECK-NEXT: LV: Found an estimated cost of 1 for VF vscale x 4 For instruction: br i1 %cmp, label %for.body, label %for.cond.cleanup.loopexit, !llvm.loop !0 88; CHECK-NEXT: LV(REG): Calculating max register usage: 89; CHECK-NEXT: LV(REG): At #0 Interval # 0 90; CHECK-NEXT: LV(REG): At #1 Interval # 1 91; CHECK-NEXT: LV(REG): At #2 Interval # 2 92; CHECK-NEXT: LV(REG): At #3 Interval # 2 93; CHECK-NEXT: LV(REG): At #4 Interval # 2 94; CHECK-NEXT: LV(REG): At #5 Interval # 3 95; CHECK-NEXT: LV(REG): At #6 Interval # 3 96; CHECK-NEXT: LV(REG): At #7 Interval # 3 97; CHECK-NEXT: LV(REG): At #9 Interval # 1 98; CHECK-NEXT: LV(REG): At #10 Interval # 2 99; CHECK-NEXT: LV(REG): VF = vscale x 4 100; CHECK-NEXT: LV(REG): Found max usage: 2 item 101; CHECK-NEXT: LV(REG): RegisterClass: RISCV::GPRRC, 3 registers 102; CHECK-NEXT: LV(REG): RegisterClass: RISCV::VRRC, 2 registers 103; CHECK-NEXT: LV(REG): Found invariant usage: 1 item 104; CHECK-NEXT: LV(REG): RegisterClass: RISCV::VRRC, 4 registers 105; CHECK-NEXT: LV: The target has 31 registers of RISCV::GPRRC register class 106; CHECK-NEXT: LV: The target has 32 registers of RISCV::VRRC register class 107; CHECK-NEXT: LV: Loop cost is 22 108; CHECK-NEXT: LV: IC is 2 109; CHECK-NEXT: LV: VF is vscale x 4 110; CHECK-NEXT: LV: Not Interleaving. 111; CHECK-NEXT: LV: Interleaving is not beneficial. 112; CHECK-NEXT: LV: Found a vectorizable loop (vscale x 4) in <stdin> 113; CHECK-NEXT: LEV: Epilogue vectorization is not profitable for this loop 114; CHECK-NEXT: Executing best plan with VF=vscale x 4, UF=1 115; CHECK-NEXT: LV: Interleaving disabled by the pass manager 116; 117entry: 118 %cmp7 = icmp sgt i32 %n, 0 119 br i1 %cmp7, label %for.body.preheader, label %for.cond.cleanup 120 121for.body.preheader: ; preds = %entry 122 %0 = zext i32 %n to i64 123 br label %for.body 124 125for.cond.cleanup: ; preds = %for.body, %entry 126 ret void 127 128for.body: ; preds = %for.body.preheader, %for.body 129 %indvars.iv = phi i64 [ %0, %for.body.preheader ], [ %indvars.iv.next, %for.body ] 130 %i.0.in8 = phi i32 [ %n, %for.body.preheader ], [ %i.0, %for.body ] 131 %i.0 = add nsw i32 %i.0.in8, -1 132 %idxprom = zext i32 %i.0 to i64 133 %arrayidx = getelementptr inbounds i32, ptr %B, i64 %idxprom 134 %1 = load i32, ptr %arrayidx, align 4 135 %add9 = add i32 %1, 1 136 %arrayidx3 = getelementptr inbounds i32, ptr %A, i64 %idxprom 137 store i32 %add9, ptr %arrayidx3, align 4 138 %cmp = icmp ugt i64 %indvars.iv, 1 139 %indvars.iv.next = add nsw i64 %indvars.iv, -1 140 br i1 %cmp, label %for.body, label %for.cond.cleanup, !llvm.loop !0 141} 142 143define void @vector_reverse_f32(ptr nocapture noundef writeonly %A, ptr nocapture noundef readonly %B, i32 noundef signext %n) { 144; CHECK-LABEL: 'vector_reverse_f32' 145; CHECK-NEXT: LV: Loop hints: force=enabled width=vscale x 4 interleave=0 146; CHECK-NEXT: LV: Found a loop: for.body 147; CHECK-NEXT: LV: Found an induction variable. 148; CHECK-NEXT: LV: Found an induction variable. 149; CHECK-NEXT: LV: Found FP op with unsafe algebra. 150; CHECK-NEXT: LV: Did not find one integer induction var. 151; CHECK-NEXT: LV: We can vectorize this loop (with a runtime bound check)! 152; CHECK-NEXT: LV: Found trip count: 0 153; CHECK-NEXT: LV: Scalable vectorization is available 154; CHECK-NEXT: LV: The max safe fixed VF is: 67108864. 155; CHECK-NEXT: LV: The max safe scalable VF is: vscale x 4294967295. 156; CHECK-NEXT: LV: Found uniform instruction: %cmp = icmp ugt i64 %indvars.iv, 1 157; CHECK-NEXT: LV: Found uniform instruction: %arrayidx = getelementptr inbounds float, ptr %B, i64 %idxprom 158; CHECK-NEXT: LV: Found uniform instruction: %arrayidx3 = getelementptr inbounds float, ptr %A, i64 %idxprom 159; CHECK-NEXT: LV: Found uniform instruction: %idxprom = zext i32 %i.0 to i64 160; CHECK-NEXT: LV: Found uniform instruction: %idxprom = zext i32 %i.0 to i64 161; CHECK-NEXT: LV: Found uniform instruction: %indvars.iv = phi i64 [ %0, %for.body.preheader ], [ %indvars.iv.next, %for.body ] 162; CHECK-NEXT: LV: Found uniform instruction: %indvars.iv.next = add nsw i64 %indvars.iv, -1 163; CHECK-NEXT: LV: Found uniform instruction: %i.0.in8 = phi i32 [ %n, %for.body.preheader ], [ %i.0, %for.body ] 164; CHECK-NEXT: LV: Found uniform instruction: %i.0 = add nsw i32 %i.0.in8, -1 165; CHECK-NEXT: LV: Found an estimated cost of 1 for VF vscale x 4 For instruction: %indvars.iv = phi i64 [ %0, %for.body.preheader ], [ %indvars.iv.next, %for.body ] 166; CHECK-NEXT: LV: Found an estimated cost of 1 for VF vscale x 4 For instruction: %i.0.in8 = phi i32 [ %n, %for.body.preheader ], [ %i.0, %for.body ] 167; 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 168; CHECK-NEXT: LV: Found an estimated cost of 1 for VF vscale x 4 For instruction: %idxprom = zext i32 %i.0 to i64 169; CHECK-NEXT: LV: Found an estimated cost of 0 for VF vscale x 4 For instruction: %arrayidx = getelementptr inbounds float, ptr %B, i64 %idxprom 170; CHECK-NEXT: LV: Found an estimated cost of 7 for VF vscale x 4 For instruction: %1 = load float, ptr %arrayidx, align 4 171; CHECK-NEXT: LV: Found an estimated cost of 2 for VF vscale x 4 For instruction: %conv1 = fadd float %1, 1.000000e+00 172; CHECK-NEXT: LV: Found an estimated cost of 0 for VF vscale x 4 For instruction: %arrayidx3 = getelementptr inbounds float, ptr %A, i64 %idxprom 173; CHECK-NEXT: LV: Found an estimated cost of 7 for VF vscale x 4 For instruction: store float %conv1, ptr %arrayidx3, align 4 174; CHECK-NEXT: LV: Found an estimated cost of 1 for VF vscale x 4 For instruction: %cmp = icmp ugt i64 %indvars.iv, 1 175; 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 176; CHECK-NEXT: LV: Found an estimated cost of 1 for VF vscale x 4 For instruction: br i1 %cmp, label %for.body, label %for.cond.cleanup.loopexit, !llvm.loop !0 177; CHECK-NEXT: LV: Using user VF vscale x 4. 178; CHECK-NEXT: LV: Scalarizing: %i.0 = add nsw i32 %i.0.in8, -1 179; CHECK-NEXT: LV: Scalarizing: %idxprom = zext i32 %i.0 to i64 180; CHECK-NEXT: LV: Scalarizing: %arrayidx = getelementptr inbounds float, ptr %B, i64 %idxprom 181; CHECK-NEXT: LV: Scalarizing: %arrayidx3 = getelementptr inbounds float, ptr %A, i64 %idxprom 182; CHECK-NEXT: LV: Scalarizing: %cmp = icmp ugt i64 %indvars.iv, 1 183; CHECK-NEXT: LV: Scalarizing: %indvars.iv.next = add nsw i64 %indvars.iv, -1 184; CHECK-NEXT: VPlan 'Initial VPlan for VF={vscale x 4},UF>=1' { 185; CHECK-NEXT: Live-in vp<%2> = vector-trip-count 186; CHECK: vector.ph: 187; CHECK-NEXT: Successor(s): vector loop 188; CHECK: <x1> vector loop: { 189; CHECK-NEXT: vector.body: 190; CHECK-NEXT: EMIT vp<%3> = CANONICAL-INDUCTION 191; CHECK-NEXT: vp<%4> = SCALAR-STEPS vp<%3>, ir<%n>, ir<-1> 192; CHECK-NEXT: CLONE ir<%i.0> = add vp<%4>, ir<-1> 193; CHECK-NEXT: CLONE ir<%idxprom> = zext ir<%i.0> 194; CHECK-NEXT: CLONE ir<%arrayidx> = getelementptr ir<%B>, ir<%idxprom> 195; CHECK-NEXT: WIDEN ir<%1> = load ir<%arrayidx> 196; CHECK-NEXT: WIDEN ir<%conv1> = fadd ir<%1>, ir<1.000000e+00> 197; CHECK-NEXT: CLONE ir<%arrayidx3> = getelementptr ir<%A>, ir<%idxprom> 198; CHECK-NEXT: WIDEN store ir<%arrayidx3>, ir<%conv1> 199; CHECK-NEXT: EMIT vp<%11> = VF * UF +(nuw) vp<%3> 200; CHECK-NEXT: EMIT branch-on-count vp<%11> vp<%2> 201; CHECK-NEXT: No successors 202; CHECK-NEXT: } 203; CHECK-NEXT: Successor(s): middle.block 204; CHECK: middle.block: 205; CHECK-NEXT: No successors 206; CHECK-NEXT: } 207; CHECK-NEXT: LV: Found an estimated cost of 1 for VF vscale x 4 For instruction: %indvars.iv = phi i64 [ %0, %for.body.preheader ], [ %indvars.iv.next, %for.body ] 208; CHECK-NEXT: LV: Found an estimated cost of 1 for VF vscale x 4 For instruction: %i.0.in8 = phi i32 [ %n, %for.body.preheader ], [ %i.0, %for.body ] 209; 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 210; CHECK-NEXT: LV: Found an estimated cost of 1 for VF vscale x 4 For instruction: %idxprom = zext i32 %i.0 to i64 211; CHECK-NEXT: LV: Found an estimated cost of 0 for VF vscale x 4 For instruction: %arrayidx = getelementptr inbounds float, ptr %B, i64 %idxprom 212; CHECK-NEXT: LV: Found an estimated cost of 7 for VF vscale x 4 For instruction: %1 = load float, ptr %arrayidx, align 4 213; CHECK-NEXT: LV: Found an estimated cost of 2 for VF vscale x 4 For instruction: %conv1 = fadd float %1, 1.000000e+00 214; CHECK-NEXT: LV: Found an estimated cost of 0 for VF vscale x 4 For instruction: %arrayidx3 = getelementptr inbounds float, ptr %A, i64 %idxprom 215; CHECK-NEXT: LV: Found an estimated cost of 7 for VF vscale x 4 For instruction: store float %conv1, ptr %arrayidx3, align 4 216; CHECK-NEXT: LV: Found an estimated cost of 1 for VF vscale x 4 For instruction: %cmp = icmp ugt i64 %indvars.iv, 1 217; 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 218; CHECK-NEXT: LV: Found an estimated cost of 1 for VF vscale x 4 For instruction: br i1 %cmp, label %for.body, label %for.cond.cleanup.loopexit, !llvm.loop !0 219; CHECK-NEXT: LV(REG): Calculating max register usage: 220; CHECK-NEXT: LV(REG): At #0 Interval # 0 221; CHECK-NEXT: LV(REG): At #1 Interval # 1 222; CHECK-NEXT: LV(REG): At #2 Interval # 2 223; CHECK-NEXT: LV(REG): At #3 Interval # 2 224; CHECK-NEXT: LV(REG): At #4 Interval # 2 225; CHECK-NEXT: LV(REG): At #5 Interval # 3 226; CHECK-NEXT: LV(REG): At #6 Interval # 3 227; CHECK-NEXT: LV(REG): At #7 Interval # 3 228; CHECK-NEXT: LV(REG): At #9 Interval # 1 229; CHECK-NEXT: LV(REG): At #10 Interval # 2 230; CHECK-NEXT: LV(REG): VF = vscale x 4 231; CHECK-NEXT: LV(REG): Found max usage: 2 item 232; CHECK-NEXT: LV(REG): RegisterClass: RISCV::GPRRC, 3 registers 233; CHECK-NEXT: LV(REG): RegisterClass: RISCV::VRRC, 2 registers 234; CHECK-NEXT: LV(REG): Found invariant usage: 1 item 235; CHECK-NEXT: LV(REG): RegisterClass: RISCV::VRRC, 4 registers 236; CHECK-NEXT: LV: The target has 31 registers of RISCV::GPRRC register class 237; CHECK-NEXT: LV: The target has 32 registers of RISCV::VRRC register class 238; CHECK-NEXT: LV: Loop cost is 23 239; CHECK-NEXT: LV: IC is 2 240; CHECK-NEXT: LV: VF is vscale x 4 241; CHECK-NEXT: LV: Not Interleaving. 242; CHECK-NEXT: LV: Interleaving is not beneficial. 243; CHECK-NEXT: LV: Found a vectorizable loop (vscale x 4) in <stdin> 244; CHECK-NEXT: LEV: Epilogue vectorization is not profitable for this loop 245; CHECK-NEXT: Executing best plan with VF=vscale x 4, UF=1 246; CHECK-NEXT: LV: Interleaving disabled by the pass manager 247; 248entry: 249 %cmp7 = icmp sgt i32 %n, 0 250 br i1 %cmp7, label %for.body.preheader, label %for.cond.cleanup 251 252for.body.preheader: ; preds = %entry 253 %0 = zext i32 %n to i64 254 br label %for.body 255 256for.cond.cleanup: ; preds = %for.body, %entry 257 ret void 258 259for.body: ; preds = %for.body.preheader, %for.body 260 %indvars.iv = phi i64 [ %0, %for.body.preheader ], [ %indvars.iv.next, %for.body ] 261 %i.0.in8 = phi i32 [ %n, %for.body.preheader ], [ %i.0, %for.body ] 262 %i.0 = add nsw i32 %i.0.in8, -1 263 %idxprom = zext i32 %i.0 to i64 264 %arrayidx = getelementptr inbounds float, ptr %B, i64 %idxprom 265 %1 = load float, ptr %arrayidx, align 4 266 %conv1 = fadd float %1, 1.000000e+00 267 %arrayidx3 = getelementptr inbounds float, ptr %A, i64 %idxprom 268 store float %conv1, ptr %arrayidx3, align 4 269 %cmp = icmp ugt i64 %indvars.iv, 1 270 %indvars.iv.next = add nsw i64 %indvars.iv, -1 271 br i1 %cmp, label %for.body, label %for.cond.cleanup, !llvm.loop !0 272} 273 274!0 = distinct !{!0, !1, !2, !3, !4} 275!1 = !{!"llvm.loop.mustprogress"} 276!2 = !{!"llvm.loop.vectorize.width", i32 4} 277!3 = !{!"llvm.loop.vectorize.scalable.enable", i1 true} 278!4 = !{!"llvm.loop.vectorize.enable", i1 true} 279