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