xref: /llvm-project/llvm/test/Transforms/LoopVectorize/iv_outside_user.ll (revision 29441e4f5fa5f5c7709f7cf180815ba97f611297)
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --replace-value-regex "!llvm.loop ![0-9]+" --version 5
2; RUN: opt -S -passes=loop-vectorize -force-vector-interleave=1 -force-vector-width=2 < %s | FileCheck --check-prefixes=CHECK,VEC %s
3; RUN: opt -S -passes=loop-vectorize -force-vector-interleave=2 -force-vector-width=1 < %s | FileCheck --check-prefixes=CHECK,INTERLEAVE %s
4
5define i32 @postinc(i32 %k)  {
6; CHECK-LABEL: define i32 @postinc(
7; CHECK-SAME: i32 [[K:%.*]]) {
8; CHECK-NEXT:  [[ENTRY:.*]]:
9; CHECK-NEXT:    [[MIN_ITERS_CHECK:%.*]] = icmp ult i32 [[K]], 2
10; CHECK-NEXT:    br i1 [[MIN_ITERS_CHECK]], label %[[SCALAR_PH:.*]], label %[[VECTOR_PH:.*]]
11; CHECK:       [[VECTOR_PH]]:
12; CHECK-NEXT:    [[N_MOD_VF:%.*]] = urem i32 [[K]], 2
13; CHECK-NEXT:    [[N_VEC:%.*]] = sub i32 [[K]], [[N_MOD_VF]]
14; CHECK-NEXT:    br label %[[VECTOR_BODY:.*]]
15; CHECK:       [[VECTOR_BODY]]:
16; CHECK-NEXT:    [[INDEX:%.*]] = phi i32 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]
17; CHECK-NEXT:    [[INDEX_NEXT]] = add nuw i32 [[INDEX]], 2
18; CHECK-NEXT:    [[TMP0:%.*]] = icmp eq i32 [[INDEX_NEXT]], [[N_VEC]]
19; CHECK-NEXT:    br i1 [[TMP0]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], {{!llvm.loop ![0-9]+}}
20; CHECK:       [[MIDDLE_BLOCK]]:
21; CHECK-NEXT:    [[CMP_N:%.*]] = icmp eq i32 [[K]], [[N_VEC]]
22; CHECK-NEXT:    br i1 [[CMP_N]], label %[[FOR_END:.*]], label %[[SCALAR_PH]]
23; CHECK:       [[SCALAR_PH]]:
24; CHECK-NEXT:    [[BC_RESUME_VAL:%.*]] = phi i32 [ [[N_VEC]], %[[MIDDLE_BLOCK]] ], [ 0, %[[ENTRY]] ]
25; CHECK-NEXT:    br label %[[FOR_BODY:.*]]
26; CHECK:       [[FOR_BODY]]:
27; CHECK-NEXT:    [[INC_PHI:%.*]] = phi i32 [ [[BC_RESUME_VAL]], %[[SCALAR_PH]] ], [ [[INC:%.*]], %[[FOR_BODY]] ]
28; CHECK-NEXT:    [[INC]] = add nsw i32 [[INC_PHI]], 1
29; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i32 [[INC]], [[K]]
30; CHECK-NEXT:    br i1 [[CMP]], label %[[FOR_END]], label %[[FOR_BODY]], {{!llvm.loop ![0-9]+}}
31; CHECK:       [[FOR_END]]:
32; CHECK-NEXT:    [[INC_LCSSA:%.*]] = phi i32 [ [[INC]], %[[FOR_BODY]] ], [ [[N_VEC]], %[[MIDDLE_BLOCK]] ]
33; CHECK-NEXT:    ret i32 [[INC_LCSSA]]
34;
35entry:
36  br label %for.body
37
38for.body:
39  %inc.phi = phi i32 [ 0, %entry ], [ %inc, %for.body ]
40  %inc = add nsw i32 %inc.phi, 1
41  %cmp = icmp eq i32 %inc, %k
42  br i1 %cmp, label %for.end, label %for.body
43
44for.end:
45  ret i32 %inc
46}
47
48define i32 @preinc(i32 %k)  {
49; CHECK-LABEL: define i32 @preinc(
50; CHECK-SAME: i32 [[K:%.*]]) {
51; CHECK-NEXT:  [[ENTRY:.*]]:
52; CHECK-NEXT:    [[MIN_ITERS_CHECK:%.*]] = icmp ult i32 [[K]], 2
53; CHECK-NEXT:    br i1 [[MIN_ITERS_CHECK]], label %[[SCALAR_PH:.*]], label %[[VECTOR_PH:.*]]
54; CHECK:       [[VECTOR_PH]]:
55; CHECK-NEXT:    [[N_MOD_VF:%.*]] = urem i32 [[K]], 2
56; CHECK-NEXT:    [[N_VEC:%.*]] = sub i32 [[K]], [[N_MOD_VF]]
57; CHECK-NEXT:    br label %[[VECTOR_BODY:.*]]
58; CHECK:       [[VECTOR_BODY]]:
59; CHECK-NEXT:    [[INDEX:%.*]] = phi i32 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]
60; CHECK-NEXT:    [[INDEX_NEXT]] = add nuw i32 [[INDEX]], 2
61; CHECK-NEXT:    [[TMP0:%.*]] = icmp eq i32 [[INDEX_NEXT]], [[N_VEC]]
62; CHECK-NEXT:    br i1 [[TMP0]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], {{!llvm.loop ![0-9]+}}
63; CHECK:       [[MIDDLE_BLOCK]]:
64; CHECK-NEXT:    [[CMP_N:%.*]] = icmp eq i32 [[K]], [[N_VEC]]
65; CHECK-NEXT:    [[IND_ESCAPE:%.*]] = sub i32 [[N_VEC]], 1
66; CHECK-NEXT:    br i1 [[CMP_N]], label %[[FOR_END:.*]], label %[[SCALAR_PH]]
67; CHECK:       [[SCALAR_PH]]:
68; CHECK-NEXT:    [[BC_RESUME_VAL:%.*]] = phi i32 [ [[N_VEC]], %[[MIDDLE_BLOCK]] ], [ 0, %[[ENTRY]] ]
69; CHECK-NEXT:    br label %[[FOR_BODY:.*]]
70; CHECK:       [[FOR_BODY]]:
71; CHECK-NEXT:    [[INC_PHI:%.*]] = phi i32 [ [[BC_RESUME_VAL]], %[[SCALAR_PH]] ], [ [[INC:%.*]], %[[FOR_BODY]] ]
72; CHECK-NEXT:    [[INC]] = add nsw i32 [[INC_PHI]], 1
73; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i32 [[INC]], [[K]]
74; CHECK-NEXT:    br i1 [[CMP]], label %[[FOR_END]], label %[[FOR_BODY]], {{!llvm.loop ![0-9]+}}
75; CHECK:       [[FOR_END]]:
76; CHECK-NEXT:    [[INC_PHI_LCSSA:%.*]] = phi i32 [ [[INC_PHI]], %[[FOR_BODY]] ], [ [[IND_ESCAPE]], %[[MIDDLE_BLOCK]] ]
77; CHECK-NEXT:    ret i32 [[INC_PHI_LCSSA]]
78;
79entry:
80  br label %for.body
81
82for.body:
83  %inc.phi = phi i32 [ 0, %entry ], [ %inc, %for.body ]
84  %inc = add nsw i32 %inc.phi, 1
85  %cmp = icmp eq i32 %inc, %k
86  br i1 %cmp, label %for.end, label %for.body
87
88for.end:
89  ret i32 %inc.phi
90}
91
92define i32 @constpre()  {
93; CHECK-LABEL: define i32 @constpre() {
94; CHECK-NEXT:  [[ENTRY:.*]]:
95; CHECK-NEXT:    br i1 false, label %[[SCALAR_PH:.*]], label %[[VECTOR_PH:.*]]
96; CHECK:       [[VECTOR_PH]]:
97; CHECK-NEXT:    br label %[[VECTOR_BODY:.*]]
98; CHECK:       [[VECTOR_BODY]]:
99; CHECK-NEXT:    [[INDEX:%.*]] = phi i32 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]
100; CHECK-NEXT:    [[INDEX_NEXT]] = add nuw i32 [[INDEX]], 2
101; CHECK-NEXT:    [[TMP0:%.*]] = icmp eq i32 [[INDEX_NEXT]], 16
102; CHECK-NEXT:    br i1 [[TMP0]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], {{!llvm.loop ![0-9]+}}
103; CHECK:       [[MIDDLE_BLOCK]]:
104; CHECK-NEXT:    br i1 true, label %[[FOR_END:.*]], label %[[SCALAR_PH]]
105; CHECK:       [[SCALAR_PH]]:
106; CHECK-NEXT:    [[BC_RESUME_VAL:%.*]] = phi i32 [ 0, %[[MIDDLE_BLOCK]] ], [ 32, %[[ENTRY]] ]
107; CHECK-NEXT:    br label %[[FOR_BODY:.*]]
108; CHECK:       [[FOR_BODY]]:
109; CHECK-NEXT:    [[INC_PHI:%.*]] = phi i32 [ [[BC_RESUME_VAL]], %[[SCALAR_PH]] ], [ [[INC:%.*]], %[[FOR_BODY]] ]
110; CHECK-NEXT:    [[INC]] = sub nsw i32 [[INC_PHI]], 2
111; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i32 [[INC]], 0
112; CHECK-NEXT:    br i1 [[CMP]], label %[[FOR_END]], label %[[FOR_BODY]], {{!llvm.loop ![0-9]+}}
113; CHECK:       [[FOR_END]]:
114; CHECK-NEXT:    [[INC_PHI_LCSSA:%.*]] = phi i32 [ [[INC_PHI]], %[[FOR_BODY]] ], [ 2, %[[MIDDLE_BLOCK]] ]
115; CHECK-NEXT:    ret i32 [[INC_PHI_LCSSA]]
116;
117entry:
118  br label %for.body
119
120for.body:
121  %inc.phi = phi i32 [ 32, %entry ], [ %inc, %for.body ]
122  %inc = sub nsw i32 %inc.phi, 2
123  %cmp = icmp eq i32 %inc, 0
124  br i1 %cmp, label %for.end, label %for.body
125
126for.end:
127  ret i32 %inc.phi
128}
129
130define ptr @geppre(ptr %ptr) {
131; CHECK-LABEL: define ptr @geppre(
132; CHECK-SAME: ptr [[PTR:%.*]]) {
133; CHECK-NEXT:  [[ENTRY:.*]]:
134; CHECK-NEXT:    br i1 false, label %[[SCALAR_PH:.*]], label %[[VECTOR_PH:.*]]
135; CHECK:       [[VECTOR_PH]]:
136; CHECK-NEXT:    [[IND_END:%.*]] = getelementptr i8, ptr [[PTR]], i64 512
137; CHECK-NEXT:    br label %[[VECTOR_BODY:.*]]
138; CHECK:       [[VECTOR_BODY]]:
139; CHECK-NEXT:    [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]
140; CHECK-NEXT:    [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 2
141; CHECK-NEXT:    [[TMP0:%.*]] = icmp eq i64 [[INDEX_NEXT]], 32
142; CHECK-NEXT:    br i1 [[TMP0]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], {{!llvm.loop ![0-9]+}}
143; CHECK:       [[MIDDLE_BLOCK]]:
144; CHECK-NEXT:    [[IND_ESCAPE:%.*]] = getelementptr i8, ptr [[IND_END]], i64 -16
145; CHECK-NEXT:    br i1 true, label %[[FOR_END:.*]], label %[[SCALAR_PH]]
146; CHECK:       [[SCALAR_PH]]:
147; CHECK-NEXT:    [[BC_RESUME_VAL:%.*]] = phi i32 [ 32, %[[MIDDLE_BLOCK]] ], [ 0, %[[ENTRY]] ]
148; CHECK-NEXT:    [[BC_RESUME_VAL1:%.*]] = phi ptr [ [[IND_END]], %[[MIDDLE_BLOCK]] ], [ [[PTR]], %[[ENTRY]] ]
149; CHECK-NEXT:    br label %[[FOR_BODY:.*]]
150; CHECK:       [[FOR_BODY]]:
151; CHECK-NEXT:    [[INC_PHI:%.*]] = phi i32 [ [[BC_RESUME_VAL]], %[[SCALAR_PH]] ], [ [[INC:%.*]], %[[FOR_BODY]] ]
152; CHECK-NEXT:    [[PTR_PHI:%.*]] = phi ptr [ [[BC_RESUME_VAL1]], %[[SCALAR_PH]] ], [ [[INC_PTR:%.*]], %[[FOR_BODY]] ]
153; CHECK-NEXT:    [[INC]] = add nsw i32 [[INC_PHI]], 1
154; CHECK-NEXT:    [[INC_PTR]] = getelementptr i32, ptr [[PTR_PHI]], i32 4
155; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i32 [[INC]], 32
156; CHECK-NEXT:    br i1 [[CMP]], label %[[FOR_END]], label %[[FOR_BODY]], {{!llvm.loop ![0-9]+}}
157; CHECK:       [[FOR_END]]:
158; CHECK-NEXT:    [[PTR_PHI_LCSSA:%.*]] = phi ptr [ [[PTR_PHI]], %[[FOR_BODY]] ], [ [[IND_ESCAPE]], %[[MIDDLE_BLOCK]] ]
159; CHECK-NEXT:    ret ptr [[PTR_PHI_LCSSA]]
160;
161entry:
162  br label %for.body
163
164for.body:
165  %inc.phi = phi i32 [ 0, %entry ], [ %inc, %for.body ]
166  %ptr.phi = phi ptr [ %ptr, %entry ], [ %inc.ptr, %for.body ]
167  %inc = add nsw i32 %inc.phi, 1
168  %inc.ptr = getelementptr i32, ptr %ptr.phi, i32 4
169  %cmp = icmp eq i32 %inc, 32
170  br i1 %cmp, label %for.end, label %for.body
171
172for.end:
173  ret ptr %ptr.phi
174}
175
176define ptr @both(i32 %k)  {
177; CHECK-LABEL: define ptr @both(
178; CHECK-SAME: i32 [[K:%.*]]) {
179; CHECK-NEXT:  [[ENTRY:.*]]:
180; CHECK-NEXT:    [[BASE:%.*]] = getelementptr inbounds i32, ptr undef, i64 1
181; CHECK-NEXT:    [[TMP0:%.*]] = add i32 [[K]], -1
182; CHECK-NEXT:    [[TMP1:%.*]] = zext i32 [[TMP0]] to i64
183; CHECK-NEXT:    [[TMP2:%.*]] = add nuw nsw i64 [[TMP1]], 1
184; CHECK-NEXT:    [[MIN_ITERS_CHECK:%.*]] = icmp ult i64 [[TMP2]], 2
185; CHECK-NEXT:    br i1 [[MIN_ITERS_CHECK]], label %[[SCALAR_PH:.*]], label %[[VECTOR_PH:.*]]
186; CHECK:       [[VECTOR_PH]]:
187; CHECK-NEXT:    [[N_MOD_VF:%.*]] = urem i64 [[TMP2]], 2
188; CHECK-NEXT:    [[N_VEC:%.*]] = sub i64 [[TMP2]], [[N_MOD_VF]]
189; CHECK-NEXT:    [[IND_END:%.*]] = trunc i64 [[N_VEC]] to i32
190; CHECK-NEXT:    [[TMP3:%.*]] = mul i64 [[N_VEC]], 4
191; CHECK-NEXT:    [[IND_END1:%.*]] = getelementptr i8, ptr [[BASE]], i64 [[TMP3]]
192; CHECK-NEXT:    [[TMP4:%.*]] = mul i64 [[N_VEC]], 4
193; CHECK-NEXT:    [[IND_END2:%.*]] = getelementptr i8, ptr undef, i64 [[TMP4]]
194; CHECK-NEXT:    br label %[[VECTOR_BODY:.*]]
195; CHECK:       [[VECTOR_BODY]]:
196; CHECK-NEXT:    [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]
197; CHECK-NEXT:    [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 2
198; CHECK-NEXT:    [[TMP5:%.*]] = icmp eq i64 [[INDEX_NEXT]], [[N_VEC]]
199; CHECK-NEXT:    br i1 [[TMP5]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], {{!llvm.loop ![0-9]+}}
200; CHECK:       [[MIDDLE_BLOCK]]:
201; CHECK-NEXT:    [[CMP_N:%.*]] = icmp eq i64 [[TMP2]], [[N_VEC]]
202; CHECK-NEXT:    [[IND_ESCAPE:%.*]] = getelementptr i8, ptr [[IND_END1]], i64 -4
203; CHECK-NEXT:    br i1 [[CMP_N]], label %[[FOR_END:.*]], label %[[SCALAR_PH]]
204; CHECK:       [[SCALAR_PH]]:
205; CHECK-NEXT:    [[BC_RESUME_VAL:%.*]] = phi i32 [ [[IND_END]], %[[MIDDLE_BLOCK]] ], [ 0, %[[ENTRY]] ]
206; CHECK-NEXT:    [[BC_RESUME_VAL1:%.*]] = phi ptr [ [[IND_END1]], %[[MIDDLE_BLOCK]] ], [ [[BASE]], %[[ENTRY]] ]
207; CHECK-NEXT:    [[BC_RESUME_VAL2:%.*]] = phi ptr [ [[IND_END2]], %[[MIDDLE_BLOCK]] ], [ undef, %[[ENTRY]] ]
208; CHECK-NEXT:    br label %[[FOR_BODY:.*]]
209; CHECK:       [[FOR_BODY]]:
210; CHECK-NEXT:    [[INC_PHI:%.*]] = phi i32 [ [[BC_RESUME_VAL]], %[[SCALAR_PH]] ], [ [[INC:%.*]], %[[FOR_BODY]] ]
211; CHECK-NEXT:    [[INC_LAG1:%.*]] = phi ptr [ [[BC_RESUME_VAL1]], %[[SCALAR_PH]] ], [ [[TMP:%.*]], %[[FOR_BODY]] ]
212; CHECK-NEXT:    [[INC_LAG2:%.*]] = phi ptr [ [[BC_RESUME_VAL2]], %[[SCALAR_PH]] ], [ [[INC_LAG1]], %[[FOR_BODY]] ]
213; CHECK-NEXT:    [[TMP]] = getelementptr inbounds i32, ptr [[INC_LAG1]], i64 1
214; CHECK-NEXT:    [[INC]] = add nsw i32 [[INC_PHI]], 1
215; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i32 [[INC]], [[K]]
216; CHECK-NEXT:    br i1 [[CMP]], label %[[FOR_END]], label %[[FOR_BODY]], {{!llvm.loop ![0-9]+}}
217; CHECK:       [[FOR_END]]:
218; CHECK-NEXT:    [[INC_LAG1_LCSSA:%.*]] = phi ptr [ [[INC_LAG1]], %[[FOR_BODY]] ], [ [[IND_ESCAPE]], %[[MIDDLE_BLOCK]] ]
219; CHECK-NEXT:    ret ptr [[INC_LAG1_LCSSA]]
220;
221entry:
222  %base = getelementptr inbounds i32, ptr undef, i64 1
223  br label %for.body
224
225for.body:
226  %inc.phi = phi i32 [ 0, %entry ], [ %inc, %for.body ]
227  %inc.lag1 = phi ptr [ %base, %entry ], [ %tmp, %for.body]
228  %inc.lag2 = phi ptr [ undef, %entry ], [ %inc.lag1, %for.body]
229  %tmp = getelementptr inbounds i32, ptr %inc.lag1, i64 1
230  %inc = add nsw i32 %inc.phi, 1
231  %cmp = icmp eq i32 %inc, %k
232  br i1 %cmp, label %for.end, label %for.body
233
234for.end:
235  ret ptr %inc.lag1
236}
237
238define i32 @multiphi(i32 %k, ptr %p)  {
239; CHECK-LABEL: define i32 @multiphi(
240; CHECK-SAME: i32 [[K:%.*]], ptr [[P:%.*]]) {
241; CHECK-NEXT:  [[ENTRY:.*]]:
242; CHECK-NEXT:    [[MIN_ITERS_CHECK:%.*]] = icmp ult i32 [[K]], 2
243; CHECK-NEXT:    br i1 [[MIN_ITERS_CHECK]], label %[[SCALAR_PH:.*]], label %[[VECTOR_PH:.*]]
244; CHECK:       [[VECTOR_PH]]:
245; CHECK-NEXT:    [[N_MOD_VF:%.*]] = urem i32 [[K]], 2
246; CHECK-NEXT:    [[N_VEC:%.*]] = sub i32 [[K]], [[N_MOD_VF]]
247; CHECK-NEXT:    br label %[[VECTOR_BODY:.*]]
248; CHECK:       [[VECTOR_BODY]]:
249; CHECK-NEXT:    [[INDEX:%.*]] = phi i32 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]
250; CHECK-NEXT:    [[INDEX_NEXT]] = add nuw i32 [[INDEX]], 2
251; CHECK-NEXT:    [[TMP0:%.*]] = icmp eq i32 [[INDEX_NEXT]], [[N_VEC]]
252; CHECK-NEXT:    br i1 [[TMP0]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], {{!llvm.loop ![0-9]+}}
253; CHECK:       [[MIDDLE_BLOCK]]:
254; CHECK-NEXT:    [[CMP_N:%.*]] = icmp eq i32 [[K]], [[N_VEC]]
255; CHECK-NEXT:    br i1 [[CMP_N]], label %[[FOR_END:.*]], label %[[SCALAR_PH]]
256; CHECK:       [[SCALAR_PH]]:
257; CHECK-NEXT:    [[BC_RESUME_VAL:%.*]] = phi i32 [ [[N_VEC]], %[[MIDDLE_BLOCK]] ], [ 0, %[[ENTRY]] ]
258; CHECK-NEXT:    br label %[[FOR_BODY:.*]]
259; CHECK:       [[FOR_BODY]]:
260; CHECK-NEXT:    [[INC_PHI:%.*]] = phi i32 [ [[BC_RESUME_VAL]], %[[SCALAR_PH]] ], [ [[INC:%.*]], %[[FOR_BODY]] ]
261; CHECK-NEXT:    [[INC]] = add nsw i32 [[INC_PHI]], 1
262; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i32 [[INC]], [[K]]
263; CHECK-NEXT:    br i1 [[CMP]], label %[[FOR_END]], label %[[FOR_BODY]], {{!llvm.loop ![0-9]+}}
264; CHECK:       [[FOR_END]]:
265; CHECK-NEXT:    [[PHI:%.*]] = phi i32 [ [[INC]], %[[FOR_BODY]] ], [ [[N_VEC]], %[[MIDDLE_BLOCK]] ]
266; CHECK-NEXT:    [[PHI2:%.*]] = phi i32 [ [[INC]], %[[FOR_BODY]] ], [ [[N_VEC]], %[[MIDDLE_BLOCK]] ]
267; CHECK-NEXT:    store i32 [[PHI2]], ptr [[P]], align 4
268; CHECK-NEXT:    ret i32 [[PHI]]
269;
270entry:
271  br label %for.body
272
273for.body:
274  %inc.phi = phi i32 [ 0, %entry ], [ %inc, %for.body ]
275  %inc = add nsw i32 %inc.phi, 1
276  %cmp = icmp eq i32 %inc, %k
277  br i1 %cmp, label %for.end, label %for.body
278
279for.end:
280  %phi = phi i32 [ %inc, %for.body ]
281  %phi2 = phi i32 [ %inc, %for.body ]
282  store i32 %phi2, ptr %p
283  ret i32 %phi
284}
285
286define void @PR30742() {
287; CHECK-LABEL: define void @PR30742() {
288; CHECK-NEXT:  [[BB0:.*:]]
289; CHECK-NEXT:    br label %[[BB1:.*]]
290; CHECK:       [[BB1_LOOPEXIT:.*]]:
291; CHECK-NEXT:    br label %[[BB1]]
292; CHECK:       [[BB1]]:
293; CHECK-NEXT:    [[TMP00:%.*]] = load i32, ptr undef, align 16
294; CHECK-NEXT:    [[TMP01:%.*]] = sub i32 [[TMP00]], undef
295; CHECK-NEXT:    [[TMP02:%.*]] = icmp slt i32 [[TMP01]], 1
296; CHECK-NEXT:    [[TMP03:%.*]] = select i1 [[TMP02]], i32 1, i32 [[TMP01]]
297; CHECK-NEXT:    [[TMP04:%.*]] = add nsw i32 [[TMP03]], -7
298; CHECK-NEXT:    [[TMP0:%.*]] = add i32 [[TMP03]], -8
299; CHECK-NEXT:    [[TMP1:%.*]] = add nsw i32 [[TMP03]], -15
300; CHECK-NEXT:    [[SMIN1:%.*]] = call i32 @llvm.smin.i32(i32 [[TMP1]], i32 0)
301; CHECK-NEXT:    [[TMP2:%.*]] = sub i32 [[TMP0]], [[SMIN1]]
302; CHECK-NEXT:    [[TMP3:%.*]] = lshr i32 [[TMP2]], 3
303; CHECK-NEXT:    [[TMP4:%.*]] = add nuw nsw i32 [[TMP3]], 1
304; CHECK-NEXT:    [[MIN_ITERS_CHECK4:%.*]] = icmp ult i32 [[TMP4]], 2
305; CHECK-NEXT:    br i1 [[MIN_ITERS_CHECK4]], label %[[SCALAR_PH3:.*]], label %[[VECTOR_PH5:.*]]
306; CHECK:       [[VECTOR_PH5]]:
307; CHECK-NEXT:    [[N_MOD_VF6:%.*]] = urem i32 [[TMP4]], 2
308; CHECK-NEXT:    [[N_VEC7:%.*]] = sub i32 [[TMP4]], [[N_MOD_VF6]]
309; CHECK-NEXT:    [[TMP5:%.*]] = mul i32 [[N_VEC7]], -8
310; CHECK-NEXT:    [[IND_END8:%.*]] = add i32 [[TMP04]], [[TMP5]]
311; CHECK-NEXT:    br label %[[VECTOR_BODY8:.*]]
312; CHECK:       [[VECTOR_BODY8]]:
313; CHECK-NEXT:    [[INDEX10:%.*]] = phi i32 [ 0, %[[VECTOR_PH5]] ], [ [[INDEX_NEXT11:%.*]], %[[VECTOR_BODY8]] ]
314; CHECK-NEXT:    [[INDEX_NEXT11]] = add nuw i32 [[INDEX10]], 2
315; CHECK-NEXT:    [[TMP6:%.*]] = icmp eq i32 [[INDEX_NEXT11]], [[N_VEC7]]
316; CHECK-NEXT:    br i1 [[TMP6]], label %[[MIDDLE_BLOCK2:.*]], label %[[VECTOR_BODY8]], {{!llvm.loop ![0-9]+}}
317; CHECK:       [[MIDDLE_BLOCK2]]:
318; CHECK-NEXT:    [[CMP_N12:%.*]] = icmp eq i32 [[TMP4]], [[N_VEC7]]
319; CHECK-NEXT:    [[IND_ESCAPE:%.*]] = sub i32 [[IND_END8]], -8
320; CHECK-NEXT:    br i1 [[CMP_N12]], label %[[BB3:.*]], label %[[SCALAR_PH3]]
321; CHECK:       [[SCALAR_PH3]]:
322; CHECK-NEXT:    [[BC_RESUME_VAL12:%.*]] = phi i32 [ [[IND_END8]], %[[MIDDLE_BLOCK2]] ], [ [[TMP04]], %[[BB1]] ]
323; CHECK-NEXT:    br label %[[BB2:.*]]
324; CHECK:       [[BB2]]:
325; CHECK-NEXT:    [[TMP05:%.*]] = phi i32 [ [[BC_RESUME_VAL12]], %[[SCALAR_PH3]] ], [ [[TMP06:%.*]], %[[BB2]] ]
326; CHECK-NEXT:    [[TMP06]] = add i32 [[TMP05]], -8
327; CHECK-NEXT:    [[TMP07:%.*]] = icmp sgt i32 [[TMP06]], 0
328; CHECK-NEXT:    br i1 [[TMP07]], label %[[BB2]], label %[[BB3]], {{!llvm.loop ![0-9]+}}
329; CHECK:       [[BB3]]:
330; CHECK-NEXT:    [[TMP08:%.*]] = phi i32 [ [[TMP05]], %[[BB2]] ], [ [[IND_ESCAPE]], %[[MIDDLE_BLOCK2]] ]
331; CHECK-NEXT:    [[TMP09:%.*]] = sub i32 [[TMP00]], undef
332; CHECK-NEXT:    [[TMP10:%.*]] = icmp slt i32 [[TMP09]], 1
333; CHECK-NEXT:    [[TMP11:%.*]] = select i1 [[TMP10]], i32 1, i32 [[TMP09]]
334; CHECK-NEXT:    [[TMP12:%.*]] = add nsw i32 [[TMP11]], -7
335; CHECK-NEXT:    [[TMP7:%.*]] = add i32 [[TMP11]], -8
336; CHECK-NEXT:    [[TMP8:%.*]] = add nsw i32 [[TMP11]], -15
337; CHECK-NEXT:    [[SMIN:%.*]] = call i32 @llvm.smin.i32(i32 [[TMP8]], i32 0)
338; CHECK-NEXT:    [[TMP10:%.*]] = sub i32 [[TMP7]], [[SMIN]]
339; CHECK-NEXT:    [[TMP11:%.*]] = lshr i32 [[TMP10]], 3
340; CHECK-NEXT:    [[TMP14:%.*]] = add nuw nsw i32 [[TMP11]], 1
341; CHECK-NEXT:    [[MIN_ITERS_CHECK:%.*]] = icmp ult i32 [[TMP14]], 2
342; CHECK-NEXT:    br i1 [[MIN_ITERS_CHECK]], label %[[SCALAR_PH:.*]], label %[[VECTOR_PH:.*]]
343; CHECK:       [[VECTOR_PH]]:
344; CHECK-NEXT:    [[N_MOD_VF:%.*]] = urem i32 [[TMP14]], 2
345; CHECK-NEXT:    [[N_VEC:%.*]] = sub i32 [[TMP14]], [[N_MOD_VF]]
346; CHECK-NEXT:    [[TMP16:%.*]] = mul i32 [[N_VEC]], -8
347; CHECK-NEXT:    [[IND_END:%.*]] = add i32 [[TMP12]], [[TMP16]]
348; CHECK-NEXT:    br label %[[VECTOR_BODY:.*]]
349; CHECK:       [[VECTOR_BODY]]:
350; CHECK-NEXT:    [[INDEX:%.*]] = phi i32 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]
351; CHECK-NEXT:    [[INDEX_NEXT]] = add nuw i32 [[INDEX]], 2
352; CHECK-NEXT:    [[TMP13:%.*]] = icmp eq i32 [[INDEX_NEXT]], [[N_VEC]]
353; CHECK-NEXT:    br i1 [[TMP13]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], {{!llvm.loop ![0-9]+}}
354; CHECK:       [[MIDDLE_BLOCK]]:
355; CHECK-NEXT:    [[CMP_N:%.*]] = icmp eq i32 [[TMP14]], [[N_VEC]]
356; CHECK-NEXT:    br i1 [[CMP_N]], label %[[BB1_LOOPEXIT]], label %[[SCALAR_PH]]
357; CHECK:       [[SCALAR_PH]]:
358; CHECK-NEXT:    [[BC_RESUME_VAL:%.*]] = phi i32 [ [[IND_END]], %[[MIDDLE_BLOCK]] ], [ [[TMP12]], %[[BB3]] ]
359; CHECK-NEXT:    br label %[[BB4:.*]]
360; CHECK:       [[BB4]]:
361; CHECK-NEXT:    [[TMP16:%.*]] = phi i32 [ [[BC_RESUME_VAL]], %[[SCALAR_PH]] ], [ [[IND_END:%.*]], %[[BB4]] ]
362; CHECK-NEXT:    [[IND_END]] = add i32 [[TMP16]], -8
363; CHECK-NEXT:    [[TMP13:%.*]] = icmp sgt i32 [[IND_END]], 0
364; CHECK-NEXT:    br i1 [[TMP13]], label %[[BB4]], label %[[BB1_LOOPEXIT]], {{!llvm.loop ![0-9]+}}
365;
366BB0:
367  br label %BB1
368
369BB1:
370  %tmp00 = load i32, ptr undef, align 16
371  %tmp01 = sub i32 %tmp00, undef
372  %tmp02 = icmp slt i32 %tmp01, 1
373  %tmp03 = select i1 %tmp02, i32 1, i32 %tmp01
374  %tmp04 = add nsw i32 %tmp03, -7
375  br label %BB2
376
377BB2:
378  %tmp05 = phi i32 [ %tmp04, %BB1 ], [ %tmp06, %BB2 ]
379  %tmp06 = add i32 %tmp05, -8
380  %tmp07 = icmp sgt i32 %tmp06, 0
381  br i1 %tmp07, label %BB2, label %BB3
382
383BB3:
384  %tmp08 = phi i32 [ %tmp05, %BB2 ]
385  %tmp09 = sub i32 %tmp00, undef
386  %tmp10 = icmp slt i32 %tmp09, 1
387  %tmp11 = select i1 %tmp10, i32 1, i32 %tmp09
388  %tmp11.inc = add nsw i32 %tmp11, -7
389  br label %BB4
390
391BB4:
392  %tmp13 = phi i32 [ %tmp11.inc, %BB3 ], [ %tmp14, %BB4 ]
393  %tmp14 = add i32 %tmp13, -8
394  %tmp15 = icmp sgt i32 %tmp14, 0
395  br i1 %tmp15, label %BB4, label %BB1
396}
397
398;
399define i64 @iv_scalar_steps_and_outside_users(ptr %ptr) {
400; VEC-LABEL: define i64 @iv_scalar_steps_and_outside_users(
401; VEC-SAME: ptr [[PTR:%.*]]) {
402; VEC-NEXT:  [[ENTRY:.*]]:
403; VEC-NEXT:    br i1 false, label %[[SCALAR_PH:.*]], label %[[VECTOR_PH:.*]]
404; VEC:       [[VECTOR_PH]]:
405; VEC-NEXT:    br label %[[VECTOR_BODY:.*]]
406; VEC:       [[VECTOR_BODY]]:
407; VEC-NEXT:    [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]
408; VEC-NEXT:    [[VEC_IND:%.*]] = phi <2 x i64> [ <i64 0, i64 1>, %[[VECTOR_PH]] ], [ [[VEC_IND_NEXT:%.*]], %[[VECTOR_BODY]] ]
409; VEC-NEXT:    [[TMP0:%.*]] = add i64 [[INDEX]], 0
410; VEC-NEXT:    [[TMP1:%.*]] = getelementptr inbounds i64, ptr [[PTR]], i64 [[TMP0]]
411; VEC-NEXT:    [[TMP2:%.*]] = getelementptr inbounds i64, ptr [[TMP1]], i32 0
412; VEC-NEXT:    store <2 x i64> [[VEC_IND]], ptr [[TMP2]], align 4
413; VEC-NEXT:    [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 2
414; VEC-NEXT:    [[VEC_IND_NEXT]] = add <2 x i64> [[VEC_IND]], splat (i64 2)
415; VEC-NEXT:    [[TMP3:%.*]] = icmp eq i64 [[INDEX_NEXT]], 1002
416; VEC-NEXT:    br i1 [[TMP3]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], {{!llvm.loop ![0-9]+}}
417; VEC:       [[MIDDLE_BLOCK]]:
418; VEC-NEXT:    br i1 true, label %[[EXIT:.*]], label %[[SCALAR_PH]]
419; VEC:       [[SCALAR_PH]]:
420; VEC-NEXT:    [[BC_RESUME_VAL:%.*]] = phi i64 [ 1002, %[[MIDDLE_BLOCK]] ], [ 0, %[[ENTRY]] ]
421; VEC-NEXT:    br label %[[LOOP:.*]]
422; VEC:       [[LOOP]]:
423; VEC-NEXT:    [[IV:%.*]] = phi i64 [ [[BC_RESUME_VAL]], %[[SCALAR_PH]] ], [ [[IV_NEXT:%.*]], %[[LOOP]] ]
424; VEC-NEXT:    [[IV_NEXT]] = add nuw i64 [[IV]], 1
425; VEC-NEXT:    [[GEP_PTR:%.*]] = getelementptr inbounds i64, ptr [[PTR]], i64 [[IV]]
426; VEC-NEXT:    store i64 [[IV]], ptr [[GEP_PTR]], align 4
427; VEC-NEXT:    [[EXITCOND:%.*]] = icmp ugt i64 [[IV]], 1000
428; VEC-NEXT:    br i1 [[EXITCOND]], label %[[EXIT]], label %[[LOOP]], {{!llvm.loop ![0-9]+}}
429; VEC:       [[EXIT]]:
430; VEC-NEXT:    [[IV_LCSSA:%.*]] = phi i64 [ [[IV]], %[[LOOP]] ], [ 1001, %[[MIDDLE_BLOCK]] ]
431; VEC-NEXT:    ret i64 [[IV_LCSSA]]
432;
433; INTERLEAVE-LABEL: define i64 @iv_scalar_steps_and_outside_users(
434; INTERLEAVE-SAME: ptr [[PTR:%.*]]) {
435; INTERLEAVE-NEXT:  [[ENTRY:.*]]:
436; INTERLEAVE-NEXT:    br i1 false, label %[[SCALAR_PH:.*]], label %[[VECTOR_PH:.*]]
437; INTERLEAVE:       [[VECTOR_PH]]:
438; INTERLEAVE-NEXT:    br label %[[VECTOR_BODY:.*]]
439; INTERLEAVE:       [[VECTOR_BODY]]:
440; INTERLEAVE-NEXT:    [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]
441; INTERLEAVE-NEXT:    [[TMP0:%.*]] = add i64 [[INDEX]], 0
442; INTERLEAVE-NEXT:    [[TMP1:%.*]] = add i64 [[INDEX]], 1
443; INTERLEAVE-NEXT:    [[TMP2:%.*]] = getelementptr inbounds i64, ptr [[PTR]], i64 [[TMP0]]
444; INTERLEAVE-NEXT:    [[TMP3:%.*]] = getelementptr inbounds i64, ptr [[PTR]], i64 [[TMP1]]
445; INTERLEAVE-NEXT:    store i64 [[TMP0]], ptr [[TMP2]], align 4
446; INTERLEAVE-NEXT:    store i64 [[TMP1]], ptr [[TMP3]], align 4
447; INTERLEAVE-NEXT:    [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 2
448; INTERLEAVE-NEXT:    [[TMP4:%.*]] = icmp eq i64 [[INDEX_NEXT]], 1002
449; INTERLEAVE-NEXT:    br i1 [[TMP4]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], {{!llvm.loop ![0-9]+}}
450; INTERLEAVE:       [[MIDDLE_BLOCK]]:
451; INTERLEAVE-NEXT:    br i1 true, label %[[EXIT:.*]], label %[[SCALAR_PH]]
452; INTERLEAVE:       [[SCALAR_PH]]:
453; INTERLEAVE-NEXT:    [[BC_RESUME_VAL:%.*]] = phi i64 [ 1002, %[[MIDDLE_BLOCK]] ], [ 0, %[[ENTRY]] ]
454; INTERLEAVE-NEXT:    br label %[[LOOP:.*]]
455; INTERLEAVE:       [[LOOP]]:
456; INTERLEAVE-NEXT:    [[IV:%.*]] = phi i64 [ [[BC_RESUME_VAL]], %[[SCALAR_PH]] ], [ [[IV_NEXT:%.*]], %[[LOOP]] ]
457; INTERLEAVE-NEXT:    [[IV_NEXT]] = add nuw i64 [[IV]], 1
458; INTERLEAVE-NEXT:    [[GEP_PTR:%.*]] = getelementptr inbounds i64, ptr [[PTR]], i64 [[IV]]
459; INTERLEAVE-NEXT:    store i64 [[IV]], ptr [[GEP_PTR]], align 4
460; INTERLEAVE-NEXT:    [[EXITCOND:%.*]] = icmp ugt i64 [[IV]], 1000
461; INTERLEAVE-NEXT:    br i1 [[EXITCOND]], label %[[EXIT]], label %[[LOOP]], {{!llvm.loop ![0-9]+}}
462; INTERLEAVE:       [[EXIT]]:
463; INTERLEAVE-NEXT:    [[IV_LCSSA:%.*]] = phi i64 [ [[IV]], %[[LOOP]] ], [ 1001, %[[MIDDLE_BLOCK]] ]
464; INTERLEAVE-NEXT:    ret i64 [[IV_LCSSA]]
465;
466entry:
467  br label %loop
468
469loop:
470  %iv = phi i64 [ 0, %entry ], [ %iv.next, %loop ]
471  %iv.next = add nuw i64 %iv, 1
472  %gep.ptr = getelementptr inbounds i64, ptr %ptr, i64 %iv
473  store i64 %iv, ptr %gep.ptr
474  %exitcond = icmp ugt i64 %iv, 1000
475  br i1 %exitcond, label %exit, label %loop
476
477exit:
478  %iv.lcssa = phi i64 [ %iv, %loop ]
479  ret i64 %iv.lcssa
480}
481
482
483; %iv.2 is dead in the vector loop and only used outside the loop.
484define i32 @iv_2_dead_in_loop_only_used_outside(ptr %ptr) {
485; VEC-LABEL: define i32 @iv_2_dead_in_loop_only_used_outside(
486; VEC-SAME: ptr [[PTR:%.*]]) {
487; VEC-NEXT:  [[ENTRY:.*]]:
488; VEC-NEXT:    br i1 false, label %[[SCALAR_PH:.*]], label %[[VECTOR_PH:.*]]
489; VEC:       [[VECTOR_PH]]:
490; VEC-NEXT:    br label %[[VECTOR_BODY:.*]]
491; VEC:       [[VECTOR_BODY]]:
492; VEC-NEXT:    [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]
493; VEC-NEXT:    [[VEC_IND:%.*]] = phi <2 x i64> [ <i64 0, i64 1>, %[[VECTOR_PH]] ], [ [[VEC_IND_NEXT:%.*]], %[[VECTOR_BODY]] ]
494; VEC-NEXT:    [[TMP0:%.*]] = add i64 [[INDEX]], 0
495; VEC-NEXT:    [[TMP1:%.*]] = getelementptr inbounds i64, ptr [[PTR]], i64 [[TMP0]]
496; VEC-NEXT:    [[TMP2:%.*]] = getelementptr inbounds i64, ptr [[TMP1]], i32 0
497; VEC-NEXT:    store <2 x i64> [[VEC_IND]], ptr [[TMP2]], align 4
498; VEC-NEXT:    [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 2
499; VEC-NEXT:    [[VEC_IND_NEXT]] = add <2 x i64> [[VEC_IND]], splat (i64 2)
500; VEC-NEXT:    [[TMP3:%.*]] = icmp eq i64 [[INDEX_NEXT]], 1002
501; VEC-NEXT:    br i1 [[TMP3]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], {{!llvm.loop ![0-9]+}}
502; VEC:       [[MIDDLE_BLOCK]]:
503; VEC-NEXT:    br i1 true, label %[[EXIT:.*]], label %[[SCALAR_PH]]
504; VEC:       [[SCALAR_PH]]:
505; VEC-NEXT:    [[BC_RESUME_VAL:%.*]] = phi i64 [ 1002, %[[MIDDLE_BLOCK]] ], [ 0, %[[ENTRY]] ]
506; VEC-NEXT:    [[BC_RESUME_VAL1:%.*]] = phi i32 [ 2004, %[[MIDDLE_BLOCK]] ], [ 0, %[[ENTRY]] ]
507; VEC-NEXT:    br label %[[LOOP:.*]]
508; VEC:       [[LOOP]]:
509; VEC-NEXT:    [[IV:%.*]] = phi i64 [ [[BC_RESUME_VAL]], %[[SCALAR_PH]] ], [ [[IV_NEXT:%.*]], %[[LOOP]] ]
510; VEC-NEXT:    [[IV_2:%.*]] = phi i32 [ [[BC_RESUME_VAL1]], %[[SCALAR_PH]] ], [ [[IV_2_NEXT:%.*]], %[[LOOP]] ]
511; VEC-NEXT:    [[IV_NEXT]] = add nuw i64 [[IV]], 1
512; VEC-NEXT:    [[IV_2_NEXT]] = add nuw i32 [[IV_2]], 2
513; VEC-NEXT:    [[GEP_PTR:%.*]] = getelementptr inbounds i64, ptr [[PTR]], i64 [[IV]]
514; VEC-NEXT:    store i64 [[IV]], ptr [[GEP_PTR]], align 4
515; VEC-NEXT:    [[EXITCOND:%.*]] = icmp ugt i64 [[IV]], 1000
516; VEC-NEXT:    br i1 [[EXITCOND]], label %[[EXIT]], label %[[LOOP]], {{!llvm.loop ![0-9]+}}
517; VEC:       [[EXIT]]:
518; VEC-NEXT:    [[IV_2_LCSSA:%.*]] = phi i32 [ [[IV_2]], %[[LOOP]] ], [ 2002, %[[MIDDLE_BLOCK]] ]
519; VEC-NEXT:    ret i32 [[IV_2_LCSSA]]
520;
521; INTERLEAVE-LABEL: define i32 @iv_2_dead_in_loop_only_used_outside(
522; INTERLEAVE-SAME: ptr [[PTR:%.*]]) {
523; INTERLEAVE-NEXT:  [[ENTRY:.*]]:
524; INTERLEAVE-NEXT:    br i1 false, label %[[SCALAR_PH:.*]], label %[[VECTOR_PH:.*]]
525; INTERLEAVE:       [[VECTOR_PH]]:
526; INTERLEAVE-NEXT:    br label %[[VECTOR_BODY:.*]]
527; INTERLEAVE:       [[VECTOR_BODY]]:
528; INTERLEAVE-NEXT:    [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]
529; INTERLEAVE-NEXT:    [[TMP0:%.*]] = add i64 [[INDEX]], 0
530; INTERLEAVE-NEXT:    [[TMP1:%.*]] = add i64 [[INDEX]], 1
531; INTERLEAVE-NEXT:    [[TMP2:%.*]] = getelementptr inbounds i64, ptr [[PTR]], i64 [[TMP0]]
532; INTERLEAVE-NEXT:    [[TMP3:%.*]] = getelementptr inbounds i64, ptr [[PTR]], i64 [[TMP1]]
533; INTERLEAVE-NEXT:    store i64 [[TMP0]], ptr [[TMP2]], align 4
534; INTERLEAVE-NEXT:    store i64 [[TMP1]], ptr [[TMP3]], align 4
535; INTERLEAVE-NEXT:    [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 2
536; INTERLEAVE-NEXT:    [[TMP4:%.*]] = icmp eq i64 [[INDEX_NEXT]], 1002
537; INTERLEAVE-NEXT:    br i1 [[TMP4]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], {{!llvm.loop ![0-9]+}}
538; INTERLEAVE:       [[MIDDLE_BLOCK]]:
539; INTERLEAVE-NEXT:    br i1 true, label %[[EXIT:.*]], label %[[SCALAR_PH]]
540; INTERLEAVE:       [[SCALAR_PH]]:
541; INTERLEAVE-NEXT:    [[BC_RESUME_VAL:%.*]] = phi i64 [ 1002, %[[MIDDLE_BLOCK]] ], [ 0, %[[ENTRY]] ]
542; INTERLEAVE-NEXT:    [[BC_RESUME_VAL1:%.*]] = phi i32 [ 2004, %[[MIDDLE_BLOCK]] ], [ 0, %[[ENTRY]] ]
543; INTERLEAVE-NEXT:    br label %[[LOOP:.*]]
544; INTERLEAVE:       [[LOOP]]:
545; INTERLEAVE-NEXT:    [[IV:%.*]] = phi i64 [ [[BC_RESUME_VAL]], %[[SCALAR_PH]] ], [ [[IV_NEXT:%.*]], %[[LOOP]] ]
546; INTERLEAVE-NEXT:    [[IV_2:%.*]] = phi i32 [ [[BC_RESUME_VAL1]], %[[SCALAR_PH]] ], [ [[IV_2_NEXT:%.*]], %[[LOOP]] ]
547; INTERLEAVE-NEXT:    [[IV_NEXT]] = add nuw i64 [[IV]], 1
548; INTERLEAVE-NEXT:    [[IV_2_NEXT]] = add nuw i32 [[IV_2]], 2
549; INTERLEAVE-NEXT:    [[GEP_PTR:%.*]] = getelementptr inbounds i64, ptr [[PTR]], i64 [[IV]]
550; INTERLEAVE-NEXT:    store i64 [[IV]], ptr [[GEP_PTR]], align 4
551; INTERLEAVE-NEXT:    [[EXITCOND:%.*]] = icmp ugt i64 [[IV]], 1000
552; INTERLEAVE-NEXT:    br i1 [[EXITCOND]], label %[[EXIT]], label %[[LOOP]], {{!llvm.loop ![0-9]+}}
553; INTERLEAVE:       [[EXIT]]:
554; INTERLEAVE-NEXT:    [[IV_2_LCSSA:%.*]] = phi i32 [ [[IV_2]], %[[LOOP]] ], [ 2002, %[[MIDDLE_BLOCK]] ]
555; INTERLEAVE-NEXT:    ret i32 [[IV_2_LCSSA]]
556;
557entry:
558  br label %loop
559
560loop:
561  %iv = phi i64 [ 0, %entry ], [ %iv.next, %loop ]
562  %iv.2 = phi i32 [ 0, %entry ], [ %iv.2.next, %loop ]
563  %iv.next = add nuw i64 %iv, 1
564  %iv.2.next = add nuw i32 %iv.2, 2
565  %gep.ptr = getelementptr inbounds i64, ptr %ptr, i64 %iv
566  store i64 %iv, ptr %gep.ptr
567  %exitcond = icmp ugt i64 %iv, 1000
568  br i1 %exitcond, label %exit, label %loop
569
570exit:
571  %iv.2.lcssa = phi i32 [ %iv.2, %loop ]
572  ret i32 %iv.2.lcssa
573}
574
575define i32 @postinc_sub(i32 %k)  {
576; CHECK-LABEL: define i32 @postinc_sub(
577; CHECK-SAME: i32 [[K:%.*]]) {
578; CHECK-NEXT:  [[ENTRY:.*]]:
579; CHECK-NEXT:    [[MIN_ITERS_CHECK:%.*]] = icmp ult i32 [[K]], 2
580; CHECK-NEXT:    br i1 [[MIN_ITERS_CHECK]], label %[[SCALAR_PH:.*]], label %[[VECTOR_PH:.*]]
581; CHECK:       [[VECTOR_PH]]:
582; CHECK-NEXT:    [[N_MOD_VF:%.*]] = urem i32 [[K]], 2
583; CHECK-NEXT:    [[N_VEC:%.*]] = sub i32 [[K]], [[N_MOD_VF]]
584; CHECK-NEXT:    [[TMP0:%.*]] = sub i32 [[K]], [[N_VEC]]
585; CHECK-NEXT:    br label %[[VECTOR_BODY:.*]]
586; CHECK:       [[VECTOR_BODY]]:
587; CHECK-NEXT:    [[INDEX:%.*]] = phi i32 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]
588; CHECK-NEXT:    [[INDEX_NEXT]] = add nuw i32 [[INDEX]], 2
589; CHECK-NEXT:    [[TMP1:%.*]] = icmp eq i32 [[INDEX_NEXT]], [[N_VEC]]
590; CHECK-NEXT:    br i1 [[TMP1]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], {{!llvm.loop ![0-9]+}}
591; CHECK:       [[MIDDLE_BLOCK]]:
592; CHECK-NEXT:    [[CMP_N:%.*]] = icmp eq i32 [[K]], [[N_VEC]]
593; CHECK-NEXT:    br i1 [[CMP_N]], label %[[FOR_END:.*]], label %[[SCALAR_PH]]
594; CHECK:       [[SCALAR_PH]]:
595; CHECK-NEXT:    [[BC_RESUME_VAL:%.*]] = phi i32 [ [[TMP0]], %[[MIDDLE_BLOCK]] ], [ [[K]], %[[ENTRY]] ]
596; CHECK-NEXT:    br label %[[FOR_BODY:.*]]
597; CHECK:       [[FOR_BODY]]:
598; CHECK-NEXT:    [[INC_PHI:%.*]] = phi i32 [ [[BC_RESUME_VAL]], %[[SCALAR_PH]] ], [ [[INC:%.*]], %[[FOR_BODY]] ]
599; CHECK-NEXT:    [[INC]] = sub nsw i32 [[INC_PHI]], 1
600; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i32 [[INC]], 0
601; CHECK-NEXT:    br i1 [[CMP]], label %[[FOR_END]], label %[[FOR_BODY]], {{!llvm.loop ![0-9]+}}
602; CHECK:       [[FOR_END]]:
603; CHECK-NEXT:    [[INC_LCSSA:%.*]] = phi i32 [ [[INC]], %[[FOR_BODY]] ], [ [[TMP0]], %[[MIDDLE_BLOCK]] ]
604; CHECK-NEXT:    ret i32 [[INC_LCSSA]]
605;
606entry:
607  br label %for.body
608
609for.body:
610  %inc.phi = phi i32 [ %k, %entry ], [ %inc, %for.body ]
611  %inc = sub nsw i32 %inc.phi, 1
612  %cmp = icmp eq i32 %inc, 0
613  br i1 %cmp, label %for.end, label %for.body
614
615for.end:
616  ret i32 %inc
617}
618
619define i32 @postinc_swapped_ops(i32 %k)  {
620; CHECK-LABEL: define i32 @postinc_swapped_ops(
621; CHECK-SAME: i32 [[K:%.*]]) {
622; CHECK-NEXT:  [[ENTRY:.*]]:
623; CHECK-NEXT:    [[MIN_ITERS_CHECK:%.*]] = icmp ult i32 [[K]], 2
624; CHECK-NEXT:    br i1 [[MIN_ITERS_CHECK]], label %[[SCALAR_PH:.*]], label %[[VECTOR_PH:.*]]
625; CHECK:       [[VECTOR_PH]]:
626; CHECK-NEXT:    [[N_MOD_VF:%.*]] = urem i32 [[K]], 2
627; CHECK-NEXT:    [[N_VEC:%.*]] = sub i32 [[K]], [[N_MOD_VF]]
628; CHECK-NEXT:    br label %[[VECTOR_BODY:.*]]
629; CHECK:       [[VECTOR_BODY]]:
630; CHECK-NEXT:    [[INDEX:%.*]] = phi i32 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]
631; CHECK-NEXT:    [[INDEX_NEXT]] = add nuw i32 [[INDEX]], 2
632; CHECK-NEXT:    [[TMP0:%.*]] = icmp eq i32 [[INDEX_NEXT]], [[N_VEC]]
633; CHECK-NEXT:    br i1 [[TMP0]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], {{!llvm.loop ![0-9]+}}
634; CHECK:       [[MIDDLE_BLOCK]]:
635; CHECK-NEXT:    [[CMP_N:%.*]] = icmp eq i32 [[K]], [[N_VEC]]
636; CHECK-NEXT:    br i1 [[CMP_N]], label %[[FOR_END:.*]], label %[[SCALAR_PH]]
637; CHECK:       [[SCALAR_PH]]:
638; CHECK-NEXT:    [[BC_RESUME_VAL:%.*]] = phi i32 [ [[N_VEC]], %[[MIDDLE_BLOCK]] ], [ 0, %[[ENTRY]] ]
639; CHECK-NEXT:    br label %[[FOR_BODY:.*]]
640; CHECK:       [[FOR_BODY]]:
641; CHECK-NEXT:    [[INC_PHI:%.*]] = phi i32 [ [[BC_RESUME_VAL]], %[[SCALAR_PH]] ], [ [[INC:%.*]], %[[FOR_BODY]] ]
642; CHECK-NEXT:    [[INC]] = add nsw i32 1, [[INC_PHI]]
643; CHECK-NEXT:    [[CMP:%.*]] = icmp eq i32 [[INC]], [[K]]
644; CHECK-NEXT:    br i1 [[CMP]], label %[[FOR_END]], label %[[FOR_BODY]], {{!llvm.loop ![0-9]+}}
645; CHECK:       [[FOR_END]]:
646; CHECK-NEXT:    [[INC_LCSSA:%.*]] = phi i32 [ [[INC]], %[[FOR_BODY]] ], [ [[N_VEC]], %[[MIDDLE_BLOCK]] ]
647; CHECK-NEXT:    ret i32 [[INC_LCSSA]]
648;
649entry:
650  br label %for.body
651
652for.body:
653  %inc.phi = phi i32 [ 0, %entry ], [ %inc, %for.body ]
654  %inc = add nsw i32 1, %inc.phi
655  %cmp = icmp eq i32 %inc, %k
656  br i1 %cmp, label %for.end, label %for.body
657
658for.end:
659  ret i32 %inc
660}
661
662define i32 @postinc_not_iv_backedge_value(i32 %k)  {
663; VEC-LABEL: define i32 @postinc_not_iv_backedge_value(
664; VEC-SAME: i32 [[K:%.*]]) {
665; VEC-NEXT:  [[ENTRY:.*]]:
666; VEC-NEXT:    [[MIN_ITERS_CHECK:%.*]] = icmp ult i32 [[K]], 2
667; VEC-NEXT:    br i1 [[MIN_ITERS_CHECK]], label %[[SCALAR_PH:.*]], label %[[VECTOR_PH:.*]]
668; VEC:       [[VECTOR_PH]]:
669; VEC-NEXT:    [[N_MOD_VF:%.*]] = urem i32 [[K]], 2
670; VEC-NEXT:    [[N_VEC:%.*]] = sub i32 [[K]], [[N_MOD_VF]]
671; VEC-NEXT:    br label %[[VECTOR_BODY:.*]]
672; VEC:       [[VECTOR_BODY]]:
673; VEC-NEXT:    [[INDEX:%.*]] = phi i32 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]
674; VEC-NEXT:    [[VEC_IND:%.*]] = phi <2 x i32> [ <i32 0, i32 1>, %[[VECTOR_PH]] ], [ [[VEC_IND_NEXT:%.*]], %[[VECTOR_BODY]] ]
675; VEC-NEXT:    [[TMP0:%.*]] = add <2 x i32> [[VEC_IND]], splat (i32 2)
676; VEC-NEXT:    [[INDEX_NEXT]] = add nuw i32 [[INDEX]], 2
677; VEC-NEXT:    [[VEC_IND_NEXT]] = add <2 x i32> [[VEC_IND]], splat (i32 2)
678; VEC-NEXT:    [[TMP1:%.*]] = icmp eq i32 [[INDEX_NEXT]], [[N_VEC]]
679; VEC-NEXT:    br i1 [[TMP1]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], {{!llvm.loop ![0-9]+}}
680; VEC:       [[MIDDLE_BLOCK]]:
681; VEC-NEXT:    [[TMP2:%.*]] = extractelement <2 x i32> [[TMP0]], i32 1
682; VEC-NEXT:    [[CMP_N:%.*]] = icmp eq i32 [[K]], [[N_VEC]]
683; VEC-NEXT:    br i1 [[CMP_N]], label %[[FOR_END:.*]], label %[[SCALAR_PH]]
684; VEC:       [[SCALAR_PH]]:
685; VEC-NEXT:    [[BC_RESUME_VAL:%.*]] = phi i32 [ [[N_VEC]], %[[MIDDLE_BLOCK]] ], [ 0, %[[ENTRY]] ]
686; VEC-NEXT:    br label %[[FOR_BODY:.*]]
687; VEC:       [[FOR_BODY]]:
688; VEC-NEXT:    [[INC_PHI:%.*]] = phi i32 [ [[BC_RESUME_VAL]], %[[SCALAR_PH]] ], [ [[INC:%.*]], %[[FOR_BODY]] ]
689; VEC-NEXT:    [[INC]] = add nsw i32 [[INC_PHI]], 1
690; VEC-NEXT:    [[INC_2:%.*]] = add i32 [[INC_PHI]], 2
691; VEC-NEXT:    [[CMP:%.*]] = icmp eq i32 [[INC]], [[K]]
692; VEC-NEXT:    br i1 [[CMP]], label %[[FOR_END]], label %[[FOR_BODY]], {{!llvm.loop ![0-9]+}}
693; VEC:       [[FOR_END]]:
694; VEC-NEXT:    [[INC_2_LCSSA:%.*]] = phi i32 [ [[INC_2]], %[[FOR_BODY]] ], [ [[TMP2]], %[[MIDDLE_BLOCK]] ]
695; VEC-NEXT:    ret i32 [[INC_2_LCSSA]]
696;
697; INTERLEAVE-LABEL: define i32 @postinc_not_iv_backedge_value(
698; INTERLEAVE-SAME: i32 [[K:%.*]]) {
699; INTERLEAVE-NEXT:  [[ENTRY:.*]]:
700; INTERLEAVE-NEXT:    [[MIN_ITERS_CHECK:%.*]] = icmp ult i32 [[K]], 2
701; INTERLEAVE-NEXT:    br i1 [[MIN_ITERS_CHECK]], label %[[SCALAR_PH:.*]], label %[[VECTOR_PH:.*]]
702; INTERLEAVE:       [[VECTOR_PH]]:
703; INTERLEAVE-NEXT:    [[N_MOD_VF:%.*]] = urem i32 [[K]], 2
704; INTERLEAVE-NEXT:    [[N_VEC:%.*]] = sub i32 [[K]], [[N_MOD_VF]]
705; INTERLEAVE-NEXT:    br label %[[VECTOR_BODY:.*]]
706; INTERLEAVE:       [[VECTOR_BODY]]:
707; INTERLEAVE-NEXT:    [[INDEX:%.*]] = phi i32 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]
708; INTERLEAVE-NEXT:    [[TMP0:%.*]] = add i32 [[INDEX]], 1
709; INTERLEAVE-NEXT:    [[TMP1:%.*]] = add i32 [[TMP0]], 2
710; INTERLEAVE-NEXT:    [[INDEX_NEXT]] = add nuw i32 [[INDEX]], 2
711; INTERLEAVE-NEXT:    [[TMP2:%.*]] = icmp eq i32 [[INDEX_NEXT]], [[N_VEC]]
712; INTERLEAVE-NEXT:    br i1 [[TMP2]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], {{!llvm.loop ![0-9]+}}
713; INTERLEAVE:       [[MIDDLE_BLOCK]]:
714; INTERLEAVE-NEXT:    [[CMP_N:%.*]] = icmp eq i32 [[K]], [[N_VEC]]
715; INTERLEAVE-NEXT:    br i1 [[CMP_N]], label %[[FOR_END:.*]], label %[[SCALAR_PH]]
716; INTERLEAVE:       [[SCALAR_PH]]:
717; INTERLEAVE-NEXT:    [[BC_RESUME_VAL:%.*]] = phi i32 [ [[N_VEC]], %[[MIDDLE_BLOCK]] ], [ 0, %[[ENTRY]] ]
718; INTERLEAVE-NEXT:    br label %[[FOR_BODY:.*]]
719; INTERLEAVE:       [[FOR_BODY]]:
720; INTERLEAVE-NEXT:    [[INC_PHI:%.*]] = phi i32 [ [[BC_RESUME_VAL]], %[[SCALAR_PH]] ], [ [[INC:%.*]], %[[FOR_BODY]] ]
721; INTERLEAVE-NEXT:    [[INC]] = add nsw i32 [[INC_PHI]], 1
722; INTERLEAVE-NEXT:    [[INC_2:%.*]] = add i32 [[INC_PHI]], 2
723; INTERLEAVE-NEXT:    [[CMP:%.*]] = icmp eq i32 [[INC]], [[K]]
724; INTERLEAVE-NEXT:    br i1 [[CMP]], label %[[FOR_END]], label %[[FOR_BODY]], {{!llvm.loop ![0-9]+}}
725; INTERLEAVE:       [[FOR_END]]:
726; INTERLEAVE-NEXT:    [[INC_2_LCSSA:%.*]] = phi i32 [ [[INC_2]], %[[FOR_BODY]] ], [ [[TMP1]], %[[MIDDLE_BLOCK]] ]
727; INTERLEAVE-NEXT:    ret i32 [[INC_2_LCSSA]]
728;
729entry:
730  br label %for.body
731
732for.body:
733  %inc.phi = phi i32 [ 0, %entry ], [ %inc, %for.body ]
734  %inc = add nsw i32 %inc.phi, 1
735  %inc.2 = add i32 %inc.phi, 2
736  %cmp = icmp eq i32 %inc, %k
737  br i1 %cmp, label %for.end, label %for.body
738
739for.end:
740  ret i32 %inc.2
741}
742
743define float @fp_postinc_use_fadd(float %init, ptr noalias nocapture %A, i64 %N, float %fpinc) {
744; VEC-LABEL: define float @fp_postinc_use_fadd(
745; VEC-SAME: float [[INIT:%.*]], ptr noalias captures(none) [[A:%.*]], i64 [[N:%.*]], float [[FPINC:%.*]]) {
746; VEC-NEXT:  [[ENTRY:.*]]:
747; VEC-NEXT:    [[MIN_ITERS_CHECK:%.*]] = icmp ult i64 [[N]], 2
748; VEC-NEXT:    br i1 [[MIN_ITERS_CHECK]], label %[[SCALAR_PH:.*]], label %[[VECTOR_PH:.*]]
749; VEC:       [[VECTOR_PH]]:
750; VEC-NEXT:    [[N_MOD_VF:%.*]] = urem i64 [[N]], 2
751; VEC-NEXT:    [[N_VEC:%.*]] = sub i64 [[N]], [[N_MOD_VF]]
752; VEC-NEXT:    [[DOTCAST:%.*]] = sitofp i64 [[N_VEC]] to float
753; VEC-NEXT:    [[TMP0:%.*]] = fmul fast float [[FPINC]], [[DOTCAST]]
754; VEC-NEXT:    [[TMP1:%.*]] = fadd fast float [[INIT]], [[TMP0]]
755; VEC-NEXT:    [[DOTSPLATINSERT:%.*]] = insertelement <2 x float> poison, float [[INIT]], i64 0
756; VEC-NEXT:    [[DOTSPLAT:%.*]] = shufflevector <2 x float> [[DOTSPLATINSERT]], <2 x float> poison, <2 x i32> zeroinitializer
757; VEC-NEXT:    [[DOTSPLATINSERT1:%.*]] = insertelement <2 x float> poison, float [[FPINC]], i64 0
758; VEC-NEXT:    [[DOTSPLAT2:%.*]] = shufflevector <2 x float> [[DOTSPLATINSERT1]], <2 x float> poison, <2 x i32> zeroinitializer
759; VEC-NEXT:    [[TMP2:%.*]] = fmul fast <2 x float> <float 0.000000e+00, float 1.000000e+00>, [[DOTSPLAT2]]
760; VEC-NEXT:    [[INDUCTION:%.*]] = fadd fast <2 x float> [[DOTSPLAT]], [[TMP2]]
761; VEC-NEXT:    [[TMP3:%.*]] = fmul fast float [[FPINC]], 2.000000e+00
762; VEC-NEXT:    [[DOTSPLATINSERT3:%.*]] = insertelement <2 x float> poison, float [[TMP3]], i64 0
763; VEC-NEXT:    [[DOTSPLAT4:%.*]] = shufflevector <2 x float> [[DOTSPLATINSERT3]], <2 x float> poison, <2 x i32> zeroinitializer
764; VEC-NEXT:    br label %[[VECTOR_BODY:.*]]
765; VEC:       [[VECTOR_BODY]]:
766; VEC-NEXT:    [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]
767; VEC-NEXT:    [[VEC_IND:%.*]] = phi <2 x float> [ [[INDUCTION]], %[[VECTOR_PH]] ], [ [[VEC_IND_NEXT:%.*]], %[[VECTOR_BODY]] ]
768; VEC-NEXT:    [[TMP4:%.*]] = add i64 [[INDEX]], 0
769; VEC-NEXT:    [[TMP5:%.*]] = getelementptr inbounds float, ptr [[A]], i64 [[TMP4]]
770; VEC-NEXT:    [[TMP6:%.*]] = getelementptr inbounds float, ptr [[TMP5]], i32 0
771; VEC-NEXT:    store <2 x float> [[VEC_IND]], ptr [[TMP6]], align 4
772; VEC-NEXT:    [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 2
773; VEC-NEXT:    [[VEC_IND_NEXT]] = fadd fast <2 x float> [[VEC_IND]], [[DOTSPLAT4]]
774; VEC-NEXT:    [[TMP7:%.*]] = icmp eq i64 [[INDEX_NEXT]], [[N_VEC]]
775; VEC-NEXT:    br i1 [[TMP7]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], {{!llvm.loop ![0-9]+}}
776; VEC:       [[MIDDLE_BLOCK]]:
777; VEC-NEXT:    [[CMP_N:%.*]] = icmp eq i64 [[N]], [[N_VEC]]
778; VEC-NEXT:    br i1 [[CMP_N]], label %[[EXIT:.*]], label %[[SCALAR_PH]]
779; VEC:       [[SCALAR_PH]]:
780; VEC-NEXT:    [[BC_RESUME_VAL:%.*]] = phi i64 [ [[N_VEC]], %[[MIDDLE_BLOCK]] ], [ 0, %[[ENTRY]] ]
781; VEC-NEXT:    [[BC_RESUME_VAL5:%.*]] = phi float [ [[TMP1]], %[[MIDDLE_BLOCK]] ], [ [[INIT]], %[[ENTRY]] ]
782; VEC-NEXT:    br label %[[LOOP:.*]]
783; VEC:       [[LOOP]]:
784; VEC-NEXT:    [[IV:%.*]] = phi i64 [ [[BC_RESUME_VAL]], %[[SCALAR_PH]] ], [ [[IV_NEXT:%.*]], %[[LOOP]] ]
785; VEC-NEXT:    [[FP_IV:%.*]] = phi float [ [[BC_RESUME_VAL5]], %[[SCALAR_PH]] ], [ [[ADD:%.*]], %[[LOOP]] ]
786; VEC-NEXT:    [[GEP_A:%.*]] = getelementptr inbounds float, ptr [[A]], i64 [[IV]]
787; VEC-NEXT:    store float [[FP_IV]], ptr [[GEP_A]], align 4
788; VEC-NEXT:    [[ADD]] = fadd fast float [[FP_IV]], [[FPINC]]
789; VEC-NEXT:    [[IV_NEXT]] = add nuw nsw i64 [[IV]], 1
790; VEC-NEXT:    [[EC:%.*]] = icmp eq i64 [[IV_NEXT]], [[N]]
791; VEC-NEXT:    br i1 [[EC]], label %[[EXIT]], label %[[LOOP]], {{!llvm.loop ![0-9]+}}
792; VEC:       [[EXIT]]:
793; VEC-NEXT:    [[ADD_LCSSA:%.*]] = phi float [ [[ADD]], %[[LOOP]] ], [ [[TMP1]], %[[MIDDLE_BLOCK]] ]
794; VEC-NEXT:    ret float [[ADD_LCSSA]]
795;
796; INTERLEAVE-LABEL: define float @fp_postinc_use_fadd(
797; INTERLEAVE-SAME: float [[INIT:%.*]], ptr noalias captures(none) [[A:%.*]], i64 [[N:%.*]], float [[FPINC:%.*]]) {
798; INTERLEAVE-NEXT:  [[ENTRY:.*]]:
799; INTERLEAVE-NEXT:    [[MIN_ITERS_CHECK:%.*]] = icmp ult i64 [[N]], 2
800; INTERLEAVE-NEXT:    br i1 [[MIN_ITERS_CHECK]], label %[[SCALAR_PH:.*]], label %[[VECTOR_PH:.*]]
801; INTERLEAVE:       [[VECTOR_PH]]:
802; INTERLEAVE-NEXT:    [[N_MOD_VF:%.*]] = urem i64 [[N]], 2
803; INTERLEAVE-NEXT:    [[N_VEC:%.*]] = sub i64 [[N]], [[N_MOD_VF]]
804; INTERLEAVE-NEXT:    [[DOTCAST:%.*]] = sitofp i64 [[N_VEC]] to float
805; INTERLEAVE-NEXT:    [[TMP0:%.*]] = fmul fast float [[FPINC]], [[DOTCAST]]
806; INTERLEAVE-NEXT:    [[TMP1:%.*]] = fadd fast float [[INIT]], [[TMP0]]
807; INTERLEAVE-NEXT:    br label %[[VECTOR_BODY:.*]]
808; INTERLEAVE:       [[VECTOR_BODY]]:
809; INTERLEAVE-NEXT:    [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]
810; INTERLEAVE-NEXT:    [[TMP2:%.*]] = add i64 [[INDEX]], 0
811; INTERLEAVE-NEXT:    [[TMP3:%.*]] = add i64 [[INDEX]], 1
812; INTERLEAVE-NEXT:    [[DOTCAST1:%.*]] = sitofp i64 [[INDEX]] to float
813; INTERLEAVE-NEXT:    [[TMP4:%.*]] = fmul fast float [[FPINC]], [[DOTCAST1]]
814; INTERLEAVE-NEXT:    [[OFFSET_IDX:%.*]] = fadd fast float [[INIT]], [[TMP4]]
815; INTERLEAVE-NEXT:    [[TMP5:%.*]] = fmul fast float 0.000000e+00, [[FPINC]]
816; INTERLEAVE-NEXT:    [[TMP6:%.*]] = fadd fast float [[OFFSET_IDX]], [[TMP5]]
817; INTERLEAVE-NEXT:    [[TMP7:%.*]] = fmul fast float 1.000000e+00, [[FPINC]]
818; INTERLEAVE-NEXT:    [[TMP8:%.*]] = fadd fast float [[OFFSET_IDX]], [[TMP7]]
819; INTERLEAVE-NEXT:    [[TMP9:%.*]] = getelementptr inbounds float, ptr [[A]], i64 [[TMP2]]
820; INTERLEAVE-NEXT:    [[TMP10:%.*]] = getelementptr inbounds float, ptr [[A]], i64 [[TMP3]]
821; INTERLEAVE-NEXT:    store float [[TMP6]], ptr [[TMP9]], align 4
822; INTERLEAVE-NEXT:    store float [[TMP8]], ptr [[TMP10]], align 4
823; INTERLEAVE-NEXT:    [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 2
824; INTERLEAVE-NEXT:    [[TMP11:%.*]] = icmp eq i64 [[INDEX_NEXT]], [[N_VEC]]
825; INTERLEAVE-NEXT:    br i1 [[TMP11]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], {{!llvm.loop ![0-9]+}}
826; INTERLEAVE:       [[MIDDLE_BLOCK]]:
827; INTERLEAVE-NEXT:    [[CMP_N:%.*]] = icmp eq i64 [[N]], [[N_VEC]]
828; INTERLEAVE-NEXT:    br i1 [[CMP_N]], label %[[EXIT:.*]], label %[[SCALAR_PH]]
829; INTERLEAVE:       [[SCALAR_PH]]:
830; INTERLEAVE-NEXT:    [[BC_RESUME_VAL:%.*]] = phi i64 [ [[N_VEC]], %[[MIDDLE_BLOCK]] ], [ 0, %[[ENTRY]] ]
831; INTERLEAVE-NEXT:    [[BC_RESUME_VAL2:%.*]] = phi float [ [[TMP1]], %[[MIDDLE_BLOCK]] ], [ [[INIT]], %[[ENTRY]] ]
832; INTERLEAVE-NEXT:    br label %[[LOOP:.*]]
833; INTERLEAVE:       [[LOOP]]:
834; INTERLEAVE-NEXT:    [[IV:%.*]] = phi i64 [ [[BC_RESUME_VAL]], %[[SCALAR_PH]] ], [ [[IV_NEXT:%.*]], %[[LOOP]] ]
835; INTERLEAVE-NEXT:    [[FP_IV:%.*]] = phi float [ [[BC_RESUME_VAL2]], %[[SCALAR_PH]] ], [ [[ADD:%.*]], %[[LOOP]] ]
836; INTERLEAVE-NEXT:    [[GEP_A:%.*]] = getelementptr inbounds float, ptr [[A]], i64 [[IV]]
837; INTERLEAVE-NEXT:    store float [[FP_IV]], ptr [[GEP_A]], align 4
838; INTERLEAVE-NEXT:    [[ADD]] = fadd fast float [[FP_IV]], [[FPINC]]
839; INTERLEAVE-NEXT:    [[IV_NEXT]] = add nuw nsw i64 [[IV]], 1
840; INTERLEAVE-NEXT:    [[EC:%.*]] = icmp eq i64 [[IV_NEXT]], [[N]]
841; INTERLEAVE-NEXT:    br i1 [[EC]], label %[[EXIT]], label %[[LOOP]], {{!llvm.loop ![0-9]+}}
842; INTERLEAVE:       [[EXIT]]:
843; INTERLEAVE-NEXT:    [[ADD_LCSSA:%.*]] = phi float [ [[ADD]], %[[LOOP]] ], [ [[TMP1]], %[[MIDDLE_BLOCK]] ]
844; INTERLEAVE-NEXT:    ret float [[ADD_LCSSA]]
845;
846entry:
847  br label %loop
848
849loop:
850  %iv = phi i64 [ 0, %entry ], [ %iv.next, %loop ]
851  %fp.iv = phi float [ %init, %entry ], [ %add, %loop ]
852  %gep.A = getelementptr inbounds float, ptr %A, i64 %iv
853  store float %fp.iv, ptr %gep.A, align 4
854  %add = fadd fast float %fp.iv, %fpinc
855  %iv.next = add nuw nsw i64 %iv, 1
856  %ec = icmp eq i64 %iv.next, %N
857  br i1 %ec, label %exit, label %loop
858
859exit:
860  ret float %add
861}
862
863define float @fp_postinc_use_fadd_ops_swapped(float %init, ptr noalias nocapture %A, i64 %N, float %fpinc) {
864; VEC-LABEL: define float @fp_postinc_use_fadd_ops_swapped(
865; VEC-SAME: float [[INIT:%.*]], ptr noalias captures(none) [[A:%.*]], i64 [[N:%.*]], float [[FPINC:%.*]]) {
866; VEC-NEXT:  [[ENTRY:.*]]:
867; VEC-NEXT:    [[MIN_ITERS_CHECK:%.*]] = icmp ult i64 [[N]], 2
868; VEC-NEXT:    br i1 [[MIN_ITERS_CHECK]], label %[[SCALAR_PH:.*]], label %[[VECTOR_PH:.*]]
869; VEC:       [[VECTOR_PH]]:
870; VEC-NEXT:    [[N_MOD_VF:%.*]] = urem i64 [[N]], 2
871; VEC-NEXT:    [[N_VEC:%.*]] = sub i64 [[N]], [[N_MOD_VF]]
872; VEC-NEXT:    [[DOTCAST:%.*]] = sitofp i64 [[N_VEC]] to float
873; VEC-NEXT:    [[TMP0:%.*]] = fmul fast float [[FPINC]], [[DOTCAST]]
874; VEC-NEXT:    [[TMP1:%.*]] = fadd fast float [[INIT]], [[TMP0]]
875; VEC-NEXT:    [[DOTSPLATINSERT:%.*]] = insertelement <2 x float> poison, float [[INIT]], i64 0
876; VEC-NEXT:    [[DOTSPLAT:%.*]] = shufflevector <2 x float> [[DOTSPLATINSERT]], <2 x float> poison, <2 x i32> zeroinitializer
877; VEC-NEXT:    [[DOTSPLATINSERT1:%.*]] = insertelement <2 x float> poison, float [[FPINC]], i64 0
878; VEC-NEXT:    [[DOTSPLAT2:%.*]] = shufflevector <2 x float> [[DOTSPLATINSERT1]], <2 x float> poison, <2 x i32> zeroinitializer
879; VEC-NEXT:    [[TMP2:%.*]] = fmul fast <2 x float> <float 0.000000e+00, float 1.000000e+00>, [[DOTSPLAT2]]
880; VEC-NEXT:    [[INDUCTION:%.*]] = fadd fast <2 x float> [[DOTSPLAT]], [[TMP2]]
881; VEC-NEXT:    [[TMP3:%.*]] = fmul fast float [[FPINC]], 2.000000e+00
882; VEC-NEXT:    [[DOTSPLATINSERT3:%.*]] = insertelement <2 x float> poison, float [[TMP3]], i64 0
883; VEC-NEXT:    [[DOTSPLAT4:%.*]] = shufflevector <2 x float> [[DOTSPLATINSERT3]], <2 x float> poison, <2 x i32> zeroinitializer
884; VEC-NEXT:    br label %[[VECTOR_BODY:.*]]
885; VEC:       [[VECTOR_BODY]]:
886; VEC-NEXT:    [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]
887; VEC-NEXT:    [[VEC_IND:%.*]] = phi <2 x float> [ [[INDUCTION]], %[[VECTOR_PH]] ], [ [[VEC_IND_NEXT:%.*]], %[[VECTOR_BODY]] ]
888; VEC-NEXT:    [[TMP4:%.*]] = add i64 [[INDEX]], 0
889; VEC-NEXT:    [[TMP5:%.*]] = getelementptr inbounds float, ptr [[A]], i64 [[TMP4]]
890; VEC-NEXT:    [[TMP6:%.*]] = getelementptr inbounds float, ptr [[TMP5]], i32 0
891; VEC-NEXT:    store <2 x float> [[VEC_IND]], ptr [[TMP6]], align 4
892; VEC-NEXT:    [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 2
893; VEC-NEXT:    [[VEC_IND_NEXT]] = fadd fast <2 x float> [[VEC_IND]], [[DOTSPLAT4]]
894; VEC-NEXT:    [[TMP7:%.*]] = icmp eq i64 [[INDEX_NEXT]], [[N_VEC]]
895; VEC-NEXT:    br i1 [[TMP7]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], {{!llvm.loop ![0-9]+}}
896; VEC:       [[MIDDLE_BLOCK]]:
897; VEC-NEXT:    [[CMP_N:%.*]] = icmp eq i64 [[N]], [[N_VEC]]
898; VEC-NEXT:    br i1 [[CMP_N]], label %[[EXIT:.*]], label %[[SCALAR_PH]]
899; VEC:       [[SCALAR_PH]]:
900; VEC-NEXT:    [[BC_RESUME_VAL:%.*]] = phi i64 [ [[N_VEC]], %[[MIDDLE_BLOCK]] ], [ 0, %[[ENTRY]] ]
901; VEC-NEXT:    [[BC_RESUME_VAL5:%.*]] = phi float [ [[TMP1]], %[[MIDDLE_BLOCK]] ], [ [[INIT]], %[[ENTRY]] ]
902; VEC-NEXT:    br label %[[LOOP:.*]]
903; VEC:       [[LOOP]]:
904; VEC-NEXT:    [[IV:%.*]] = phi i64 [ [[BC_RESUME_VAL]], %[[SCALAR_PH]] ], [ [[IV_NEXT:%.*]], %[[LOOP]] ]
905; VEC-NEXT:    [[FP_IV:%.*]] = phi float [ [[BC_RESUME_VAL5]], %[[SCALAR_PH]] ], [ [[ADD:%.*]], %[[LOOP]] ]
906; VEC-NEXT:    [[GEP_A:%.*]] = getelementptr inbounds float, ptr [[A]], i64 [[IV]]
907; VEC-NEXT:    store float [[FP_IV]], ptr [[GEP_A]], align 4
908; VEC-NEXT:    [[ADD]] = fadd fast float [[FPINC]], [[FP_IV]]
909; VEC-NEXT:    [[IV_NEXT]] = add nuw nsw i64 [[IV]], 1
910; VEC-NEXT:    [[EC:%.*]] = icmp eq i64 [[IV_NEXT]], [[N]]
911; VEC-NEXT:    br i1 [[EC]], label %[[EXIT]], label %[[LOOP]], {{!llvm.loop ![0-9]+}}
912; VEC:       [[EXIT]]:
913; VEC-NEXT:    [[ADD_LCSSA:%.*]] = phi float [ [[ADD]], %[[LOOP]] ], [ [[TMP1]], %[[MIDDLE_BLOCK]] ]
914; VEC-NEXT:    ret float [[ADD_LCSSA]]
915;
916; INTERLEAVE-LABEL: define float @fp_postinc_use_fadd_ops_swapped(
917; INTERLEAVE-SAME: float [[INIT:%.*]], ptr noalias captures(none) [[A:%.*]], i64 [[N:%.*]], float [[FPINC:%.*]]) {
918; INTERLEAVE-NEXT:  [[ENTRY:.*]]:
919; INTERLEAVE-NEXT:    [[MIN_ITERS_CHECK:%.*]] = icmp ult i64 [[N]], 2
920; INTERLEAVE-NEXT:    br i1 [[MIN_ITERS_CHECK]], label %[[SCALAR_PH:.*]], label %[[VECTOR_PH:.*]]
921; INTERLEAVE:       [[VECTOR_PH]]:
922; INTERLEAVE-NEXT:    [[N_MOD_VF:%.*]] = urem i64 [[N]], 2
923; INTERLEAVE-NEXT:    [[N_VEC:%.*]] = sub i64 [[N]], [[N_MOD_VF]]
924; INTERLEAVE-NEXT:    [[DOTCAST:%.*]] = sitofp i64 [[N_VEC]] to float
925; INTERLEAVE-NEXT:    [[TMP0:%.*]] = fmul fast float [[FPINC]], [[DOTCAST]]
926; INTERLEAVE-NEXT:    [[TMP1:%.*]] = fadd fast float [[INIT]], [[TMP0]]
927; INTERLEAVE-NEXT:    br label %[[VECTOR_BODY:.*]]
928; INTERLEAVE:       [[VECTOR_BODY]]:
929; INTERLEAVE-NEXT:    [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]
930; INTERLEAVE-NEXT:    [[TMP2:%.*]] = add i64 [[INDEX]], 0
931; INTERLEAVE-NEXT:    [[TMP3:%.*]] = add i64 [[INDEX]], 1
932; INTERLEAVE-NEXT:    [[DOTCAST1:%.*]] = sitofp i64 [[INDEX]] to float
933; INTERLEAVE-NEXT:    [[TMP4:%.*]] = fmul fast float [[FPINC]], [[DOTCAST1]]
934; INTERLEAVE-NEXT:    [[OFFSET_IDX:%.*]] = fadd fast float [[INIT]], [[TMP4]]
935; INTERLEAVE-NEXT:    [[TMP5:%.*]] = fmul fast float 0.000000e+00, [[FPINC]]
936; INTERLEAVE-NEXT:    [[TMP6:%.*]] = fadd fast float [[OFFSET_IDX]], [[TMP5]]
937; INTERLEAVE-NEXT:    [[TMP7:%.*]] = fmul fast float 1.000000e+00, [[FPINC]]
938; INTERLEAVE-NEXT:    [[TMP8:%.*]] = fadd fast float [[OFFSET_IDX]], [[TMP7]]
939; INTERLEAVE-NEXT:    [[TMP9:%.*]] = getelementptr inbounds float, ptr [[A]], i64 [[TMP2]]
940; INTERLEAVE-NEXT:    [[TMP10:%.*]] = getelementptr inbounds float, ptr [[A]], i64 [[TMP3]]
941; INTERLEAVE-NEXT:    store float [[TMP6]], ptr [[TMP9]], align 4
942; INTERLEAVE-NEXT:    store float [[TMP8]], ptr [[TMP10]], align 4
943; INTERLEAVE-NEXT:    [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 2
944; INTERLEAVE-NEXT:    [[TMP11:%.*]] = icmp eq i64 [[INDEX_NEXT]], [[N_VEC]]
945; INTERLEAVE-NEXT:    br i1 [[TMP11]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], {{!llvm.loop ![0-9]+}}
946; INTERLEAVE:       [[MIDDLE_BLOCK]]:
947; INTERLEAVE-NEXT:    [[CMP_N:%.*]] = icmp eq i64 [[N]], [[N_VEC]]
948; INTERLEAVE-NEXT:    br i1 [[CMP_N]], label %[[EXIT:.*]], label %[[SCALAR_PH]]
949; INTERLEAVE:       [[SCALAR_PH]]:
950; INTERLEAVE-NEXT:    [[BC_RESUME_VAL:%.*]] = phi i64 [ [[N_VEC]], %[[MIDDLE_BLOCK]] ], [ 0, %[[ENTRY]] ]
951; INTERLEAVE-NEXT:    [[BC_RESUME_VAL2:%.*]] = phi float [ [[TMP1]], %[[MIDDLE_BLOCK]] ], [ [[INIT]], %[[ENTRY]] ]
952; INTERLEAVE-NEXT:    br label %[[LOOP:.*]]
953; INTERLEAVE:       [[LOOP]]:
954; INTERLEAVE-NEXT:    [[IV:%.*]] = phi i64 [ [[BC_RESUME_VAL]], %[[SCALAR_PH]] ], [ [[IV_NEXT:%.*]], %[[LOOP]] ]
955; INTERLEAVE-NEXT:    [[FP_IV:%.*]] = phi float [ [[BC_RESUME_VAL2]], %[[SCALAR_PH]] ], [ [[ADD:%.*]], %[[LOOP]] ]
956; INTERLEAVE-NEXT:    [[GEP_A:%.*]] = getelementptr inbounds float, ptr [[A]], i64 [[IV]]
957; INTERLEAVE-NEXT:    store float [[FP_IV]], ptr [[GEP_A]], align 4
958; INTERLEAVE-NEXT:    [[ADD]] = fadd fast float [[FPINC]], [[FP_IV]]
959; INTERLEAVE-NEXT:    [[IV_NEXT]] = add nuw nsw i64 [[IV]], 1
960; INTERLEAVE-NEXT:    [[EC:%.*]] = icmp eq i64 [[IV_NEXT]], [[N]]
961; INTERLEAVE-NEXT:    br i1 [[EC]], label %[[EXIT]], label %[[LOOP]], {{!llvm.loop ![0-9]+}}
962; INTERLEAVE:       [[EXIT]]:
963; INTERLEAVE-NEXT:    [[ADD_LCSSA:%.*]] = phi float [ [[ADD]], %[[LOOP]] ], [ [[TMP1]], %[[MIDDLE_BLOCK]] ]
964; INTERLEAVE-NEXT:    ret float [[ADD_LCSSA]]
965;
966entry:
967  br label %loop
968
969loop:
970  %iv = phi i64 [ 0, %entry ], [ %iv.next, %loop ]
971  %fp.iv = phi float [ %init, %entry ], [ %add, %loop ]
972  %gep.A = getelementptr inbounds float, ptr %A, i64 %iv
973  store float %fp.iv, ptr %gep.A, align 4
974  %add = fadd fast float %fpinc, %fp.iv
975  %iv.next = add nuw nsw i64 %iv, 1
976  %ec = icmp eq i64 %iv.next, %N
977  br i1 %ec, label %exit, label %loop
978
979exit:
980  ret float %add
981}
982
983define float @fp_postinc_use_fsub(float %init, ptr noalias nocapture %A, i64 %N, float %fpinc) {
984; VEC-LABEL: define float @fp_postinc_use_fsub(
985; VEC-SAME: float [[INIT:%.*]], ptr noalias captures(none) [[A:%.*]], i64 [[N:%.*]], float [[FPINC:%.*]]) {
986; VEC-NEXT:  [[ENTRY:.*]]:
987; VEC-NEXT:    [[MIN_ITERS_CHECK:%.*]] = icmp ult i64 [[N]], 2
988; VEC-NEXT:    br i1 [[MIN_ITERS_CHECK]], label %[[SCALAR_PH:.*]], label %[[VECTOR_PH:.*]]
989; VEC:       [[VECTOR_PH]]:
990; VEC-NEXT:    [[N_MOD_VF:%.*]] = urem i64 [[N]], 2
991; VEC-NEXT:    [[N_VEC:%.*]] = sub i64 [[N]], [[N_MOD_VF]]
992; VEC-NEXT:    [[DOTCAST:%.*]] = sitofp i64 [[N_VEC]] to float
993; VEC-NEXT:    [[TMP0:%.*]] = fmul fast float [[FPINC]], [[DOTCAST]]
994; VEC-NEXT:    [[TMP1:%.*]] = fsub fast float [[INIT]], [[TMP0]]
995; VEC-NEXT:    [[DOTSPLATINSERT:%.*]] = insertelement <2 x float> poison, float [[INIT]], i64 0
996; VEC-NEXT:    [[DOTSPLAT:%.*]] = shufflevector <2 x float> [[DOTSPLATINSERT]], <2 x float> poison, <2 x i32> zeroinitializer
997; VEC-NEXT:    [[DOTSPLATINSERT1:%.*]] = insertelement <2 x float> poison, float [[FPINC]], i64 0
998; VEC-NEXT:    [[DOTSPLAT2:%.*]] = shufflevector <2 x float> [[DOTSPLATINSERT1]], <2 x float> poison, <2 x i32> zeroinitializer
999; VEC-NEXT:    [[TMP2:%.*]] = fmul fast <2 x float> <float 0.000000e+00, float 1.000000e+00>, [[DOTSPLAT2]]
1000; VEC-NEXT:    [[INDUCTION:%.*]] = fsub fast <2 x float> [[DOTSPLAT]], [[TMP2]]
1001; VEC-NEXT:    [[TMP3:%.*]] = fmul fast float [[FPINC]], 2.000000e+00
1002; VEC-NEXT:    [[DOTSPLATINSERT3:%.*]] = insertelement <2 x float> poison, float [[TMP3]], i64 0
1003; VEC-NEXT:    [[DOTSPLAT4:%.*]] = shufflevector <2 x float> [[DOTSPLATINSERT3]], <2 x float> poison, <2 x i32> zeroinitializer
1004; VEC-NEXT:    br label %[[VECTOR_BODY:.*]]
1005; VEC:       [[VECTOR_BODY]]:
1006; VEC-NEXT:    [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]
1007; VEC-NEXT:    [[VEC_IND:%.*]] = phi <2 x float> [ [[INDUCTION]], %[[VECTOR_PH]] ], [ [[VEC_IND_NEXT:%.*]], %[[VECTOR_BODY]] ]
1008; VEC-NEXT:    [[TMP4:%.*]] = add i64 [[INDEX]], 0
1009; VEC-NEXT:    [[TMP5:%.*]] = getelementptr inbounds float, ptr [[A]], i64 [[TMP4]]
1010; VEC-NEXT:    [[TMP6:%.*]] = getelementptr inbounds float, ptr [[TMP5]], i32 0
1011; VEC-NEXT:    store <2 x float> [[VEC_IND]], ptr [[TMP6]], align 4
1012; VEC-NEXT:    [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 2
1013; VEC-NEXT:    [[VEC_IND_NEXT]] = fsub fast <2 x float> [[VEC_IND]], [[DOTSPLAT4]]
1014; VEC-NEXT:    [[TMP7:%.*]] = icmp eq i64 [[INDEX_NEXT]], [[N_VEC]]
1015; VEC-NEXT:    br i1 [[TMP7]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], {{!llvm.loop ![0-9]+}}
1016; VEC:       [[MIDDLE_BLOCK]]:
1017; VEC-NEXT:    [[CMP_N:%.*]] = icmp eq i64 [[N]], [[N_VEC]]
1018; VEC-NEXT:    br i1 [[CMP_N]], label %[[EXIT:.*]], label %[[SCALAR_PH]]
1019; VEC:       [[SCALAR_PH]]:
1020; VEC-NEXT:    [[BC_RESUME_VAL:%.*]] = phi i64 [ [[N_VEC]], %[[MIDDLE_BLOCK]] ], [ 0, %[[ENTRY]] ]
1021; VEC-NEXT:    [[BC_RESUME_VAL5:%.*]] = phi float [ [[TMP1]], %[[MIDDLE_BLOCK]] ], [ [[INIT]], %[[ENTRY]] ]
1022; VEC-NEXT:    br label %[[LOOP:.*]]
1023; VEC:       [[LOOP]]:
1024; VEC-NEXT:    [[IV:%.*]] = phi i64 [ [[BC_RESUME_VAL]], %[[SCALAR_PH]] ], [ [[IV_NEXT:%.*]], %[[LOOP]] ]
1025; VEC-NEXT:    [[FP_IV:%.*]] = phi float [ [[BC_RESUME_VAL5]], %[[SCALAR_PH]] ], [ [[ADD:%.*]], %[[LOOP]] ]
1026; VEC-NEXT:    [[GEP_A:%.*]] = getelementptr inbounds float, ptr [[A]], i64 [[IV]]
1027; VEC-NEXT:    store float [[FP_IV]], ptr [[GEP_A]], align 4
1028; VEC-NEXT:    [[ADD]] = fsub fast float [[FP_IV]], [[FPINC]]
1029; VEC-NEXT:    [[IV_NEXT]] = add nuw nsw i64 [[IV]], 1
1030; VEC-NEXT:    [[EC:%.*]] = icmp eq i64 [[IV_NEXT]], [[N]]
1031; VEC-NEXT:    br i1 [[EC]], label %[[EXIT]], label %[[LOOP]], {{!llvm.loop ![0-9]+}}
1032; VEC:       [[EXIT]]:
1033; VEC-NEXT:    [[ADD_LCSSA:%.*]] = phi float [ [[ADD]], %[[LOOP]] ], [ [[TMP1]], %[[MIDDLE_BLOCK]] ]
1034; VEC-NEXT:    ret float [[ADD_LCSSA]]
1035;
1036; INTERLEAVE-LABEL: define float @fp_postinc_use_fsub(
1037; INTERLEAVE-SAME: float [[INIT:%.*]], ptr noalias captures(none) [[A:%.*]], i64 [[N:%.*]], float [[FPINC:%.*]]) {
1038; INTERLEAVE-NEXT:  [[ENTRY:.*]]:
1039; INTERLEAVE-NEXT:    [[MIN_ITERS_CHECK:%.*]] = icmp ult i64 [[N]], 2
1040; INTERLEAVE-NEXT:    br i1 [[MIN_ITERS_CHECK]], label %[[SCALAR_PH:.*]], label %[[VECTOR_PH:.*]]
1041; INTERLEAVE:       [[VECTOR_PH]]:
1042; INTERLEAVE-NEXT:    [[N_MOD_VF:%.*]] = urem i64 [[N]], 2
1043; INTERLEAVE-NEXT:    [[N_VEC:%.*]] = sub i64 [[N]], [[N_MOD_VF]]
1044; INTERLEAVE-NEXT:    [[DOTCAST:%.*]] = sitofp i64 [[N_VEC]] to float
1045; INTERLEAVE-NEXT:    [[TMP0:%.*]] = fmul fast float [[FPINC]], [[DOTCAST]]
1046; INTERLEAVE-NEXT:    [[TMP1:%.*]] = fsub fast float [[INIT]], [[TMP0]]
1047; INTERLEAVE-NEXT:    br label %[[VECTOR_BODY:.*]]
1048; INTERLEAVE:       [[VECTOR_BODY]]:
1049; INTERLEAVE-NEXT:    [[INDEX:%.*]] = phi i64 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]
1050; INTERLEAVE-NEXT:    [[TMP2:%.*]] = add i64 [[INDEX]], 0
1051; INTERLEAVE-NEXT:    [[TMP3:%.*]] = add i64 [[INDEX]], 1
1052; INTERLEAVE-NEXT:    [[DOTCAST1:%.*]] = sitofp i64 [[INDEX]] to float
1053; INTERLEAVE-NEXT:    [[TMP4:%.*]] = fmul fast float [[FPINC]], [[DOTCAST1]]
1054; INTERLEAVE-NEXT:    [[OFFSET_IDX:%.*]] = fsub fast float [[INIT]], [[TMP4]]
1055; INTERLEAVE-NEXT:    [[TMP5:%.*]] = fmul fast float 0.000000e+00, [[FPINC]]
1056; INTERLEAVE-NEXT:    [[TMP6:%.*]] = fsub fast float [[OFFSET_IDX]], [[TMP5]]
1057; INTERLEAVE-NEXT:    [[TMP7:%.*]] = fmul fast float 1.000000e+00, [[FPINC]]
1058; INTERLEAVE-NEXT:    [[TMP8:%.*]] = fsub fast float [[OFFSET_IDX]], [[TMP7]]
1059; INTERLEAVE-NEXT:    [[TMP9:%.*]] = getelementptr inbounds float, ptr [[A]], i64 [[TMP2]]
1060; INTERLEAVE-NEXT:    [[TMP10:%.*]] = getelementptr inbounds float, ptr [[A]], i64 [[TMP3]]
1061; INTERLEAVE-NEXT:    store float [[TMP6]], ptr [[TMP9]], align 4
1062; INTERLEAVE-NEXT:    store float [[TMP8]], ptr [[TMP10]], align 4
1063; INTERLEAVE-NEXT:    [[INDEX_NEXT]] = add nuw i64 [[INDEX]], 2
1064; INTERLEAVE-NEXT:    [[TMP11:%.*]] = icmp eq i64 [[INDEX_NEXT]], [[N_VEC]]
1065; INTERLEAVE-NEXT:    br i1 [[TMP11]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], {{!llvm.loop ![0-9]+}}
1066; INTERLEAVE:       [[MIDDLE_BLOCK]]:
1067; INTERLEAVE-NEXT:    [[CMP_N:%.*]] = icmp eq i64 [[N]], [[N_VEC]]
1068; INTERLEAVE-NEXT:    br i1 [[CMP_N]], label %[[EXIT:.*]], label %[[SCALAR_PH]]
1069; INTERLEAVE:       [[SCALAR_PH]]:
1070; INTERLEAVE-NEXT:    [[BC_RESUME_VAL:%.*]] = phi i64 [ [[N_VEC]], %[[MIDDLE_BLOCK]] ], [ 0, %[[ENTRY]] ]
1071; INTERLEAVE-NEXT:    [[BC_RESUME_VAL2:%.*]] = phi float [ [[TMP1]], %[[MIDDLE_BLOCK]] ], [ [[INIT]], %[[ENTRY]] ]
1072; INTERLEAVE-NEXT:    br label %[[LOOP:.*]]
1073; INTERLEAVE:       [[LOOP]]:
1074; INTERLEAVE-NEXT:    [[IV:%.*]] = phi i64 [ [[BC_RESUME_VAL]], %[[SCALAR_PH]] ], [ [[IV_NEXT:%.*]], %[[LOOP]] ]
1075; INTERLEAVE-NEXT:    [[FP_IV:%.*]] = phi float [ [[BC_RESUME_VAL2]], %[[SCALAR_PH]] ], [ [[ADD:%.*]], %[[LOOP]] ]
1076; INTERLEAVE-NEXT:    [[GEP_A:%.*]] = getelementptr inbounds float, ptr [[A]], i64 [[IV]]
1077; INTERLEAVE-NEXT:    store float [[FP_IV]], ptr [[GEP_A]], align 4
1078; INTERLEAVE-NEXT:    [[ADD]] = fsub fast float [[FP_IV]], [[FPINC]]
1079; INTERLEAVE-NEXT:    [[IV_NEXT]] = add nuw nsw i64 [[IV]], 1
1080; INTERLEAVE-NEXT:    [[EC:%.*]] = icmp eq i64 [[IV_NEXT]], [[N]]
1081; INTERLEAVE-NEXT:    br i1 [[EC]], label %[[EXIT]], label %[[LOOP]], {{!llvm.loop ![0-9]+}}
1082; INTERLEAVE:       [[EXIT]]:
1083; INTERLEAVE-NEXT:    [[ADD_LCSSA:%.*]] = phi float [ [[ADD]], %[[LOOP]] ], [ [[TMP1]], %[[MIDDLE_BLOCK]] ]
1084; INTERLEAVE-NEXT:    ret float [[ADD_LCSSA]]
1085;
1086entry:
1087  br label %loop
1088
1089loop:
1090  %iv = phi i64 [ 0, %entry ], [ %iv.next, %loop ]
1091  %fp.iv = phi float [ %init, %entry ], [ %add, %loop ]
1092  %gep.A = getelementptr inbounds float, ptr %A, i64 %iv
1093  store float %fp.iv, ptr %gep.A, align 4
1094  %add = fsub fast float %fp.iv, %fpinc
1095  %iv.next = add nuw nsw i64 %iv, 1
1096  %ec = icmp eq i64 %iv.next, %N
1097  br i1 %ec, label %exit, label %loop
1098
1099exit:
1100  ret float %add
1101}
1102
1103; Test case for https://github.com/llvm/llvm-project/issues/121745.
1104define i32 @test_iv_uniform_with_outside_use_scev_simplification(ptr %dst) {
1105; VEC-LABEL: define i32 @test_iv_uniform_with_outside_use_scev_simplification(
1106; VEC-SAME: ptr [[DST:%.*]]) {
1107; VEC-NEXT:  [[ENTRY:.*]]:
1108; VEC-NEXT:    [[STEP_1:%.*]] = sext i8 0 to i32
1109; VEC-NEXT:    [[STEP_2:%.*]] = add nsw i32 [[STEP_1]], 1
1110; VEC-NEXT:    br i1 false, label %[[SCALAR_PH:.*]], label %[[VECTOR_PH:.*]]
1111; VEC:       [[VECTOR_PH]]:
1112; VEC-NEXT:    br label %[[VECTOR_BODY:.*]]
1113; VEC:       [[VECTOR_BODY]]:
1114; VEC-NEXT:    [[INDEX:%.*]] = phi i32 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]
1115; VEC-NEXT:    [[TMP0:%.*]] = add i32 [[INDEX]], 0
1116; VEC-NEXT:    [[TMP6:%.*]] = add i32 [[INDEX]], 1
1117; VEC-NEXT:    [[TMP1:%.*]] = getelementptr inbounds i16, ptr [[DST]], i32 [[TMP0]]
1118; VEC-NEXT:    [[TMP2:%.*]] = getelementptr inbounds i16, ptr [[TMP1]], i32 0
1119; VEC-NEXT:    store <2 x i16> zeroinitializer, ptr [[TMP2]], align 2
1120; VEC-NEXT:    [[TMP4:%.*]] = add i32 [[STEP_2]], [[TMP0]]
1121; VEC-NEXT:    [[TMP5:%.*]] = add i32 [[STEP_2]], [[TMP6]]
1122; VEC-NEXT:    [[INDEX_NEXT]] = add nuw i32 [[INDEX]], 2
1123; VEC-NEXT:    [[TMP3:%.*]] = icmp eq i32 [[INDEX_NEXT]], 8
1124; VEC-NEXT:    br i1 [[TMP3]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], {{!llvm.loop ![0-9]+}}
1125; VEC:       [[MIDDLE_BLOCK]]:
1126; VEC-NEXT:    br i1 true, label %[[E_EXIT:.*]], label %[[SCALAR_PH]]
1127; VEC:       [[SCALAR_PH]]:
1128; VEC-NEXT:    [[BC_RESUME_VAL:%.*]] = phi i32 [ 8, %[[MIDDLE_BLOCK]] ], [ 0, %[[ENTRY]] ]
1129; VEC-NEXT:    br label %[[LOOP:.*]]
1130; VEC:       [[LOOP]]:
1131; VEC-NEXT:    [[IV:%.*]] = phi i32 [ [[BC_RESUME_VAL]], %[[SCALAR_PH]] ], [ [[IV_NEXT:%.*]], %[[LOOP]] ]
1132; VEC-NEXT:    [[GEP_DST:%.*]] = getelementptr inbounds i16, ptr [[DST]], i32 [[IV]]
1133; VEC-NEXT:    store i16 0, ptr [[GEP_DST]], align 2
1134; VEC-NEXT:    [[IV_NEXT]] = add i32 [[STEP_2]], [[IV]]
1135; VEC-NEXT:    [[CMP_I:%.*]] = icmp slt i32 [[IV_NEXT]], 8
1136; VEC-NEXT:    br i1 [[CMP_I]], label %[[LOOP]], label %[[E_EXIT]], {{!llvm.loop ![0-9]+}}
1137; VEC:       [[E_EXIT]]:
1138; VEC-NEXT:    [[RES:%.*]] = phi i32 [ [[IV_NEXT]], %[[LOOP]] ], [ [[TMP5]], %[[MIDDLE_BLOCK]] ]
1139; VEC-NEXT:    ret i32 [[RES]]
1140;
1141; INTERLEAVE-LABEL: define i32 @test_iv_uniform_with_outside_use_scev_simplification(
1142; INTERLEAVE-SAME: ptr [[DST:%.*]]) {
1143; INTERLEAVE-NEXT:  [[ENTRY:.*]]:
1144; INTERLEAVE-NEXT:    [[STEP_1:%.*]] = sext i8 0 to i32
1145; INTERLEAVE-NEXT:    [[STEP_2:%.*]] = add nsw i32 [[STEP_1]], 1
1146; INTERLEAVE-NEXT:    br i1 false, label %[[SCALAR_PH:.*]], label %[[VECTOR_PH:.*]]
1147; INTERLEAVE:       [[VECTOR_PH]]:
1148; INTERLEAVE-NEXT:    br label %[[VECTOR_BODY:.*]]
1149; INTERLEAVE:       [[VECTOR_BODY]]:
1150; INTERLEAVE-NEXT:    [[INDEX:%.*]] = phi i32 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]
1151; INTERLEAVE-NEXT:    [[TMP0:%.*]] = add i32 [[INDEX]], 0
1152; INTERLEAVE-NEXT:    [[TMP1:%.*]] = add i32 [[INDEX]], 1
1153; INTERLEAVE-NEXT:    [[TMP2:%.*]] = getelementptr inbounds i16, ptr [[DST]], i32 [[TMP0]]
1154; INTERLEAVE-NEXT:    [[TMP3:%.*]] = getelementptr inbounds i16, ptr [[DST]], i32 [[TMP1]]
1155; INTERLEAVE-NEXT:    store i16 0, ptr [[TMP2]], align 2
1156; INTERLEAVE-NEXT:    store i16 0, ptr [[TMP3]], align 2
1157; INTERLEAVE-NEXT:    [[TMP5:%.*]] = add i32 [[STEP_2]], [[TMP1]]
1158; INTERLEAVE-NEXT:    [[INDEX_NEXT]] = add nuw i32 [[INDEX]], 2
1159; INTERLEAVE-NEXT:    [[TMP4:%.*]] = icmp eq i32 [[INDEX_NEXT]], 8
1160; INTERLEAVE-NEXT:    br i1 [[TMP4]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], {{!llvm.loop ![0-9]+}}
1161; INTERLEAVE:       [[MIDDLE_BLOCK]]:
1162; INTERLEAVE-NEXT:    br i1 true, label %[[E_EXIT:.*]], label %[[SCALAR_PH]]
1163; INTERLEAVE:       [[SCALAR_PH]]:
1164; INTERLEAVE-NEXT:    [[BC_RESUME_VAL:%.*]] = phi i32 [ 8, %[[MIDDLE_BLOCK]] ], [ 0, %[[ENTRY]] ]
1165; INTERLEAVE-NEXT:    br label %[[LOOP:.*]]
1166; INTERLEAVE:       [[LOOP]]:
1167; INTERLEAVE-NEXT:    [[IV:%.*]] = phi i32 [ [[BC_RESUME_VAL]], %[[SCALAR_PH]] ], [ [[IV_NEXT:%.*]], %[[LOOP]] ]
1168; INTERLEAVE-NEXT:    [[GEP_DST:%.*]] = getelementptr inbounds i16, ptr [[DST]], i32 [[IV]]
1169; INTERLEAVE-NEXT:    store i16 0, ptr [[GEP_DST]], align 2
1170; INTERLEAVE-NEXT:    [[IV_NEXT]] = add i32 [[STEP_2]], [[IV]]
1171; INTERLEAVE-NEXT:    [[CMP_I:%.*]] = icmp slt i32 [[IV_NEXT]], 8
1172; INTERLEAVE-NEXT:    br i1 [[CMP_I]], label %[[LOOP]], label %[[E_EXIT]], {{!llvm.loop ![0-9]+}}
1173; INTERLEAVE:       [[E_EXIT]]:
1174; INTERLEAVE-NEXT:    [[RES:%.*]] = phi i32 [ [[IV_NEXT]], %[[LOOP]] ], [ [[TMP5]], %[[MIDDLE_BLOCK]] ]
1175; INTERLEAVE-NEXT:    ret i32 [[RES]]
1176;
1177entry:
1178  %step.1 = sext i8 0 to i32
1179  %step.2 = add nsw i32 %step.1, 1
1180  br label %loop
1181
1182loop:
1183  %iv = phi i32 [ 0, %entry ], [ %iv.next, %loop ]
1184  %gep.dst = getelementptr inbounds i16, ptr %dst, i32 %iv
1185  store i16 0, ptr %gep.dst, align 2
1186  %iv.next = add i32 %step.2, %iv
1187  %cmp.i = icmp slt i32 %iv.next, 8
1188  br i1 %cmp.i, label %loop, label %e.exit
1189
1190e.exit:
1191  %res = phi i32 [ %iv.next, %loop ]
1192  ret i32 %res
1193}
1194
1195define i32 @test_iv_uniform_with_outside_use_scev_simplification_2(ptr %dst) {
1196; VEC-LABEL: define i32 @test_iv_uniform_with_outside_use_scev_simplification_2(
1197; VEC-SAME: ptr [[DST:%.*]]) {
1198; VEC-NEXT:  [[ENTRY:.*]]:
1199; VEC-NEXT:    [[STEP_1:%.*]] = sext i8 0 to i32
1200; VEC-NEXT:    [[STEP_2:%.*]] = add nsw i32 [[STEP_1]], 1
1201; VEC-NEXT:    br i1 false, label %[[SCALAR_PH:.*]], label %[[VECTOR_PH:.*]]
1202; VEC:       [[VECTOR_PH]]:
1203; VEC-NEXT:    [[BROADCAST_SPLATINSERT:%.*]] = insertelement <2 x i32> poison, i32 [[STEP_2]], i64 0
1204; VEC-NEXT:    [[BROADCAST_SPLAT:%.*]] = shufflevector <2 x i32> [[BROADCAST_SPLATINSERT]], <2 x i32> poison, <2 x i32> zeroinitializer
1205; VEC-NEXT:    br label %[[VECTOR_BODY:.*]]
1206; VEC:       [[VECTOR_BODY]]:
1207; VEC-NEXT:    [[INDEX:%.*]] = phi i32 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]
1208; VEC-NEXT:    [[VEC_IND:%.*]] = phi <2 x i32> [ <i32 0, i32 2>, %[[VECTOR_PH]] ], [ [[VEC_IND_NEXT:%.*]], %[[VECTOR_BODY]] ]
1209; VEC-NEXT:    [[OFFSET_IDX:%.*]] = mul i32 [[INDEX]], 2
1210; VEC-NEXT:    [[TMP0:%.*]] = add i32 [[OFFSET_IDX]], 0
1211; VEC-NEXT:    [[TMP1:%.*]] = add i32 [[OFFSET_IDX]], 2
1212; VEC-NEXT:    [[TMP2:%.*]] = getelementptr inbounds i16, ptr [[DST]], i32 [[TMP0]]
1213; VEC-NEXT:    [[TMP3:%.*]] = getelementptr inbounds i16, ptr [[DST]], i32 [[TMP1]]
1214; VEC-NEXT:    store i16 0, ptr [[TMP2]], align 2
1215; VEC-NEXT:    store i16 0, ptr [[TMP3]], align 2
1216; VEC-NEXT:    [[TMP4:%.*]] = add <2 x i32> [[VEC_IND]], splat (i32 1)
1217; VEC-NEXT:    [[TMP5:%.*]] = add <2 x i32> [[BROADCAST_SPLAT]], [[TMP4]]
1218; VEC-NEXT:    [[INDEX_NEXT]] = add nuw i32 [[INDEX]], 2
1219; VEC-NEXT:    [[VEC_IND_NEXT]] = add <2 x i32> [[VEC_IND]], splat (i32 4)
1220; VEC-NEXT:    [[TMP6:%.*]] = icmp eq i32 [[INDEX_NEXT]], 4
1221; VEC-NEXT:    br i1 [[TMP6]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], {{!llvm.loop ![0-9]+}}
1222; VEC:       [[MIDDLE_BLOCK]]:
1223; VEC-NEXT:    [[TMP7:%.*]] = extractelement <2 x i32> [[TMP5]], i32 1
1224; VEC-NEXT:    br i1 true, label %[[E_EXIT:.*]], label %[[SCALAR_PH]]
1225; VEC:       [[SCALAR_PH]]:
1226; VEC-NEXT:    [[BC_RESUME_VAL:%.*]] = phi i32 [ 8, %[[MIDDLE_BLOCK]] ], [ 0, %[[ENTRY]] ]
1227; VEC-NEXT:    br label %[[LOOP:.*]]
1228; VEC:       [[LOOP]]:
1229; VEC-NEXT:    [[IV:%.*]] = phi i32 [ [[BC_RESUME_VAL]], %[[SCALAR_PH]] ], [ [[IV_NEXT:%.*]], %[[LOOP]] ]
1230; VEC-NEXT:    [[GEP_DST:%.*]] = getelementptr inbounds i16, ptr [[DST]], i32 [[IV]]
1231; VEC-NEXT:    store i16 0, ptr [[GEP_DST]], align 2
1232; VEC-NEXT:    [[INC:%.*]] = add i32 [[IV]], 1
1233; VEC-NEXT:    [[IV_NEXT]] = add i32 [[STEP_2]], [[INC]]
1234; VEC-NEXT:    [[CMP_I:%.*]] = icmp slt i32 [[IV_NEXT]], 8
1235; VEC-NEXT:    br i1 [[CMP_I]], label %[[LOOP]], label %[[E_EXIT]], {{!llvm.loop ![0-9]+}}
1236; VEC:       [[E_EXIT]]:
1237; VEC-NEXT:    [[RES:%.*]] = phi i32 [ [[IV_NEXT]], %[[LOOP]] ], [ [[TMP7]], %[[MIDDLE_BLOCK]] ]
1238; VEC-NEXT:    ret i32 [[RES]]
1239;
1240; INTERLEAVE-LABEL: define i32 @test_iv_uniform_with_outside_use_scev_simplification_2(
1241; INTERLEAVE-SAME: ptr [[DST:%.*]]) {
1242; INTERLEAVE-NEXT:  [[ENTRY:.*]]:
1243; INTERLEAVE-NEXT:    [[STEP_1:%.*]] = sext i8 0 to i32
1244; INTERLEAVE-NEXT:    [[STEP_2:%.*]] = add nsw i32 [[STEP_1]], 1
1245; INTERLEAVE-NEXT:    br i1 false, label %[[SCALAR_PH:.*]], label %[[VECTOR_PH:.*]]
1246; INTERLEAVE:       [[VECTOR_PH]]:
1247; INTERLEAVE-NEXT:    br label %[[VECTOR_BODY:.*]]
1248; INTERLEAVE:       [[VECTOR_BODY]]:
1249; INTERLEAVE-NEXT:    [[INDEX:%.*]] = phi i32 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]
1250; INTERLEAVE-NEXT:    [[OFFSET_IDX:%.*]] = mul i32 [[INDEX]], 2
1251; INTERLEAVE-NEXT:    [[TMP0:%.*]] = add i32 [[OFFSET_IDX]], 0
1252; INTERLEAVE-NEXT:    [[TMP1:%.*]] = add i32 [[OFFSET_IDX]], 2
1253; INTERLEAVE-NEXT:    [[TMP2:%.*]] = getelementptr inbounds i16, ptr [[DST]], i32 [[TMP0]]
1254; INTERLEAVE-NEXT:    [[TMP3:%.*]] = getelementptr inbounds i16, ptr [[DST]], i32 [[TMP1]]
1255; INTERLEAVE-NEXT:    store i16 0, ptr [[TMP2]], align 2
1256; INTERLEAVE-NEXT:    store i16 0, ptr [[TMP3]], align 2
1257; INTERLEAVE-NEXT:    [[TMP4:%.*]] = add i32 [[TMP1]], 1
1258; INTERLEAVE-NEXT:    [[TMP5:%.*]] = add i32 [[STEP_2]], [[TMP4]]
1259; INTERLEAVE-NEXT:    [[INDEX_NEXT]] = add nuw i32 [[INDEX]], 2
1260; INTERLEAVE-NEXT:    [[TMP6:%.*]] = icmp eq i32 [[INDEX_NEXT]], 4
1261; INTERLEAVE-NEXT:    br i1 [[TMP6]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], {{!llvm.loop ![0-9]+}}
1262; INTERLEAVE:       [[MIDDLE_BLOCK]]:
1263; INTERLEAVE-NEXT:    br i1 true, label %[[E_EXIT:.*]], label %[[SCALAR_PH]]
1264; INTERLEAVE:       [[SCALAR_PH]]:
1265; INTERLEAVE-NEXT:    [[BC_RESUME_VAL:%.*]] = phi i32 [ 8, %[[MIDDLE_BLOCK]] ], [ 0, %[[ENTRY]] ]
1266; INTERLEAVE-NEXT:    br label %[[LOOP:.*]]
1267; INTERLEAVE:       [[LOOP]]:
1268; INTERLEAVE-NEXT:    [[IV:%.*]] = phi i32 [ [[BC_RESUME_VAL]], %[[SCALAR_PH]] ], [ [[IV_NEXT:%.*]], %[[LOOP]] ]
1269; INTERLEAVE-NEXT:    [[GEP_DST:%.*]] = getelementptr inbounds i16, ptr [[DST]], i32 [[IV]]
1270; INTERLEAVE-NEXT:    store i16 0, ptr [[GEP_DST]], align 2
1271; INTERLEAVE-NEXT:    [[INC:%.*]] = add i32 [[IV]], 1
1272; INTERLEAVE-NEXT:    [[IV_NEXT]] = add i32 [[STEP_2]], [[INC]]
1273; INTERLEAVE-NEXT:    [[CMP_I:%.*]] = icmp slt i32 [[IV_NEXT]], 8
1274; INTERLEAVE-NEXT:    br i1 [[CMP_I]], label %[[LOOP]], label %[[E_EXIT]], {{!llvm.loop ![0-9]+}}
1275; INTERLEAVE:       [[E_EXIT]]:
1276; INTERLEAVE-NEXT:    [[RES:%.*]] = phi i32 [ [[IV_NEXT]], %[[LOOP]] ], [ [[TMP5]], %[[MIDDLE_BLOCK]] ]
1277; INTERLEAVE-NEXT:    ret i32 [[RES]]
1278;
1279entry:
1280  %step.1 = sext i8 0 to i32
1281  %step.2 = add nsw i32 %step.1, 1
1282  br label %loop
1283
1284loop:
1285  %iv = phi i32 [ 0, %entry ], [ %iv.next, %loop ]
1286  %gep.dst = getelementptr inbounds i16, ptr %dst, i32 %iv
1287  store i16 0, ptr %gep.dst, align 2
1288  %inc = add i32 %iv, 1
1289  %iv.next = add i32 %step.2, %inc
1290  %cmp.i = icmp slt i32 %iv.next, 8
1291  br i1 %cmp.i, label %loop, label %e.exit
1292
1293e.exit:
1294  %res = phi i32 [ %iv.next, %loop ]
1295  ret i32 %res
1296}
1297
1298; Test case for https://github.com/llvm/llvm-project/issues/122496.
1299define i32 @iv_ext_used_outside( ptr %dst) {
1300; VEC-LABEL: define i32 @iv_ext_used_outside(
1301; VEC-SAME: ptr [[DST:%.*]]) {
1302; VEC-NEXT:  [[ENTRY:.*]]:
1303; VEC-NEXT:    br i1 false, label %[[SCALAR_PH:.*]], label %[[VECTOR_PH:.*]]
1304; VEC:       [[VECTOR_PH]]:
1305; VEC-NEXT:    br label %[[VECTOR_BODY:.*]]
1306; VEC:       [[VECTOR_BODY]]:
1307; VEC-NEXT:    [[INDEX:%.*]] = phi i32 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]
1308; VEC-NEXT:    [[VEC_IND:%.*]] = phi <2 x i16> [ <i16 0, i16 1>, %[[VECTOR_PH]] ], [ [[VEC_IND_NEXT:%.*]], %[[VECTOR_BODY]] ]
1309; VEC-NEXT:    [[OFFSET_IDX:%.*]] = trunc i32 [[INDEX]] to i16
1310; VEC-NEXT:    [[TMP0:%.*]] = add i16 [[OFFSET_IDX]], 0
1311; VEC-NEXT:    [[TMP1:%.*]] = getelementptr inbounds nuw i32, ptr [[DST]], i16 [[TMP0]]
1312; VEC-NEXT:    [[TMP2:%.*]] = getelementptr inbounds nuw i32, ptr [[TMP1]], i32 0
1313; VEC-NEXT:    store <2 x i32> zeroinitializer, ptr [[TMP2]], align 4
1314; VEC-NEXT:    [[TMP5:%.*]] = add nuw nsw <2 x i16> [[VEC_IND]], splat (i16 1)
1315; VEC-NEXT:    [[TMP3:%.*]] = extractelement <2 x i16> [[TMP5]], i32 0
1316; VEC-NEXT:    [[TMP4:%.*]] = zext nneg i16 [[TMP3]] to i32
1317; VEC-NEXT:    [[TMP8:%.*]] = extractelement <2 x i16> [[TMP5]], i32 1
1318; VEC-NEXT:    [[TMP7:%.*]] = zext nneg i16 [[TMP8]] to i32
1319; VEC-NEXT:    [[INDEX_NEXT]] = add nuw i32 [[INDEX]], 2
1320; VEC-NEXT:    [[VEC_IND_NEXT]] = add <2 x i16> [[VEC_IND]], splat (i16 2)
1321; VEC-NEXT:    [[TMP6:%.*]] = icmp eq i32 [[INDEX_NEXT]], 128
1322; VEC-NEXT:    br i1 [[TMP6]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], {{!llvm.loop ![0-9]+}}
1323; VEC:       [[MIDDLE_BLOCK]]:
1324; VEC-NEXT:    br i1 false, label %[[EXIT:.*]], label %[[SCALAR_PH]]
1325; VEC:       [[SCALAR_PH]]:
1326; VEC-NEXT:    [[BC_RESUME_VAL:%.*]] = phi i16 [ 128, %[[MIDDLE_BLOCK]] ], [ 0, %[[ENTRY]] ]
1327; VEC-NEXT:    [[BC_RESUME_VAL1:%.*]] = phi i32 [ 128, %[[MIDDLE_BLOCK]] ], [ 0, %[[ENTRY]] ]
1328; VEC-NEXT:    br label %[[LOOP:.*]]
1329; VEC:       [[LOOP]]:
1330; VEC-NEXT:    [[IV_1:%.*]] = phi i16 [ [[BC_RESUME_VAL]], %[[SCALAR_PH]] ], [ [[IV_1_NEXT:%.*]], %[[LOOP]] ]
1331; VEC-NEXT:    [[IV_2:%.*]] = phi i32 [ [[BC_RESUME_VAL1]], %[[SCALAR_PH]] ], [ [[IV_1_EXT:%.*]], %[[LOOP]] ]
1332; VEC-NEXT:    [[GEP:%.*]] = getelementptr inbounds nuw i32, ptr [[DST]], i16 [[IV_1]]
1333; VEC-NEXT:    store i32 0, ptr [[GEP]], align 4
1334; VEC-NEXT:    [[IV_1_NEXT]] = add nuw nsw i16 [[IV_1]], 1
1335; VEC-NEXT:    [[IV_1_EXT]] = zext nneg i16 [[IV_1_NEXT]] to i32
1336; VEC-NEXT:    [[EC:%.*]] = icmp samesign ult i16 [[IV_1]], 128
1337; VEC-NEXT:    br i1 [[EC]], label %[[LOOP]], label %[[EXIT]], {{!llvm.loop ![0-9]+}}
1338; VEC:       [[EXIT]]:
1339; VEC-NEXT:    [[IV_1_EXT_LCSSA:%.*]] = phi i32 [ [[IV_1_EXT]], %[[LOOP]] ], [ [[TMP7]], %[[MIDDLE_BLOCK]] ]
1340; VEC-NEXT:    ret i32 [[IV_1_EXT_LCSSA]]
1341;
1342; INTERLEAVE-LABEL: define i32 @iv_ext_used_outside(
1343; INTERLEAVE-SAME: ptr [[DST:%.*]]) {
1344; INTERLEAVE-NEXT:  [[ENTRY:.*]]:
1345; INTERLEAVE-NEXT:    br i1 false, label %[[SCALAR_PH:.*]], label %[[VECTOR_PH:.*]]
1346; INTERLEAVE:       [[VECTOR_PH]]:
1347; INTERLEAVE-NEXT:    br label %[[VECTOR_BODY:.*]]
1348; INTERLEAVE:       [[VECTOR_BODY]]:
1349; INTERLEAVE-NEXT:    [[INDEX:%.*]] = phi i32 [ 0, %[[VECTOR_PH]] ], [ [[INDEX_NEXT:%.*]], %[[VECTOR_BODY]] ]
1350; INTERLEAVE-NEXT:    [[OFFSET_IDX:%.*]] = trunc i32 [[INDEX]] to i16
1351; INTERLEAVE-NEXT:    [[TMP0:%.*]] = add i16 [[OFFSET_IDX]], 0
1352; INTERLEAVE-NEXT:    [[TMP1:%.*]] = add i16 [[OFFSET_IDX]], 1
1353; INTERLEAVE-NEXT:    [[TMP2:%.*]] = getelementptr inbounds nuw i32, ptr [[DST]], i16 [[TMP0]]
1354; INTERLEAVE-NEXT:    [[TMP3:%.*]] = getelementptr inbounds nuw i32, ptr [[DST]], i16 [[TMP1]]
1355; INTERLEAVE-NEXT:    store i32 0, ptr [[TMP2]], align 4
1356; INTERLEAVE-NEXT:    store i32 0, ptr [[TMP3]], align 4
1357; INTERLEAVE-NEXT:    [[TMP4:%.*]] = add nuw nsw i16 [[TMP1]], 1
1358; INTERLEAVE-NEXT:    [[TMP5:%.*]] = zext nneg i16 [[TMP4]] to i32
1359; INTERLEAVE-NEXT:    [[INDEX_NEXT]] = add nuw i32 [[INDEX]], 2
1360; INTERLEAVE-NEXT:    [[TMP6:%.*]] = icmp eq i32 [[INDEX_NEXT]], 128
1361; INTERLEAVE-NEXT:    br i1 [[TMP6]], label %[[MIDDLE_BLOCK:.*]], label %[[VECTOR_BODY]], {{!llvm.loop ![0-9]+}}
1362; INTERLEAVE:       [[MIDDLE_BLOCK]]:
1363; INTERLEAVE-NEXT:    br i1 false, label %[[EXIT:.*]], label %[[SCALAR_PH]]
1364; INTERLEAVE:       [[SCALAR_PH]]:
1365; INTERLEAVE-NEXT:    [[BC_RESUME_VAL:%.*]] = phi i16 [ 128, %[[MIDDLE_BLOCK]] ], [ 0, %[[ENTRY]] ]
1366; INTERLEAVE-NEXT:    [[BC_RESUME_VAL1:%.*]] = phi i32 [ 128, %[[MIDDLE_BLOCK]] ], [ 0, %[[ENTRY]] ]
1367; INTERLEAVE-NEXT:    br label %[[LOOP:.*]]
1368; INTERLEAVE:       [[LOOP]]:
1369; INTERLEAVE-NEXT:    [[IV_1:%.*]] = phi i16 [ [[BC_RESUME_VAL]], %[[SCALAR_PH]] ], [ [[IV_1_NEXT:%.*]], %[[LOOP]] ]
1370; INTERLEAVE-NEXT:    [[IV_2:%.*]] = phi i32 [ [[BC_RESUME_VAL1]], %[[SCALAR_PH]] ], [ [[IV_1_EXT:%.*]], %[[LOOP]] ]
1371; INTERLEAVE-NEXT:    [[GEP:%.*]] = getelementptr inbounds nuw i32, ptr [[DST]], i16 [[IV_1]]
1372; INTERLEAVE-NEXT:    store i32 0, ptr [[GEP]], align 4
1373; INTERLEAVE-NEXT:    [[IV_1_NEXT]] = add nuw nsw i16 [[IV_1]], 1
1374; INTERLEAVE-NEXT:    [[IV_1_EXT]] = zext nneg i16 [[IV_1_NEXT]] to i32
1375; INTERLEAVE-NEXT:    [[EC:%.*]] = icmp samesign ult i16 [[IV_1]], 128
1376; INTERLEAVE-NEXT:    br i1 [[EC]], label %[[LOOP]], label %[[EXIT]], {{!llvm.loop ![0-9]+}}
1377; INTERLEAVE:       [[EXIT]]:
1378; INTERLEAVE-NEXT:    [[IV_1_EXT_LCSSA:%.*]] = phi i32 [ [[IV_1_EXT]], %[[LOOP]] ], [ [[TMP5]], %[[MIDDLE_BLOCK]] ]
1379; INTERLEAVE-NEXT:    ret i32 [[IV_1_EXT_LCSSA]]
1380;
1381entry:
1382  br label %loop
1383
1384loop:
1385  %iv.1 = phi i16 [ 0, %entry ], [ %iv.1.next, %loop ]
1386  %iv.2 = phi i32 [ 0, %entry ], [ %iv.1.ext, %loop ]
1387  %gep = getelementptr inbounds nuw i32, ptr %dst, i16 %iv.1
1388  store i32 0, ptr %gep, align 4
1389  %iv.1.next = add nuw nsw i16 %iv.1, 1
1390  %iv.1.ext = zext nneg i16 %iv.1.next to i32
1391  %ec = icmp samesign ult i16 %iv.1, 128
1392  br i1 %ec, label %loop, label %exit
1393
1394exit:
1395  %iv.1.ext.lcssa = phi i32 [ %iv.1.ext, %loop ]
1396  ret i32 %iv.1.ext.lcssa
1397}
1398
1399; Test case for https://github.com/llvm/llvm-project/issues/122602.
1400define i64 @test_iv_increment_incremented(ptr %dst) {
1401; VEC-LABEL: define i64 @test_iv_increment_incremented(
1402; VEC-SAME: ptr [[DST:%.*]]) {
1403; VEC-NEXT:  [[ENTRY:.*]]:
1404; VEC-NEXT:    br i1 false, label %[[SCALAR_PH:.*]], label %[[VECTOR_PH:.*]]
1405; VEC:       [[VECTOR_PH]]:
1406; VEC-NEXT:    br label %[[VECTOR_BODY:.*]]
1407; VEC:       [[VECTOR_BODY]]:
1408; VEC-NEXT:    [[TMP0:%.*]] = getelementptr i16, ptr [[DST]], i64 3
1409; VEC-NEXT:    [[TMP1:%.*]] = getelementptr i16, ptr [[TMP0]], i32 0
1410; VEC-NEXT:    [[TMP2:%.*]] = getelementptr i16, ptr [[TMP1]], i32 -1
1411; VEC-NEXT:    store <2 x i16> splat (i16 1), ptr [[TMP2]], align 2
1412; VEC-NEXT:    [[TMP3:%.*]] = add i64 2, -1
1413; VEC-NEXT:    [[TMP5:%.*]] = add i64 1, -1
1414; VEC-NEXT:    [[TMP4:%.*]] = add i64 [[TMP3]], 1
1415; VEC-NEXT:    [[TMP6:%.*]] = add i64 [[TMP5]], 1
1416; VEC-NEXT:    br label %[[MIDDLE_BLOCK:.*]]
1417; VEC:       [[MIDDLE_BLOCK]]:
1418; VEC-NEXT:    br i1 true, label %[[EXIT:.*]], label %[[SCALAR_PH]]
1419; VEC:       [[SCALAR_PH]]:
1420; VEC-NEXT:    [[BC_RESUME_VAL:%.*]] = phi i64 [ 1, %[[MIDDLE_BLOCK]] ], [ 3, %[[ENTRY]] ]
1421; VEC-NEXT:    [[BC_RESUME_VAL1:%.*]] = phi i64 [ 0, %[[MIDDLE_BLOCK]] ], [ 2, %[[ENTRY]] ]
1422; VEC-NEXT:    br label %[[LOOP:.*]]
1423; VEC:       [[LOOP]]:
1424; VEC-NEXT:    [[IV_1:%.*]] = phi i64 [ [[BC_RESUME_VAL]], %[[SCALAR_PH]] ], [ [[IV_1_NEXT:%.*]], %[[LOOP]] ]
1425; VEC-NEXT:    [[IV_2:%.*]] = phi i64 [ [[BC_RESUME_VAL1]], %[[SCALAR_PH]] ], [ [[IV_2_NEXT:%.*]], %[[LOOP]] ]
1426; VEC-NEXT:    [[GEP:%.*]] = getelementptr i16, ptr [[DST]], i64 [[IV_1]]
1427; VEC-NEXT:    store i16 1, ptr [[GEP]], align 2
1428; VEC-NEXT:    [[IV_2_NEXT]] = add i64 [[IV_2]], -1
1429; VEC-NEXT:    [[EC:%.*]] = icmp eq i64 [[IV_2_NEXT]], 0
1430; VEC-NEXT:    [[IV_1_NEXT]] = add i64 [[IV_2_NEXT]], 1
1431; VEC-NEXT:    br i1 [[EC]], label %[[EXIT]], label %[[LOOP]], {{!llvm.loop ![0-9]+}}
1432; VEC:       [[EXIT]]:
1433; VEC-NEXT:    [[IV_1_NEXT_LCSSA:%.*]] = phi i64 [ [[IV_1_NEXT]], %[[LOOP]] ], [ [[TMP6]], %[[MIDDLE_BLOCK]] ]
1434; VEC-NEXT:    ret i64 [[IV_1_NEXT_LCSSA]]
1435;
1436; INTERLEAVE-LABEL: define i64 @test_iv_increment_incremented(
1437; INTERLEAVE-SAME: ptr [[DST:%.*]]) {
1438; INTERLEAVE-NEXT:  [[ENTRY:.*]]:
1439; INTERLEAVE-NEXT:    br i1 false, label %[[SCALAR_PH:.*]], label %[[VECTOR_PH:.*]]
1440; INTERLEAVE:       [[VECTOR_PH]]:
1441; INTERLEAVE-NEXT:    br label %[[VECTOR_BODY:.*]]
1442; INTERLEAVE:       [[VECTOR_BODY]]:
1443; INTERLEAVE-NEXT:    [[TMP0:%.*]] = getelementptr i16, ptr [[DST]], i64 3
1444; INTERLEAVE-NEXT:    [[TMP1:%.*]] = getelementptr i16, ptr [[DST]], i64 2
1445; INTERLEAVE-NEXT:    store i16 1, ptr [[TMP0]], align 2
1446; INTERLEAVE-NEXT:    store i16 1, ptr [[TMP1]], align 2
1447; INTERLEAVE-NEXT:    [[TMP2:%.*]] = add i64 1, -1
1448; INTERLEAVE-NEXT:    [[TMP3:%.*]] = add i64 [[TMP2]], 1
1449; INTERLEAVE-NEXT:    br label %[[MIDDLE_BLOCK:.*]]
1450; INTERLEAVE:       [[MIDDLE_BLOCK]]:
1451; INTERLEAVE-NEXT:    br i1 true, label %[[EXIT:.*]], label %[[SCALAR_PH]]
1452; INTERLEAVE:       [[SCALAR_PH]]:
1453; INTERLEAVE-NEXT:    [[BC_RESUME_VAL:%.*]] = phi i64 [ 1, %[[MIDDLE_BLOCK]] ], [ 3, %[[ENTRY]] ]
1454; INTERLEAVE-NEXT:    [[BC_RESUME_VAL1:%.*]] = phi i64 [ 0, %[[MIDDLE_BLOCK]] ], [ 2, %[[ENTRY]] ]
1455; INTERLEAVE-NEXT:    br label %[[LOOP:.*]]
1456; INTERLEAVE:       [[LOOP]]:
1457; INTERLEAVE-NEXT:    [[IV_1:%.*]] = phi i64 [ [[BC_RESUME_VAL]], %[[SCALAR_PH]] ], [ [[IV_1_NEXT:%.*]], %[[LOOP]] ]
1458; INTERLEAVE-NEXT:    [[IV_2:%.*]] = phi i64 [ [[BC_RESUME_VAL1]], %[[SCALAR_PH]] ], [ [[IV_2_NEXT:%.*]], %[[LOOP]] ]
1459; INTERLEAVE-NEXT:    [[GEP:%.*]] = getelementptr i16, ptr [[DST]], i64 [[IV_1]]
1460; INTERLEAVE-NEXT:    store i16 1, ptr [[GEP]], align 2
1461; INTERLEAVE-NEXT:    [[IV_2_NEXT]] = add i64 [[IV_2]], -1
1462; INTERLEAVE-NEXT:    [[EC:%.*]] = icmp eq i64 [[IV_2_NEXT]], 0
1463; INTERLEAVE-NEXT:    [[IV_1_NEXT]] = add i64 [[IV_2_NEXT]], 1
1464; INTERLEAVE-NEXT:    br i1 [[EC]], label %[[EXIT]], label %[[LOOP]], {{!llvm.loop ![0-9]+}}
1465; INTERLEAVE:       [[EXIT]]:
1466; INTERLEAVE-NEXT:    [[IV_1_NEXT_LCSSA:%.*]] = phi i64 [ [[IV_1_NEXT]], %[[LOOP]] ], [ [[TMP3]], %[[MIDDLE_BLOCK]] ]
1467; INTERLEAVE-NEXT:    ret i64 [[IV_1_NEXT_LCSSA]]
1468;
1469entry:
1470  br label %loop
1471
1472loop:
1473  %iv.1 = phi i64 [ 3, %entry ], [ %iv.1.next, %loop ]
1474  %iv.2 = phi i64 [ 2, %entry ], [ %iv.2.next, %loop ]
1475  %gep = getelementptr i16, ptr %dst, i64 %iv.1
1476  store i16 1, ptr %gep, align 2
1477  %iv.2.next = add i64 %iv.2, -1
1478  %ec = icmp eq i64 %iv.2.next, 0
1479  %iv.1.next = add i64 %iv.2.next, 1
1480  br i1 %ec, label %exit, label %loop
1481
1482exit:
1483  ret i64 %iv.1.next
1484}
1485