xref: /llvm-project/llvm/test/Transforms/IndVarSimplify/outer_phi.ll (revision 864bb84a427de367528d15270790dd152871daf2)
1c78ed207SMax Kazantsev; NOTE: Assertions have been autogenerated by utils/update_test_checks.py
2c78ed207SMax Kazantsev; RUN: opt < %s -passes=indvars -S | FileCheck %s
3c78ed207SMax Kazantsev
4c78ed207SMax Kazantsevdeclare i1 @cond()
5c78ed207SMax Kazantsevdeclare i32 @llvm.smax.i32(i32, i32)
6c78ed207SMax Kazantsev
7c78ed207SMax Kazantsev; FIXME: In all tests in this file, signed_cond is equivalent to unsigned_cond, and therefore
8c78ed207SMax Kazantsev; one of the checks in the inner loop can be removed. The key to proving it is to prove that
9c78ed207SMax Kazantsev; %iv starts from something that is non-negative and only goes up. The positivity of its start
10c78ed207SMax Kazantsev; follows from the fact that %outer.iv also starts from somethign non-negative and only goes
11c78ed207SMax Kazantsev; up or remains same between iterations.
12c78ed207SMax Kazantsevdefine i32 @test_01(i32 %a, i32 %b) {
13c78ed207SMax Kazantsev; CHECK-LABEL: @test_01(
14c78ed207SMax Kazantsev; CHECK-NEXT:  entry:
15c78ed207SMax Kazantsev; CHECK-NEXT:    [[B_IS_NON_NEGATIVE:%.*]] = icmp sge i32 [[B:%.*]], 0
16c78ed207SMax Kazantsev; CHECK-NEXT:    br i1 [[B_IS_NON_NEGATIVE]], label [[OUTER_PREHEADER:%.*]], label [[FAILURE:%.*]]
17c78ed207SMax Kazantsev; CHECK:       outer.preheader:
18c78ed207SMax Kazantsev; CHECK-NEXT:    br label [[OUTER:%.*]]
19c78ed207SMax Kazantsev; CHECK:       outer:
20c78ed207SMax Kazantsev; CHECK-NEXT:    [[OUTER_IV:%.*]] = phi i32 [ [[IV_NEXT_LCSSA:%.*]], [[OUTER_BACKEDGE:%.*]] ], [ 0, [[OUTER_PREHEADER]] ]
21c78ed207SMax Kazantsev; CHECK-NEXT:    br label [[INNER:%.*]]
22c78ed207SMax Kazantsev; CHECK:       inner:
23c78ed207SMax Kazantsev; CHECK-NEXT:    [[IV:%.*]] = phi i32 [ [[OUTER_IV]], [[OUTER]] ], [ [[IV_NEXT:%.*]], [[INNER_BACKEDGE:%.*]] ]
24c78ed207SMax Kazantsev; CHECK-NEXT:    [[SIGNED_COND:%.*]] = icmp slt i32 [[IV]], [[B]]
25c78ed207SMax Kazantsev; CHECK-NEXT:    br i1 [[SIGNED_COND]], label [[INNER_1:%.*]], label [[SIDE_EXIT:%.*]]
26c78ed207SMax Kazantsev; CHECK:       inner.1:
27c78ed207SMax Kazantsev; CHECK-NEXT:    [[UNSIGNED_COND:%.*]] = icmp ult i32 [[IV]], [[B]]
28c78ed207SMax Kazantsev; CHECK-NEXT:    br i1 [[UNSIGNED_COND]], label [[INNER_BACKEDGE]], label [[SIDE_EXIT]]
29c78ed207SMax Kazantsev; CHECK:       inner.backedge:
30c78ed207SMax Kazantsev; CHECK-NEXT:    [[IV_NEXT]] = add nuw nsw i32 [[IV]], 1
31c78ed207SMax Kazantsev; CHECK-NEXT:    [[INNER_LOOP_COND:%.*]] = call i1 @cond()
32c78ed207SMax Kazantsev; CHECK-NEXT:    br i1 [[INNER_LOOP_COND]], label [[INNER]], label [[OUTER_BACKEDGE]]
33c78ed207SMax Kazantsev; CHECK:       outer.backedge:
34c78ed207SMax Kazantsev; CHECK-NEXT:    [[IV_NEXT_LCSSA]] = phi i32 [ [[IV_NEXT]], [[INNER_BACKEDGE]] ]
35c78ed207SMax Kazantsev; CHECK-NEXT:    [[OUTER_LOOP_COND:%.*]] = call i1 @cond()
36c78ed207SMax Kazantsev; CHECK-NEXT:    br i1 [[OUTER_LOOP_COND]], label [[OUTER]], label [[EXIT:%.*]]
37c78ed207SMax Kazantsev; CHECK:       failure:
38c78ed207SMax Kazantsev; CHECK-NEXT:    unreachable
39c78ed207SMax Kazantsev; CHECK:       side.exit:
40c78ed207SMax Kazantsev; CHECK-NEXT:    ret i32 0
41c78ed207SMax Kazantsev; CHECK:       exit:
42c78ed207SMax Kazantsev; CHECK-NEXT:    ret i32 1
43c78ed207SMax Kazantsev;
44c78ed207SMax Kazantseventry:
45c78ed207SMax Kazantsev  %b_is_non_negative = icmp sge i32 %b, 0
46c78ed207SMax Kazantsev  br i1 %b_is_non_negative, label %outer, label %failure
47c78ed207SMax Kazantsev
48c78ed207SMax Kazantsevouter:
49c78ed207SMax Kazantsev  %outer.iv = phi i32 [0, %entry], [%iv.next, %outer.backedge]
50c78ed207SMax Kazantsev  br label %inner
51c78ed207SMax Kazantsev
52c78ed207SMax Kazantsev
53c78ed207SMax Kazantsevinner:
54c78ed207SMax Kazantsev  %iv = phi i32 [%outer.iv, %outer], [%iv.next, %inner.backedge]
55c78ed207SMax Kazantsev  %signed_cond = icmp slt i32 %iv, %b
56c78ed207SMax Kazantsev  br i1 %signed_cond, label %inner.1, label %side.exit
57c78ed207SMax Kazantsev
58c78ed207SMax Kazantsevinner.1:
59c78ed207SMax Kazantsev  %unsigned_cond = icmp ult i32 %iv, %b
60c78ed207SMax Kazantsev  br i1 %unsigned_cond, label %inner.backedge, label %side.exit
61c78ed207SMax Kazantsev
62c78ed207SMax Kazantsevinner.backedge:
63c78ed207SMax Kazantsev  %iv.next = add nuw nsw i32 %iv, 1
64c78ed207SMax Kazantsev  %inner.loop.cond = call i1 @cond()
65c78ed207SMax Kazantsev  br i1 %inner.loop.cond, label %inner, label %outer.backedge
66c78ed207SMax Kazantsev
67c78ed207SMax Kazantsevouter.backedge:
68c78ed207SMax Kazantsev  %outer.loop.cond = call i1 @cond()
69c78ed207SMax Kazantsev  br i1 %outer.loop.cond, label %outer, label %exit
70c78ed207SMax Kazantsev
71c78ed207SMax Kazantsevfailure:
72c78ed207SMax Kazantsev  unreachable
73c78ed207SMax Kazantsev
74c78ed207SMax Kazantsevside.exit:
75c78ed207SMax Kazantsev  ret i32 0
76c78ed207SMax Kazantsev
77c78ed207SMax Kazantsevexit:
78c78ed207SMax Kazantsev  ret i32 1
79c78ed207SMax Kazantsev}
80c78ed207SMax Kazantsev
8174fa174fSMax Kazantsev; FIXME: iv <u b, b >=s 0 --> iv <s b. We should be able to remove the 2nd check.
8274fa174fSMax Kazantsevdefine i32 @test_01a(i32 %a, i32 %b) {
8374fa174fSMax Kazantsev; CHECK-LABEL: @test_01a(
8474fa174fSMax Kazantsev; CHECK-NEXT:  entry:
8574fa174fSMax Kazantsev; CHECK-NEXT:    [[B_IS_NON_NEGATIVE:%.*]] = icmp sge i32 [[B:%.*]], 0
8674fa174fSMax Kazantsev; CHECK-NEXT:    br i1 [[B_IS_NON_NEGATIVE]], label [[OUTER_PREHEADER:%.*]], label [[FAILURE:%.*]]
8774fa174fSMax Kazantsev; CHECK:       outer.preheader:
8874fa174fSMax Kazantsev; CHECK-NEXT:    br label [[OUTER:%.*]]
8974fa174fSMax Kazantsev; CHECK:       outer:
9074fa174fSMax Kazantsev; CHECK-NEXT:    [[OUTER_IV:%.*]] = phi i32 [ [[IV_NEXT_LCSSA:%.*]], [[OUTER_BACKEDGE:%.*]] ], [ 0, [[OUTER_PREHEADER]] ]
9174fa174fSMax Kazantsev; CHECK-NEXT:    br label [[INNER:%.*]]
9274fa174fSMax Kazantsev; CHECK:       inner:
9374fa174fSMax Kazantsev; CHECK-NEXT:    [[IV:%.*]] = phi i32 [ [[OUTER_IV]], [[OUTER]] ], [ [[IV_NEXT:%.*]], [[INNER_BACKEDGE:%.*]] ]
9474fa174fSMax Kazantsev; CHECK-NEXT:    [[SIGNED_COND:%.*]] = icmp ult i32 [[IV]], [[B]]
9574fa174fSMax Kazantsev; CHECK-NEXT:    br i1 [[SIGNED_COND]], label [[INNER_1:%.*]], label [[SIDE_EXIT:%.*]]
9674fa174fSMax Kazantsev; CHECK:       inner.1:
9774fa174fSMax Kazantsev; CHECK-NEXT:    [[UNSIGNED_COND:%.*]] = icmp slt i32 [[IV]], [[B]]
9874fa174fSMax Kazantsev; CHECK-NEXT:    br i1 [[UNSIGNED_COND]], label [[INNER_BACKEDGE]], label [[SIDE_EXIT]]
9974fa174fSMax Kazantsev; CHECK:       inner.backedge:
10074fa174fSMax Kazantsev; CHECK-NEXT:    [[IV_NEXT]] = add nuw nsw i32 [[IV]], 1
10174fa174fSMax Kazantsev; CHECK-NEXT:    [[INNER_LOOP_COND:%.*]] = call i1 @cond()
10274fa174fSMax Kazantsev; CHECK-NEXT:    br i1 [[INNER_LOOP_COND]], label [[INNER]], label [[OUTER_BACKEDGE]]
10374fa174fSMax Kazantsev; CHECK:       outer.backedge:
10474fa174fSMax Kazantsev; CHECK-NEXT:    [[IV_NEXT_LCSSA]] = phi i32 [ [[IV_NEXT]], [[INNER_BACKEDGE]] ]
10574fa174fSMax Kazantsev; CHECK-NEXT:    [[OUTER_LOOP_COND:%.*]] = call i1 @cond()
10674fa174fSMax Kazantsev; CHECK-NEXT:    br i1 [[OUTER_LOOP_COND]], label [[OUTER]], label [[EXIT:%.*]]
10774fa174fSMax Kazantsev; CHECK:       failure:
10874fa174fSMax Kazantsev; CHECK-NEXT:    unreachable
10974fa174fSMax Kazantsev; CHECK:       side.exit:
11074fa174fSMax Kazantsev; CHECK-NEXT:    ret i32 0
11174fa174fSMax Kazantsev; CHECK:       exit:
11274fa174fSMax Kazantsev; CHECK-NEXT:    ret i32 1
11374fa174fSMax Kazantsev;
11474fa174fSMax Kazantseventry:
11574fa174fSMax Kazantsev  %b_is_non_negative = icmp sge i32 %b, 0
11674fa174fSMax Kazantsev  br i1 %b_is_non_negative, label %outer, label %failure
11774fa174fSMax Kazantsev
11874fa174fSMax Kazantsevouter:
11974fa174fSMax Kazantsev  %outer.iv = phi i32 [0, %entry], [%iv.next, %outer.backedge]
12074fa174fSMax Kazantsev  br label %inner
12174fa174fSMax Kazantsev
12274fa174fSMax Kazantsev
12374fa174fSMax Kazantsevinner:
12474fa174fSMax Kazantsev  %iv = phi i32 [%outer.iv, %outer], [%iv.next, %inner.backedge]
12574fa174fSMax Kazantsev  %signed_cond = icmp ult i32 %iv, %b
12674fa174fSMax Kazantsev  br i1 %signed_cond, label %inner.1, label %side.exit
12774fa174fSMax Kazantsev
12874fa174fSMax Kazantsevinner.1:
12974fa174fSMax Kazantsev  %unsigned_cond = icmp slt i32 %iv, %b
13074fa174fSMax Kazantsev  br i1 %unsigned_cond, label %inner.backedge, label %side.exit
13174fa174fSMax Kazantsev
13274fa174fSMax Kazantsevinner.backedge:
13374fa174fSMax Kazantsev  %iv.next = add nuw nsw i32 %iv, 1
13474fa174fSMax Kazantsev  %inner.loop.cond = call i1 @cond()
13574fa174fSMax Kazantsev  br i1 %inner.loop.cond, label %inner, label %outer.backedge
13674fa174fSMax Kazantsev
13774fa174fSMax Kazantsevouter.backedge:
13874fa174fSMax Kazantsev  %outer.loop.cond = call i1 @cond()
13974fa174fSMax Kazantsev  br i1 %outer.loop.cond, label %outer, label %exit
14074fa174fSMax Kazantsev
14174fa174fSMax Kazantsevfailure:
14274fa174fSMax Kazantsev  unreachable
14374fa174fSMax Kazantsev
14474fa174fSMax Kazantsevside.exit:
14574fa174fSMax Kazantsev  ret i32 0
14674fa174fSMax Kazantsev
14774fa174fSMax Kazantsevexit:
14874fa174fSMax Kazantsev  ret i32 1
14974fa174fSMax Kazantsev}
15074fa174fSMax Kazantsev
151c78ed207SMax Kazantsevdefine i32 @test_02(i32 %a, i32 %b) {
152c78ed207SMax Kazantsev; CHECK-LABEL: @test_02(
153c78ed207SMax Kazantsev; CHECK-NEXT:  entry:
154c78ed207SMax Kazantsev; CHECK-NEXT:    [[B_IS_NON_NEGATIVE:%.*]] = icmp sge i32 [[B:%.*]], 0
155c78ed207SMax Kazantsev; CHECK-NEXT:    br i1 [[B_IS_NON_NEGATIVE]], label [[OUTER_PREHEADER:%.*]], label [[FAILURE:%.*]]
156c78ed207SMax Kazantsev; CHECK:       outer.preheader:
157c78ed207SMax Kazantsev; CHECK-NEXT:    br label [[OUTER:%.*]]
158c78ed207SMax Kazantsev; CHECK:       outer:
159c78ed207SMax Kazantsev; CHECK-NEXT:    [[OUTER_IV:%.*]] = phi i32 [ [[OUTER_MERGE:%.*]], [[OUTER_BACKEDGE:%.*]] ], [ 0, [[OUTER_PREHEADER]] ]
160c78ed207SMax Kazantsev; CHECK-NEXT:    br label [[INNER:%.*]]
161c78ed207SMax Kazantsev; CHECK:       inner:
162c78ed207SMax Kazantsev; CHECK-NEXT:    [[IV:%.*]] = phi i32 [ [[OUTER_IV]], [[OUTER]] ], [ [[IV_NEXT:%.*]], [[INNER_BACKEDGE:%.*]] ]
163c78ed207SMax Kazantsev; CHECK-NEXT:    [[SIGNED_COND:%.*]] = icmp slt i32 [[IV]], [[B]]
164c78ed207SMax Kazantsev; CHECK-NEXT:    br i1 [[SIGNED_COND]], label [[INNER_1:%.*]], label [[SIDE_EXIT:%.*]]
165c78ed207SMax Kazantsev; CHECK:       inner.1:
166c78ed207SMax Kazantsev; CHECK-NEXT:    [[UNSIGNED_COND:%.*]] = icmp ult i32 [[IV]], [[B]]
167c78ed207SMax Kazantsev; CHECK-NEXT:    br i1 [[UNSIGNED_COND]], label [[INNER_BACKEDGE]], label [[SIDE_EXIT]]
168c78ed207SMax Kazantsev; CHECK:       inner.backedge:
169c78ed207SMax Kazantsev; CHECK-NEXT:    [[IV_NEXT]] = add nuw nsw i32 [[IV]], 1
170c78ed207SMax Kazantsev; CHECK-NEXT:    [[INNER_LOOP_COND:%.*]] = call i1 @cond()
171c78ed207SMax Kazantsev; CHECK-NEXT:    br i1 [[INNER_LOOP_COND]], label [[INNER]], label [[OUTER_BACKEDGE]]
172c78ed207SMax Kazantsev; CHECK:       outer.backedge:
173c78ed207SMax Kazantsev; CHECK-NEXT:    [[OUTER_MERGE]] = phi i32 [ [[IV_NEXT]], [[INNER_BACKEDGE]] ]
174c78ed207SMax Kazantsev; CHECK-NEXT:    [[OUTER_LOOP_COND:%.*]] = call i1 @cond()
175c78ed207SMax Kazantsev; CHECK-NEXT:    br i1 [[OUTER_LOOP_COND]], label [[OUTER]], label [[EXIT:%.*]]
176c78ed207SMax Kazantsev; CHECK:       failure:
177c78ed207SMax Kazantsev; CHECK-NEXT:    unreachable
178c78ed207SMax Kazantsev; CHECK:       side.exit:
179c78ed207SMax Kazantsev; CHECK-NEXT:    ret i32 0
180c78ed207SMax Kazantsev; CHECK:       exit:
181c78ed207SMax Kazantsev; CHECK-NEXT:    ret i32 1
182c78ed207SMax Kazantsev;
183c78ed207SMax Kazantseventry:
184c78ed207SMax Kazantsev  %b_is_non_negative = icmp sge i32 %b, 0
185c78ed207SMax Kazantsev  br i1 %b_is_non_negative, label %outer, label %failure
186c78ed207SMax Kazantsev
187c78ed207SMax Kazantsevouter:
188c78ed207SMax Kazantsev  %outer.iv = phi i32 [0, %entry], [%outer.merge, %outer.backedge]
189c78ed207SMax Kazantsev  br label %inner
190c78ed207SMax Kazantsev
191c78ed207SMax Kazantsev
192c78ed207SMax Kazantsevinner:
193c78ed207SMax Kazantsev  %iv = phi i32 [%outer.iv, %outer], [%iv.next, %inner.backedge]
194c78ed207SMax Kazantsev  %signed_cond = icmp slt i32 %iv, %b
195c78ed207SMax Kazantsev  br i1 %signed_cond, label %inner.1, label %side.exit
196c78ed207SMax Kazantsev
197c78ed207SMax Kazantsevinner.1:
198c78ed207SMax Kazantsev  %unsigned_cond = icmp ult i32 %iv, %b
199c78ed207SMax Kazantsev  br i1 %unsigned_cond, label %inner.backedge, label %side.exit
200c78ed207SMax Kazantsev
201c78ed207SMax Kazantsevinner.backedge:
202c78ed207SMax Kazantsev  %iv.next = add nuw nsw i32 %iv, 1
203c78ed207SMax Kazantsev  %inner.loop.cond = call i1 @cond()
204c78ed207SMax Kazantsev  br i1 %inner.loop.cond, label %inner, label %outer.backedge
205c78ed207SMax Kazantsev
206c78ed207SMax Kazantsevouter.backedge:
207c78ed207SMax Kazantsev  %outer.merge = phi i32 [%iv.next, %inner.backedge]
208c78ed207SMax Kazantsev  %outer.loop.cond = call i1 @cond()
209c78ed207SMax Kazantsev  br i1 %outer.loop.cond, label %outer, label %exit
210c78ed207SMax Kazantsev
211c78ed207SMax Kazantsevfailure:
212c78ed207SMax Kazantsev  unreachable
213c78ed207SMax Kazantsev
214c78ed207SMax Kazantsevside.exit:
215c78ed207SMax Kazantsev  ret i32 0
216c78ed207SMax Kazantsev
217c78ed207SMax Kazantsevexit:
218c78ed207SMax Kazantsev  ret i32 1
219c78ed207SMax Kazantsev}
220c78ed207SMax Kazantsev
221c78ed207SMax Kazantsevdefine i32 @test_03(i32 %a, i32 %b) {
222c78ed207SMax Kazantsev; CHECK-LABEL: @test_03(
223c78ed207SMax Kazantsev; CHECK-NEXT:  entry:
224c78ed207SMax Kazantsev; CHECK-NEXT:    [[B_IS_NON_NEGATIVE:%.*]] = icmp sge i32 [[B:%.*]], 0
225c78ed207SMax Kazantsev; CHECK-NEXT:    br i1 [[B_IS_NON_NEGATIVE]], label [[OUTER_PREHEADER:%.*]], label [[FAILURE:%.*]]
226c78ed207SMax Kazantsev; CHECK:       outer.preheader:
227c78ed207SMax Kazantsev; CHECK-NEXT:    br label [[OUTER:%.*]]
228c78ed207SMax Kazantsev; CHECK:       outer:
229c78ed207SMax Kazantsev; CHECK-NEXT:    [[OUTER_IV:%.*]] = phi i32 [ [[OUTER_MERGE:%.*]], [[OUTER_BACKEDGE:%.*]] ], [ 0, [[OUTER_PREHEADER]] ]
230c78ed207SMax Kazantsev; CHECK-NEXT:    [[OUTER_COND_1:%.*]] = call i1 @cond()
231c78ed207SMax Kazantsev; CHECK-NEXT:    br i1 [[OUTER_COND_1]], label [[INNER_PREHEADER:%.*]], label [[NO_INNER:%.*]]
232c78ed207SMax Kazantsev; CHECK:       inner.preheader:
233c78ed207SMax Kazantsev; CHECK-NEXT:    br label [[INNER:%.*]]
234c78ed207SMax Kazantsev; CHECK:       no_inner:
235c78ed207SMax Kazantsev; CHECK-NEXT:    [[OUTER_COND_2:%.*]] = call i1 @cond()
236c78ed207SMax Kazantsev; CHECK-NEXT:    br label [[OUTER_BACKEDGE]]
237c78ed207SMax Kazantsev; CHECK:       inner:
238c78ed207SMax Kazantsev; CHECK-NEXT:    [[IV:%.*]] = phi i32 [ [[IV_NEXT:%.*]], [[INNER_BACKEDGE:%.*]] ], [ [[OUTER_IV]], [[INNER_PREHEADER]] ]
239c78ed207SMax Kazantsev; CHECK-NEXT:    [[SIGNED_COND:%.*]] = icmp slt i32 [[IV]], [[B]]
240c78ed207SMax Kazantsev; CHECK-NEXT:    br i1 [[SIGNED_COND]], label [[INNER_1:%.*]], label [[SIDE_EXIT:%.*]]
241c78ed207SMax Kazantsev; CHECK:       inner.1:
242c78ed207SMax Kazantsev; CHECK-NEXT:    [[UNSIGNED_COND:%.*]] = icmp ult i32 [[IV]], [[B]]
243c78ed207SMax Kazantsev; CHECK-NEXT:    br i1 [[UNSIGNED_COND]], label [[INNER_BACKEDGE]], label [[SIDE_EXIT]]
244c78ed207SMax Kazantsev; CHECK:       inner.backedge:
245c78ed207SMax Kazantsev; CHECK-NEXT:    [[IV_NEXT]] = add nuw nsw i32 [[IV]], 1
246c78ed207SMax Kazantsev; CHECK-NEXT:    [[INNER_LOOP_COND:%.*]] = call i1 @cond()
247c78ed207SMax Kazantsev; CHECK-NEXT:    br i1 [[INNER_LOOP_COND]], label [[INNER]], label [[OUTER_BACKEDGE_LOOPEXIT:%.*]]
248c78ed207SMax Kazantsev; CHECK:       outer.backedge.loopexit:
249c78ed207SMax Kazantsev; CHECK-NEXT:    [[IV_NEXT_LCSSA:%.*]] = phi i32 [ [[IV_NEXT]], [[INNER_BACKEDGE]] ]
250c78ed207SMax Kazantsev; CHECK-NEXT:    br label [[OUTER_BACKEDGE]]
251c78ed207SMax Kazantsev; CHECK:       outer.backedge:
252c78ed207SMax Kazantsev; CHECK-NEXT:    [[OUTER_MERGE]] = phi i32 [ [[OUTER_IV]], [[NO_INNER]] ], [ [[IV_NEXT_LCSSA]], [[OUTER_BACKEDGE_LOOPEXIT]] ]
253c78ed207SMax Kazantsev; CHECK-NEXT:    [[OUTER_LOOP_COND:%.*]] = call i1 @cond()
254c78ed207SMax Kazantsev; CHECK-NEXT:    br i1 [[OUTER_LOOP_COND]], label [[OUTER]], label [[EXIT:%.*]]
255c78ed207SMax Kazantsev; CHECK:       failure:
256c78ed207SMax Kazantsev; CHECK-NEXT:    unreachable
257c78ed207SMax Kazantsev; CHECK:       side.exit:
258c78ed207SMax Kazantsev; CHECK-NEXT:    ret i32 0
259c78ed207SMax Kazantsev; CHECK:       exit:
260c78ed207SMax Kazantsev; CHECK-NEXT:    ret i32 1
261c78ed207SMax Kazantsev;
262c78ed207SMax Kazantseventry:
263c78ed207SMax Kazantsev  %b_is_non_negative = icmp sge i32 %b, 0
264c78ed207SMax Kazantsev  br i1 %b_is_non_negative, label %outer, label %failure
265c78ed207SMax Kazantsev
266c78ed207SMax Kazantsevouter:
267c78ed207SMax Kazantsev  %outer.iv = phi i32 [0, %entry], [%outer.merge, %outer.backedge]
268c78ed207SMax Kazantsev  %outer_cond_1 = call i1 @cond()
269c78ed207SMax Kazantsev  br i1 %outer_cond_1, label %inner, label %no_inner
270c78ed207SMax Kazantsev
271c78ed207SMax Kazantsevno_inner:
272c78ed207SMax Kazantsev  %outer_cond_2 = call i1 @cond()
273c78ed207SMax Kazantsev  br label %outer.backedge
274c78ed207SMax Kazantsev
275c78ed207SMax Kazantsevinner:
276c78ed207SMax Kazantsev  %iv = phi i32 [%outer.iv, %outer], [%iv.next, %inner.backedge]
277c78ed207SMax Kazantsev  %signed_cond = icmp slt i32 %iv, %b
278c78ed207SMax Kazantsev  br i1 %signed_cond, label %inner.1, label %side.exit
279c78ed207SMax Kazantsev
280c78ed207SMax Kazantsevinner.1:
281c78ed207SMax Kazantsev  %unsigned_cond = icmp ult i32 %iv, %b
282c78ed207SMax Kazantsev  br i1 %unsigned_cond, label %inner.backedge, label %side.exit
283c78ed207SMax Kazantsev
284c78ed207SMax Kazantsevinner.backedge:
285c78ed207SMax Kazantsev  %iv.next = add nuw nsw i32 %iv, 1
286c78ed207SMax Kazantsev  %inner.loop.cond = call i1 @cond()
287c78ed207SMax Kazantsev  br i1 %inner.loop.cond, label %inner, label %outer.backedge
288c78ed207SMax Kazantsev
289c78ed207SMax Kazantsevouter.backedge:
290c78ed207SMax Kazantsev  %outer.merge = phi i32 [%outer.iv, %no_inner], [%iv.next, %inner.backedge]
291c78ed207SMax Kazantsev  %outer.loop.cond = call i1 @cond()
292c78ed207SMax Kazantsev  br i1 %outer.loop.cond, label %outer, label %exit
293c78ed207SMax Kazantsev
294c78ed207SMax Kazantsevfailure:
295c78ed207SMax Kazantsev  unreachable
296c78ed207SMax Kazantsev
297c78ed207SMax Kazantsevside.exit:
298c78ed207SMax Kazantsev  ret i32 0
299c78ed207SMax Kazantsev
300c78ed207SMax Kazantsevexit:
301c78ed207SMax Kazantsev  ret i32 1
302c78ed207SMax Kazantsev}
303c78ed207SMax Kazantsev
304c78ed207SMax Kazantsevdefine i32 @test_04(i32 %a, i32 %b) {
305c78ed207SMax Kazantsev; CHECK-LABEL: @test_04(
306c78ed207SMax Kazantsev; CHECK-NEXT:  entry:
307c78ed207SMax Kazantsev; CHECK-NEXT:    [[B_IS_NON_NEGATIVE:%.*]] = icmp sge i32 [[B:%.*]], 0
308c78ed207SMax Kazantsev; CHECK-NEXT:    br i1 [[B_IS_NON_NEGATIVE]], label [[OUTER_PREHEADER:%.*]], label [[FAILURE:%.*]]
309c78ed207SMax Kazantsev; CHECK:       outer.preheader:
310c78ed207SMax Kazantsev; CHECK-NEXT:    br label [[OUTER:%.*]]
311c78ed207SMax Kazantsev; CHECK:       outer:
312c78ed207SMax Kazantsev; CHECK-NEXT:    [[OUTER_IV:%.*]] = phi i32 [ [[OUTER_MERGE:%.*]], [[OUTER_BACKEDGE:%.*]] ], [ 0, [[OUTER_PREHEADER]] ]
313c78ed207SMax Kazantsev; CHECK-NEXT:    [[OUTER_COND_1:%.*]] = call i1 @cond()
314c78ed207SMax Kazantsev; CHECK-NEXT:    br i1 [[OUTER_COND_1]], label [[INNER_PREHEADER:%.*]], label [[NO_INNER:%.*]]
315c78ed207SMax Kazantsev; CHECK:       inner.preheader:
316c78ed207SMax Kazantsev; CHECK-NEXT:    br label [[INNER:%.*]]
317c78ed207SMax Kazantsev; CHECK:       no_inner:
318c78ed207SMax Kazantsev; CHECK-NEXT:    [[OUTER_COND_2:%.*]] = call i1 @cond()
319c78ed207SMax Kazantsev; CHECK-NEXT:    br i1 [[OUTER_COND_2]], label [[IF_TRUE:%.*]], label [[IF_FALSE:%.*]]
320c78ed207SMax Kazantsev; CHECK:       if.true:
321c78ed207SMax Kazantsev; CHECK-NEXT:    [[SMAX:%.*]] = call i32 @llvm.smax.i32(i32 [[A:%.*]], i32 [[OUTER_IV]])
322c78ed207SMax Kazantsev; CHECK-NEXT:    br label [[OUTER_BACKEDGE]]
323c78ed207SMax Kazantsev; CHECK:       if.false:
324c78ed207SMax Kazantsev; CHECK-NEXT:    br label [[OUTER_BACKEDGE]]
325c78ed207SMax Kazantsev; CHECK:       inner:
326c78ed207SMax Kazantsev; CHECK-NEXT:    [[IV:%.*]] = phi i32 [ [[IV_NEXT:%.*]], [[INNER_BACKEDGE:%.*]] ], [ [[OUTER_IV]], [[INNER_PREHEADER]] ]
327c78ed207SMax Kazantsev; CHECK-NEXT:    [[SIGNED_COND:%.*]] = icmp slt i32 [[IV]], [[B]]
328c78ed207SMax Kazantsev; CHECK-NEXT:    br i1 [[SIGNED_COND]], label [[INNER_1:%.*]], label [[SIDE_EXIT:%.*]]
329c78ed207SMax Kazantsev; CHECK:       inner.1:
330c78ed207SMax Kazantsev; CHECK-NEXT:    [[UNSIGNED_COND:%.*]] = icmp ult i32 [[IV]], [[B]]
331c78ed207SMax Kazantsev; CHECK-NEXT:    br i1 [[UNSIGNED_COND]], label [[INNER_BACKEDGE]], label [[SIDE_EXIT]]
332c78ed207SMax Kazantsev; CHECK:       inner.backedge:
333c78ed207SMax Kazantsev; CHECK-NEXT:    [[IV_NEXT]] = add nuw nsw i32 [[IV]], 1
334c78ed207SMax Kazantsev; CHECK-NEXT:    [[INNER_LOOP_COND:%.*]] = call i1 @cond()
335c78ed207SMax Kazantsev; CHECK-NEXT:    br i1 [[INNER_LOOP_COND]], label [[INNER]], label [[OUTER_BACKEDGE_LOOPEXIT:%.*]]
336c78ed207SMax Kazantsev; CHECK:       outer.backedge.loopexit:
337c78ed207SMax Kazantsev; CHECK-NEXT:    [[IV_NEXT_LCSSA:%.*]] = phi i32 [ [[IV_NEXT]], [[INNER_BACKEDGE]] ]
338c78ed207SMax Kazantsev; CHECK-NEXT:    br label [[OUTER_BACKEDGE]]
339c78ed207SMax Kazantsev; CHECK:       outer.backedge:
340c78ed207SMax Kazantsev; CHECK-NEXT:    [[OUTER_MERGE]] = phi i32 [ [[SMAX]], [[IF_TRUE]] ], [ [[OUTER_IV]], [[IF_FALSE]] ], [ [[IV_NEXT_LCSSA]], [[OUTER_BACKEDGE_LOOPEXIT]] ]
341c78ed207SMax Kazantsev; CHECK-NEXT:    [[OUTER_LOOP_COND:%.*]] = call i1 @cond()
342c78ed207SMax Kazantsev; CHECK-NEXT:    br i1 [[OUTER_LOOP_COND]], label [[OUTER]], label [[EXIT:%.*]]
343c78ed207SMax Kazantsev; CHECK:       failure:
344c78ed207SMax Kazantsev; CHECK-NEXT:    unreachable
345c78ed207SMax Kazantsev; CHECK:       side.exit:
346c78ed207SMax Kazantsev; CHECK-NEXT:    ret i32 0
347c78ed207SMax Kazantsev; CHECK:       exit:
348c78ed207SMax Kazantsev; CHECK-NEXT:    ret i32 1
349c78ed207SMax Kazantsev;
350c78ed207SMax Kazantseventry:
351c78ed207SMax Kazantsev  %b_is_non_negative = icmp sge i32 %b, 0
352c78ed207SMax Kazantsev  br i1 %b_is_non_negative, label %outer, label %failure
353c78ed207SMax Kazantsev
354c78ed207SMax Kazantsevouter:
355c78ed207SMax Kazantsev  %outer.iv = phi i32 [0, %entry], [%outer.merge, %outer.backedge]
356c78ed207SMax Kazantsev  %outer_cond_1 = call i1 @cond()
357c78ed207SMax Kazantsev  br i1 %outer_cond_1, label %inner, label %no_inner
358c78ed207SMax Kazantsev
359c78ed207SMax Kazantsevno_inner:
360c78ed207SMax Kazantsev  %outer_cond_2 = call i1 @cond()
361c78ed207SMax Kazantsev  br i1 %outer_cond_2, label %if.true, label %if.false
362c78ed207SMax Kazantsev
363c78ed207SMax Kazantsevif.true:
364c78ed207SMax Kazantsev  %smax = call i32 @llvm.smax.i32(i32 %a, i32 %outer.iv)
365c78ed207SMax Kazantsev  br label %outer.backedge
366c78ed207SMax Kazantsev
367c78ed207SMax Kazantsevif.false:
368c78ed207SMax Kazantsev  br label %outer.backedge
369c78ed207SMax Kazantsev
370c78ed207SMax Kazantsevinner:
371c78ed207SMax Kazantsev  %iv = phi i32 [%outer.iv, %outer], [%iv.next, %inner.backedge]
372c78ed207SMax Kazantsev  %signed_cond = icmp slt i32 %iv, %b
373c78ed207SMax Kazantsev  br i1 %signed_cond, label %inner.1, label %side.exit
374c78ed207SMax Kazantsev
375c78ed207SMax Kazantsevinner.1:
376c78ed207SMax Kazantsev  %unsigned_cond = icmp ult i32 %iv, %b
377c78ed207SMax Kazantsev  br i1 %unsigned_cond, label %inner.backedge, label %side.exit
378c78ed207SMax Kazantsev
379c78ed207SMax Kazantsevinner.backedge:
380c78ed207SMax Kazantsev  %iv.next = add nuw nsw i32 %iv, 1
381c78ed207SMax Kazantsev  %inner.loop.cond = call i1 @cond()
382c78ed207SMax Kazantsev  br i1 %inner.loop.cond, label %inner, label %outer.backedge
383c78ed207SMax Kazantsev
384c78ed207SMax Kazantsevouter.backedge:
385c78ed207SMax Kazantsev  %outer.merge = phi i32 [%smax, %if.true], [%outer.iv, %if.false], [%iv.next, %inner.backedge]
386c78ed207SMax Kazantsev  %outer.loop.cond = call i1 @cond()
387c78ed207SMax Kazantsev  br i1 %outer.loop.cond, label %outer, label %exit
388c78ed207SMax Kazantsev
389c78ed207SMax Kazantsevfailure:
390c78ed207SMax Kazantsev  unreachable
391c78ed207SMax Kazantsev
392c78ed207SMax Kazantsevside.exit:
393c78ed207SMax Kazantsev  ret i32 0
394c78ed207SMax Kazantsev
395c78ed207SMax Kazantsevexit:
396c78ed207SMax Kazantsev  ret i32 1
397c78ed207SMax Kazantsev}
398e787678cSMax Kazantsev
399e787678cSMax Kazantsev; Same as test_01, but non-negativity of %b is known without context.
400e787678cSMax Kazantsev; FIXME: We can remove 2nd check in loop.
401*864bb84aSNikita Popovdefine i32 @test_05(i32 %a, ptr %bp) {
402e787678cSMax Kazantsev; CHECK-LABEL: @test_05(
403e787678cSMax Kazantsev; CHECK-NEXT:  entry:
404*864bb84aSNikita Popov; CHECK-NEXT:    [[B:%.*]] = load i32, ptr [[BP:%.*]], align 4, !range [[RNG0:![0-9]+]]
405e787678cSMax Kazantsev; CHECK-NEXT:    br label [[OUTER:%.*]]
406e787678cSMax Kazantsev; CHECK:       outer:
407e787678cSMax Kazantsev; CHECK-NEXT:    [[OUTER_IV:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[IV_NEXT_LCSSA:%.*]], [[OUTER_BACKEDGE:%.*]] ]
408e787678cSMax Kazantsev; CHECK-NEXT:    br label [[INNER:%.*]]
409e787678cSMax Kazantsev; CHECK:       inner:
410e787678cSMax Kazantsev; CHECK-NEXT:    [[IV:%.*]] = phi i32 [ [[OUTER_IV]], [[OUTER]] ], [ [[IV_NEXT:%.*]], [[INNER_BACKEDGE:%.*]] ]
411e787678cSMax Kazantsev; CHECK-NEXT:    [[SIGNED_COND:%.*]] = icmp slt i32 [[IV]], [[B]]
412e787678cSMax Kazantsev; CHECK-NEXT:    br i1 [[SIGNED_COND]], label [[INNER_1:%.*]], label [[SIDE_EXIT:%.*]]
413e787678cSMax Kazantsev; CHECK:       inner.1:
414e587199aSMax Kazantsev; CHECK-NEXT:    [[UNSIGNED_COND:%.*]] = icmp ult i32 [[OUTER_IV]], [[B]]
415e787678cSMax Kazantsev; CHECK-NEXT:    br i1 [[UNSIGNED_COND]], label [[INNER_BACKEDGE]], label [[SIDE_EXIT]]
416e787678cSMax Kazantsev; CHECK:       inner.backedge:
417e787678cSMax Kazantsev; CHECK-NEXT:    [[IV_NEXT]] = add nuw nsw i32 [[IV]], 1
418e787678cSMax Kazantsev; CHECK-NEXT:    [[INNER_LOOP_COND:%.*]] = call i1 @cond()
419e787678cSMax Kazantsev; CHECK-NEXT:    br i1 [[INNER_LOOP_COND]], label [[INNER]], label [[OUTER_BACKEDGE]]
420e787678cSMax Kazantsev; CHECK:       outer.backedge:
421e787678cSMax Kazantsev; CHECK-NEXT:    [[IV_NEXT_LCSSA]] = phi i32 [ [[IV_NEXT]], [[INNER_BACKEDGE]] ]
422e787678cSMax Kazantsev; CHECK-NEXT:    [[OUTER_LOOP_COND:%.*]] = call i1 @cond()
423e787678cSMax Kazantsev; CHECK-NEXT:    br i1 [[OUTER_LOOP_COND]], label [[OUTER]], label [[EXIT:%.*]]
424e787678cSMax Kazantsev; CHECK:       side.exit:
425e787678cSMax Kazantsev; CHECK-NEXT:    ret i32 0
426e787678cSMax Kazantsev; CHECK:       exit:
427e787678cSMax Kazantsev; CHECK-NEXT:    ret i32 1
428e787678cSMax Kazantsev;
429e787678cSMax Kazantseventry:
430*864bb84aSNikita Popov  %b = load i32, ptr %bp, !range !0
431e787678cSMax Kazantsev  br label %outer
432e787678cSMax Kazantsev
433e787678cSMax Kazantsevouter:
434e787678cSMax Kazantsev  %outer.iv = phi i32 [0, %entry], [%iv.next, %outer.backedge]
435e787678cSMax Kazantsev  br label %inner
436e787678cSMax Kazantsev
437e787678cSMax Kazantsev
438e787678cSMax Kazantsevinner:
439e787678cSMax Kazantsev  %iv = phi i32 [%outer.iv, %outer], [%iv.next, %inner.backedge]
440e787678cSMax Kazantsev  %signed_cond = icmp slt i32 %iv, %b
441e787678cSMax Kazantsev  br i1 %signed_cond, label %inner.1, label %side.exit
442e787678cSMax Kazantsev
443e787678cSMax Kazantsevinner.1:
444e787678cSMax Kazantsev  %unsigned_cond = icmp ult i32 %iv, %b
445e787678cSMax Kazantsev  br i1 %unsigned_cond, label %inner.backedge, label %side.exit
446e787678cSMax Kazantsev
447e787678cSMax Kazantsevinner.backedge:
448e787678cSMax Kazantsev  %iv.next = add nuw nsw i32 %iv, 1
449e787678cSMax Kazantsev  %inner.loop.cond = call i1 @cond()
450e787678cSMax Kazantsev  br i1 %inner.loop.cond, label %inner, label %outer.backedge
451e787678cSMax Kazantsev
452e787678cSMax Kazantsevouter.backedge:
453e787678cSMax Kazantsev  %outer.loop.cond = call i1 @cond()
454e787678cSMax Kazantsev  br i1 %outer.loop.cond, label %outer, label %exit
455e787678cSMax Kazantsev
456e787678cSMax Kazantsevside.exit:
457e787678cSMax Kazantsev  ret i32 0
458e787678cSMax Kazantsev
459e787678cSMax Kazantsevexit:
460e787678cSMax Kazantsev  ret i32 1
461e787678cSMax Kazantsev}
462e787678cSMax Kazantsev
463e787678cSMax Kazantsev
464e787678cSMax Kazantsev; Same as test_01a, but non-negativity of %b is known without context.
465*864bb84aSNikita Popovdefine i32 @test_05a(i32 %a, ptr %bp) {
466e787678cSMax Kazantsev; CHECK-LABEL: @test_05a(
467e787678cSMax Kazantsev; CHECK-NEXT:  entry:
468*864bb84aSNikita Popov; CHECK-NEXT:    [[B:%.*]] = load i32, ptr [[BP:%.*]], align 4, !range [[RNG0]]
469e787678cSMax Kazantsev; CHECK-NEXT:    br label [[OUTER:%.*]]
470e787678cSMax Kazantsev; CHECK:       outer:
471e787678cSMax Kazantsev; CHECK-NEXT:    [[OUTER_IV:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[IV_NEXT_LCSSA:%.*]], [[OUTER_BACKEDGE:%.*]] ]
472e787678cSMax Kazantsev; CHECK-NEXT:    br label [[INNER:%.*]]
473e787678cSMax Kazantsev; CHECK:       inner:
474e787678cSMax Kazantsev; CHECK-NEXT:    [[IV:%.*]] = phi i32 [ [[OUTER_IV]], [[OUTER]] ], [ [[IV_NEXT:%.*]], [[INNER_BACKEDGE:%.*]] ]
47578873840SMax Kazantsev; CHECK-NEXT:    [[UNSIGNED_COND:%.*]] = icmp ult i32 [[IV]], [[B]]
47678873840SMax Kazantsev; CHECK-NEXT:    br i1 [[UNSIGNED_COND]], label [[INNER_1:%.*]], label [[SIDE_EXIT:%.*]]
477e787678cSMax Kazantsev; CHECK:       inner.1:
47890ae538cSMax Kazantsev; CHECK-NEXT:    br i1 true, label [[INNER_BACKEDGE]], label [[SIDE_EXIT]]
479e787678cSMax Kazantsev; CHECK:       inner.backedge:
480e787678cSMax Kazantsev; CHECK-NEXT:    [[IV_NEXT]] = add nuw nsw i32 [[IV]], 1
481e787678cSMax Kazantsev; CHECK-NEXT:    [[INNER_LOOP_COND:%.*]] = call i1 @cond()
482e787678cSMax Kazantsev; CHECK-NEXT:    br i1 [[INNER_LOOP_COND]], label [[INNER]], label [[OUTER_BACKEDGE]]
483e787678cSMax Kazantsev; CHECK:       outer.backedge:
484e787678cSMax Kazantsev; CHECK-NEXT:    [[IV_NEXT_LCSSA]] = phi i32 [ [[IV_NEXT]], [[INNER_BACKEDGE]] ]
485e787678cSMax Kazantsev; CHECK-NEXT:    [[OUTER_LOOP_COND:%.*]] = call i1 @cond()
486e787678cSMax Kazantsev; CHECK-NEXT:    br i1 [[OUTER_LOOP_COND]], label [[OUTER]], label [[EXIT:%.*]]
487e787678cSMax Kazantsev; CHECK:       side.exit:
488e787678cSMax Kazantsev; CHECK-NEXT:    ret i32 0
489e787678cSMax Kazantsev; CHECK:       exit:
490e787678cSMax Kazantsev; CHECK-NEXT:    ret i32 1
491e787678cSMax Kazantsev;
492e787678cSMax Kazantseventry:
493*864bb84aSNikita Popov  %b = load i32, ptr %bp, !range !0
494e787678cSMax Kazantsev  br label %outer
495e787678cSMax Kazantsev
496e787678cSMax Kazantsevouter:
497e787678cSMax Kazantsev  %outer.iv = phi i32 [0, %entry], [%iv.next, %outer.backedge]
498e787678cSMax Kazantsev  br label %inner
499e787678cSMax Kazantsev
500e787678cSMax Kazantsev
501e787678cSMax Kazantsevinner:
502e787678cSMax Kazantsev  %iv = phi i32 [%outer.iv, %outer], [%iv.next, %inner.backedge]
50378873840SMax Kazantsev  %unsigned_cond = icmp ult i32 %iv, %b
50478873840SMax Kazantsev  br i1 %unsigned_cond, label %inner.1, label %side.exit
50578873840SMax Kazantsev
50678873840SMax Kazantsevinner.1:
50778873840SMax Kazantsev  %signed_cond = icmp slt i32 %iv, %b
50878873840SMax Kazantsev  br i1 %signed_cond, label %inner.backedge, label %side.exit
50978873840SMax Kazantsev
51078873840SMax Kazantsevinner.backedge:
51178873840SMax Kazantsev  %iv.next = add nuw nsw i32 %iv, 1
51278873840SMax Kazantsev  %inner.loop.cond = call i1 @cond()
51378873840SMax Kazantsev  br i1 %inner.loop.cond, label %inner, label %outer.backedge
51478873840SMax Kazantsev
51578873840SMax Kazantsevouter.backedge:
51678873840SMax Kazantsev  %outer.loop.cond = call i1 @cond()
51778873840SMax Kazantsev  br i1 %outer.loop.cond, label %outer, label %exit
51878873840SMax Kazantsev
51978873840SMax Kazantsevside.exit:
52078873840SMax Kazantsev  ret i32 0
52178873840SMax Kazantsev
52278873840SMax Kazantsevexit:
52378873840SMax Kazantsev  ret i32 1
52478873840SMax Kazantsev}
52578873840SMax Kazantsev
52678873840SMax Kazantsev; Similar to test_05a, but inverted 2nd condition.
527*864bb84aSNikita Popovdefine i32 @test_05b(i32 %a, ptr %bp) {
52878873840SMax Kazantsev; CHECK-LABEL: @test_05b(
52978873840SMax Kazantsev; CHECK-NEXT:  entry:
530*864bb84aSNikita Popov; CHECK-NEXT:    [[B:%.*]] = load i32, ptr [[BP:%.*]], align 4, !range [[RNG0]]
53178873840SMax Kazantsev; CHECK-NEXT:    br label [[OUTER:%.*]]
53278873840SMax Kazantsev; CHECK:       outer:
53378873840SMax Kazantsev; CHECK-NEXT:    [[OUTER_IV:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[IV_NEXT_LCSSA:%.*]], [[OUTER_BACKEDGE:%.*]] ]
53478873840SMax Kazantsev; CHECK-NEXT:    br label [[INNER:%.*]]
53578873840SMax Kazantsev; CHECK:       inner:
53678873840SMax Kazantsev; CHECK-NEXT:    [[IV:%.*]] = phi i32 [ [[OUTER_IV]], [[OUTER]] ], [ [[IV_NEXT:%.*]], [[INNER_BACKEDGE:%.*]] ]
53778873840SMax Kazantsev; CHECK-NEXT:    [[UNSIGNED_COND:%.*]] = icmp ult i32 [[IV]], [[B]]
53878873840SMax Kazantsev; CHECK-NEXT:    br i1 [[UNSIGNED_COND]], label [[INNER_1:%.*]], label [[SIDE_EXIT:%.*]]
53978873840SMax Kazantsev; CHECK:       inner.1:
54090ae538cSMax Kazantsev; CHECK-NEXT:    br i1 true, label [[INNER_BACKEDGE]], label [[SIDE_EXIT]]
54178873840SMax Kazantsev; CHECK:       inner.backedge:
54278873840SMax Kazantsev; CHECK-NEXT:    [[IV_NEXT]] = add nuw nsw i32 [[IV]], 1
54378873840SMax Kazantsev; CHECK-NEXT:    [[INNER_LOOP_COND:%.*]] = call i1 @cond()
54478873840SMax Kazantsev; CHECK-NEXT:    br i1 [[INNER_LOOP_COND]], label [[INNER]], label [[OUTER_BACKEDGE]]
54578873840SMax Kazantsev; CHECK:       outer.backedge:
54678873840SMax Kazantsev; CHECK-NEXT:    [[IV_NEXT_LCSSA]] = phi i32 [ [[IV_NEXT]], [[INNER_BACKEDGE]] ]
54778873840SMax Kazantsev; CHECK-NEXT:    [[OUTER_LOOP_COND:%.*]] = call i1 @cond()
54878873840SMax Kazantsev; CHECK-NEXT:    br i1 [[OUTER_LOOP_COND]], label [[OUTER]], label [[EXIT:%.*]]
54978873840SMax Kazantsev; CHECK:       side.exit:
55078873840SMax Kazantsev; CHECK-NEXT:    ret i32 0
55178873840SMax Kazantsev; CHECK:       exit:
55278873840SMax Kazantsev; CHECK-NEXT:    ret i32 1
55378873840SMax Kazantsev;
55478873840SMax Kazantseventry:
555*864bb84aSNikita Popov  %b = load i32, ptr %bp, !range !0
55678873840SMax Kazantsev  br label %outer
55778873840SMax Kazantsev
55878873840SMax Kazantsevouter:
55978873840SMax Kazantsev  %outer.iv = phi i32 [0, %entry], [%iv.next, %outer.backedge]
56078873840SMax Kazantsev  br label %inner
56178873840SMax Kazantsev
56278873840SMax Kazantsev
56378873840SMax Kazantsevinner:
56478873840SMax Kazantsev  %iv = phi i32 [%outer.iv, %outer], [%iv.next, %inner.backedge]
56578873840SMax Kazantsev  %unsigned_cond = icmp ult i32 %iv, %b
56678873840SMax Kazantsev  br i1 %unsigned_cond, label %inner.1, label %side.exit
56778873840SMax Kazantsev
56878873840SMax Kazantsevinner.1:
56978873840SMax Kazantsev  %signed_cond = icmp sgt i32 %b, %iv
57078873840SMax Kazantsev  br i1 %signed_cond, label %inner.backedge, label %side.exit
57178873840SMax Kazantsev
57278873840SMax Kazantsevinner.backedge:
57378873840SMax Kazantsev  %iv.next = add nuw nsw i32 %iv, 1
57478873840SMax Kazantsev  %inner.loop.cond = call i1 @cond()
57578873840SMax Kazantsev  br i1 %inner.loop.cond, label %inner, label %outer.backedge
57678873840SMax Kazantsev
57778873840SMax Kazantsevouter.backedge:
57878873840SMax Kazantsev  %outer.loop.cond = call i1 @cond()
57978873840SMax Kazantsev  br i1 %outer.loop.cond, label %outer, label %exit
58078873840SMax Kazantsev
58178873840SMax Kazantsevside.exit:
58278873840SMax Kazantsev  ret i32 0
58378873840SMax Kazantsev
58478873840SMax Kazantsevexit:
58578873840SMax Kazantsev  ret i32 1
58678873840SMax Kazantsev}
58778873840SMax Kazantsev
58878873840SMax Kazantsev; We should prove implication: iv <s b, b <s 0 => iv <u b.
589*864bb84aSNikita Popovdefine i32 @test_05c(i32 %a, ptr %bp) {
59078873840SMax Kazantsev; CHECK-LABEL: @test_05c(
59178873840SMax Kazantsev; CHECK-NEXT:  entry:
592*864bb84aSNikita Popov; CHECK-NEXT:    [[B:%.*]] = load i32, ptr [[BP:%.*]], align 4, !range [[RNG1:![0-9]+]]
59378873840SMax Kazantsev; CHECK-NEXT:    br label [[OUTER:%.*]]
59478873840SMax Kazantsev; CHECK:       outer:
59578873840SMax Kazantsev; CHECK-NEXT:    [[OUTER_IV:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[IV_NEXT_LCSSA:%.*]], [[OUTER_BACKEDGE:%.*]] ]
59678873840SMax Kazantsev; CHECK-NEXT:    br label [[INNER:%.*]]
59778873840SMax Kazantsev; CHECK:       inner:
59878873840SMax Kazantsev; CHECK-NEXT:    [[IV:%.*]] = phi i32 [ [[OUTER_IV]], [[OUTER]] ], [ [[IV_NEXT:%.*]], [[INNER_BACKEDGE:%.*]] ]
59978873840SMax Kazantsev; CHECK-NEXT:    [[SIGNED_COND:%.*]] = icmp slt i32 [[IV]], [[B]]
60078873840SMax Kazantsev; CHECK-NEXT:    br i1 [[SIGNED_COND]], label [[INNER_1:%.*]], label [[SIDE_EXIT:%.*]]
60178873840SMax Kazantsev; CHECK:       inner.1:
60290ae538cSMax Kazantsev; CHECK-NEXT:    br i1 true, label [[INNER_BACKEDGE]], label [[SIDE_EXIT]]
60378873840SMax Kazantsev; CHECK:       inner.backedge:
60478873840SMax Kazantsev; CHECK-NEXT:    [[IV_NEXT]] = add nuw nsw i32 [[IV]], 1
60578873840SMax Kazantsev; CHECK-NEXT:    [[INNER_LOOP_COND:%.*]] = call i1 @cond()
60678873840SMax Kazantsev; CHECK-NEXT:    br i1 [[INNER_LOOP_COND]], label [[INNER]], label [[OUTER_BACKEDGE]]
60778873840SMax Kazantsev; CHECK:       outer.backedge:
60878873840SMax Kazantsev; CHECK-NEXT:    [[IV_NEXT_LCSSA]] = phi i32 [ [[IV_NEXT]], [[INNER_BACKEDGE]] ]
60978873840SMax Kazantsev; CHECK-NEXT:    [[OUTER_LOOP_COND:%.*]] = call i1 @cond()
61078873840SMax Kazantsev; CHECK-NEXT:    br i1 [[OUTER_LOOP_COND]], label [[OUTER]], label [[EXIT:%.*]]
61178873840SMax Kazantsev; CHECK:       side.exit:
61278873840SMax Kazantsev; CHECK-NEXT:    ret i32 0
61378873840SMax Kazantsev; CHECK:       exit:
61478873840SMax Kazantsev; CHECK-NEXT:    ret i32 1
61578873840SMax Kazantsev;
61678873840SMax Kazantseventry:
617*864bb84aSNikita Popov  %b = load i32, ptr %bp, !range !1
61878873840SMax Kazantsev  br label %outer
61978873840SMax Kazantsev
62078873840SMax Kazantsevouter:
62178873840SMax Kazantsev  %outer.iv = phi i32 [0, %entry], [%iv.next, %outer.backedge]
62278873840SMax Kazantsev  br label %inner
62378873840SMax Kazantsev
62478873840SMax Kazantsev
62578873840SMax Kazantsevinner:
62678873840SMax Kazantsev  %iv = phi i32 [%outer.iv, %outer], [%iv.next, %inner.backedge]
62778873840SMax Kazantsev  %signed_cond = icmp slt i32 %iv, %b
628e787678cSMax Kazantsev  br i1 %signed_cond, label %inner.1, label %side.exit
629e787678cSMax Kazantsev
630e787678cSMax Kazantsevinner.1:
63178873840SMax Kazantsev  %unsigned_cond = icmp ult i32 %iv, %b
63278873840SMax Kazantsev  br i1 %unsigned_cond, label %inner.backedge, label %side.exit
63378873840SMax Kazantsev
63478873840SMax Kazantsevinner.backedge:
63578873840SMax Kazantsev  %iv.next = add nuw nsw i32 %iv, 1
63678873840SMax Kazantsev  %inner.loop.cond = call i1 @cond()
63778873840SMax Kazantsev  br i1 %inner.loop.cond, label %inner, label %outer.backedge
63878873840SMax Kazantsev
63978873840SMax Kazantsevouter.backedge:
64078873840SMax Kazantsev  %outer.loop.cond = call i1 @cond()
64178873840SMax Kazantsev  br i1 %outer.loop.cond, label %outer, label %exit
64278873840SMax Kazantsev
64378873840SMax Kazantsevside.exit:
64478873840SMax Kazantsev  ret i32 0
64578873840SMax Kazantsev
64678873840SMax Kazantsevexit:
64778873840SMax Kazantsev  ret i32 1
64878873840SMax Kazantsev}
64978873840SMax Kazantsev
65078873840SMax Kazantsev; Same as test_05c, but 2nd condition reversed.
651*864bb84aSNikita Popovdefine i32 @test_05d(i32 %a, ptr %bp) {
65278873840SMax Kazantsev; CHECK-LABEL: @test_05d(
65378873840SMax Kazantsev; CHECK-NEXT:  entry:
654*864bb84aSNikita Popov; CHECK-NEXT:    [[B:%.*]] = load i32, ptr [[BP:%.*]], align 4, !range [[RNG1]]
65578873840SMax Kazantsev; CHECK-NEXT:    br label [[OUTER:%.*]]
65678873840SMax Kazantsev; CHECK:       outer:
65778873840SMax Kazantsev; CHECK-NEXT:    [[OUTER_IV:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[IV_NEXT_LCSSA:%.*]], [[OUTER_BACKEDGE:%.*]] ]
65878873840SMax Kazantsev; CHECK-NEXT:    br label [[INNER:%.*]]
65978873840SMax Kazantsev; CHECK:       inner:
66078873840SMax Kazantsev; CHECK-NEXT:    [[IV:%.*]] = phi i32 [ [[OUTER_IV]], [[OUTER]] ], [ [[IV_NEXT:%.*]], [[INNER_BACKEDGE:%.*]] ]
66178873840SMax Kazantsev; CHECK-NEXT:    [[SIGNED_COND:%.*]] = icmp slt i32 [[IV]], [[B]]
66278873840SMax Kazantsev; CHECK-NEXT:    br i1 [[SIGNED_COND]], label [[INNER_1:%.*]], label [[SIDE_EXIT:%.*]]
66378873840SMax Kazantsev; CHECK:       inner.1:
66490ae538cSMax Kazantsev; CHECK-NEXT:    br i1 true, label [[INNER_BACKEDGE]], label [[SIDE_EXIT]]
66578873840SMax Kazantsev; CHECK:       inner.backedge:
66678873840SMax Kazantsev; CHECK-NEXT:    [[IV_NEXT]] = add nuw nsw i32 [[IV]], 1
66778873840SMax Kazantsev; CHECK-NEXT:    [[INNER_LOOP_COND:%.*]] = call i1 @cond()
66878873840SMax Kazantsev; CHECK-NEXT:    br i1 [[INNER_LOOP_COND]], label [[INNER]], label [[OUTER_BACKEDGE]]
66978873840SMax Kazantsev; CHECK:       outer.backedge:
67078873840SMax Kazantsev; CHECK-NEXT:    [[IV_NEXT_LCSSA]] = phi i32 [ [[IV_NEXT]], [[INNER_BACKEDGE]] ]
67178873840SMax Kazantsev; CHECK-NEXT:    [[OUTER_LOOP_COND:%.*]] = call i1 @cond()
67278873840SMax Kazantsev; CHECK-NEXT:    br i1 [[OUTER_LOOP_COND]], label [[OUTER]], label [[EXIT:%.*]]
67378873840SMax Kazantsev; CHECK:       side.exit:
67478873840SMax Kazantsev; CHECK-NEXT:    ret i32 0
67578873840SMax Kazantsev; CHECK:       exit:
67678873840SMax Kazantsev; CHECK-NEXT:    ret i32 1
67778873840SMax Kazantsev;
67878873840SMax Kazantseventry:
679*864bb84aSNikita Popov  %b = load i32, ptr %bp, !range !1
68078873840SMax Kazantsev  br label %outer
68178873840SMax Kazantsev
68278873840SMax Kazantsevouter:
68378873840SMax Kazantsev  %outer.iv = phi i32 [0, %entry], [%iv.next, %outer.backedge]
68478873840SMax Kazantsev  br label %inner
68578873840SMax Kazantsev
68678873840SMax Kazantsev
68778873840SMax Kazantsevinner:
68878873840SMax Kazantsev  %iv = phi i32 [%outer.iv, %outer], [%iv.next, %inner.backedge]
68978873840SMax Kazantsev  %signed_cond = icmp slt i32 %iv, %b
69078873840SMax Kazantsev  br i1 %signed_cond, label %inner.1, label %side.exit
69178873840SMax Kazantsev
69278873840SMax Kazantsevinner.1:
69378873840SMax Kazantsev  %unsigned_cond = icmp ugt i32 %b, %iv
694e787678cSMax Kazantsev  br i1 %unsigned_cond, label %inner.backedge, label %side.exit
695e787678cSMax Kazantsev
696e787678cSMax Kazantsevinner.backedge:
697e787678cSMax Kazantsev  %iv.next = add nuw nsw i32 %iv, 1
698e787678cSMax Kazantsev  %inner.loop.cond = call i1 @cond()
699e787678cSMax Kazantsev  br i1 %inner.loop.cond, label %inner, label %outer.backedge
700e787678cSMax Kazantsev
701e787678cSMax Kazantsevouter.backedge:
702e787678cSMax Kazantsev  %outer.loop.cond = call i1 @cond()
703e787678cSMax Kazantsev  br i1 %outer.loop.cond, label %outer, label %exit
704e787678cSMax Kazantsev
705e787678cSMax Kazantsevside.exit:
706e787678cSMax Kazantsev  ret i32 0
707e787678cSMax Kazantsev
708e787678cSMax Kazantsevexit:
709e787678cSMax Kazantsev  ret i32 1
710e787678cSMax Kazantsev}
711e787678cSMax Kazantsev
712576ab15bSMax Kazantsev
713576ab15bSMax Kazantsev; Same as test_05a, but 1st condition inverted.
714*864bb84aSNikita Popovdefine i32 @test_05e(i32 %a, ptr %bp) {
715576ab15bSMax Kazantsev; CHECK-LABEL: @test_05e(
716576ab15bSMax Kazantsev; CHECK-NEXT:  entry:
717*864bb84aSNikita Popov; CHECK-NEXT:    [[B:%.*]] = load i32, ptr [[BP:%.*]], align 4, !range [[RNG0]]
718576ab15bSMax Kazantsev; CHECK-NEXT:    br label [[OUTER:%.*]]
719576ab15bSMax Kazantsev; CHECK:       outer:
720576ab15bSMax Kazantsev; CHECK-NEXT:    [[OUTER_IV:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[IV_NEXT_LCSSA:%.*]], [[OUTER_BACKEDGE:%.*]] ]
721576ab15bSMax Kazantsev; CHECK-NEXT:    br label [[INNER:%.*]]
722576ab15bSMax Kazantsev; CHECK:       inner:
723576ab15bSMax Kazantsev; CHECK-NEXT:    [[IV:%.*]] = phi i32 [ [[OUTER_IV]], [[OUTER]] ], [ [[IV_NEXT:%.*]], [[INNER_BACKEDGE:%.*]] ]
724576ab15bSMax Kazantsev; CHECK-NEXT:    [[UNSIGNED_COND:%.*]] = icmp ugt i32 [[B]], [[IV]]
725576ab15bSMax Kazantsev; CHECK-NEXT:    br i1 [[UNSIGNED_COND]], label [[INNER_1:%.*]], label [[SIDE_EXIT:%.*]]
726576ab15bSMax Kazantsev; CHECK:       inner.1:
72790ae538cSMax Kazantsev; CHECK-NEXT:    br i1 true, label [[INNER_BACKEDGE]], label [[SIDE_EXIT]]
728576ab15bSMax Kazantsev; CHECK:       inner.backedge:
729576ab15bSMax Kazantsev; CHECK-NEXT:    [[IV_NEXT]] = add nuw nsw i32 [[IV]], 1
730576ab15bSMax Kazantsev; CHECK-NEXT:    [[INNER_LOOP_COND:%.*]] = call i1 @cond()
731576ab15bSMax Kazantsev; CHECK-NEXT:    br i1 [[INNER_LOOP_COND]], label [[INNER]], label [[OUTER_BACKEDGE]]
732576ab15bSMax Kazantsev; CHECK:       outer.backedge:
733576ab15bSMax Kazantsev; CHECK-NEXT:    [[IV_NEXT_LCSSA]] = phi i32 [ [[IV_NEXT]], [[INNER_BACKEDGE]] ]
734576ab15bSMax Kazantsev; CHECK-NEXT:    [[OUTER_LOOP_COND:%.*]] = call i1 @cond()
735576ab15bSMax Kazantsev; CHECK-NEXT:    br i1 [[OUTER_LOOP_COND]], label [[OUTER]], label [[EXIT:%.*]]
736576ab15bSMax Kazantsev; CHECK:       side.exit:
737576ab15bSMax Kazantsev; CHECK-NEXT:    ret i32 0
738576ab15bSMax Kazantsev; CHECK:       exit:
739576ab15bSMax Kazantsev; CHECK-NEXT:    ret i32 1
740576ab15bSMax Kazantsev;
741576ab15bSMax Kazantseventry:
742*864bb84aSNikita Popov  %b = load i32, ptr %bp, !range !0
743576ab15bSMax Kazantsev  br label %outer
744576ab15bSMax Kazantsev
745576ab15bSMax Kazantsevouter:
746576ab15bSMax Kazantsev  %outer.iv = phi i32 [0, %entry], [%iv.next, %outer.backedge]
747576ab15bSMax Kazantsev  br label %inner
748576ab15bSMax Kazantsev
749576ab15bSMax Kazantsev
750576ab15bSMax Kazantsevinner:
751576ab15bSMax Kazantsev  %iv = phi i32 [%outer.iv, %outer], [%iv.next, %inner.backedge]
752576ab15bSMax Kazantsev  %unsigned_cond = icmp ugt i32 %b, %iv
753576ab15bSMax Kazantsev  br i1 %unsigned_cond, label %inner.1, label %side.exit
754576ab15bSMax Kazantsev
755576ab15bSMax Kazantsevinner.1:
756576ab15bSMax Kazantsev  %signed_cond = icmp slt i32 %iv, %b
757576ab15bSMax Kazantsev  br i1 %signed_cond, label %inner.backedge, label %side.exit
758576ab15bSMax Kazantsev
759576ab15bSMax Kazantsevinner.backedge:
760576ab15bSMax Kazantsev  %iv.next = add nuw nsw i32 %iv, 1
761576ab15bSMax Kazantsev  %inner.loop.cond = call i1 @cond()
762576ab15bSMax Kazantsev  br i1 %inner.loop.cond, label %inner, label %outer.backedge
763576ab15bSMax Kazantsev
764576ab15bSMax Kazantsevouter.backedge:
765576ab15bSMax Kazantsev  %outer.loop.cond = call i1 @cond()
766576ab15bSMax Kazantsev  br i1 %outer.loop.cond, label %outer, label %exit
767576ab15bSMax Kazantsev
768576ab15bSMax Kazantsevside.exit:
769576ab15bSMax Kazantsev  ret i32 0
770576ab15bSMax Kazantsev
771576ab15bSMax Kazantsevexit:
772576ab15bSMax Kazantsev  ret i32 1
773576ab15bSMax Kazantsev}
774576ab15bSMax Kazantsev
775576ab15bSMax Kazantsev; Same as test_05b, but 1st condition inverted.
776*864bb84aSNikita Popovdefine i32 @test_05f(i32 %a, ptr %bp) {
777576ab15bSMax Kazantsev; CHECK-LABEL: @test_05f(
778576ab15bSMax Kazantsev; CHECK-NEXT:  entry:
779*864bb84aSNikita Popov; CHECK-NEXT:    [[B:%.*]] = load i32, ptr [[BP:%.*]], align 4, !range [[RNG0]]
780576ab15bSMax Kazantsev; CHECK-NEXT:    br label [[OUTER:%.*]]
781576ab15bSMax Kazantsev; CHECK:       outer:
782576ab15bSMax Kazantsev; CHECK-NEXT:    [[OUTER_IV:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[IV_NEXT_LCSSA:%.*]], [[OUTER_BACKEDGE:%.*]] ]
783576ab15bSMax Kazantsev; CHECK-NEXT:    br label [[INNER:%.*]]
784576ab15bSMax Kazantsev; CHECK:       inner:
785576ab15bSMax Kazantsev; CHECK-NEXT:    [[IV:%.*]] = phi i32 [ [[OUTER_IV]], [[OUTER]] ], [ [[IV_NEXT:%.*]], [[INNER_BACKEDGE:%.*]] ]
786576ab15bSMax Kazantsev; CHECK-NEXT:    [[UNSIGNED_COND:%.*]] = icmp ugt i32 [[B]], [[IV]]
787576ab15bSMax Kazantsev; CHECK-NEXT:    br i1 [[UNSIGNED_COND]], label [[INNER_1:%.*]], label [[SIDE_EXIT:%.*]]
788576ab15bSMax Kazantsev; CHECK:       inner.1:
78990ae538cSMax Kazantsev; CHECK-NEXT:    br i1 true, label [[INNER_BACKEDGE]], label [[SIDE_EXIT]]
790576ab15bSMax Kazantsev; CHECK:       inner.backedge:
791576ab15bSMax Kazantsev; CHECK-NEXT:    [[IV_NEXT]] = add nuw nsw i32 [[IV]], 1
792576ab15bSMax Kazantsev; CHECK-NEXT:    [[INNER_LOOP_COND:%.*]] = call i1 @cond()
793576ab15bSMax Kazantsev; CHECK-NEXT:    br i1 [[INNER_LOOP_COND]], label [[INNER]], label [[OUTER_BACKEDGE]]
794576ab15bSMax Kazantsev; CHECK:       outer.backedge:
795576ab15bSMax Kazantsev; CHECK-NEXT:    [[IV_NEXT_LCSSA]] = phi i32 [ [[IV_NEXT]], [[INNER_BACKEDGE]] ]
796576ab15bSMax Kazantsev; CHECK-NEXT:    [[OUTER_LOOP_COND:%.*]] = call i1 @cond()
797576ab15bSMax Kazantsev; CHECK-NEXT:    br i1 [[OUTER_LOOP_COND]], label [[OUTER]], label [[EXIT:%.*]]
798576ab15bSMax Kazantsev; CHECK:       side.exit:
799576ab15bSMax Kazantsev; CHECK-NEXT:    ret i32 0
800576ab15bSMax Kazantsev; CHECK:       exit:
801576ab15bSMax Kazantsev; CHECK-NEXT:    ret i32 1
802576ab15bSMax Kazantsev;
803576ab15bSMax Kazantseventry:
804*864bb84aSNikita Popov  %b = load i32, ptr %bp, !range !0
805576ab15bSMax Kazantsev  br label %outer
806576ab15bSMax Kazantsev
807576ab15bSMax Kazantsevouter:
808576ab15bSMax Kazantsev  %outer.iv = phi i32 [0, %entry], [%iv.next, %outer.backedge]
809576ab15bSMax Kazantsev  br label %inner
810576ab15bSMax Kazantsev
811576ab15bSMax Kazantsev
812576ab15bSMax Kazantsevinner:
813576ab15bSMax Kazantsev  %iv = phi i32 [%outer.iv, %outer], [%iv.next, %inner.backedge]
814576ab15bSMax Kazantsev  %unsigned_cond = icmp ugt i32 %b, %iv
815576ab15bSMax Kazantsev  br i1 %unsigned_cond, label %inner.1, label %side.exit
816576ab15bSMax Kazantsev
817576ab15bSMax Kazantsevinner.1:
818576ab15bSMax Kazantsev  %signed_cond = icmp sgt i32 %b, %iv
819576ab15bSMax Kazantsev  br i1 %signed_cond, label %inner.backedge, label %side.exit
820576ab15bSMax Kazantsev
821576ab15bSMax Kazantsevinner.backedge:
822576ab15bSMax Kazantsev  %iv.next = add nuw nsw i32 %iv, 1
823576ab15bSMax Kazantsev  %inner.loop.cond = call i1 @cond()
824576ab15bSMax Kazantsev  br i1 %inner.loop.cond, label %inner, label %outer.backedge
825576ab15bSMax Kazantsev
826576ab15bSMax Kazantsevouter.backedge:
827576ab15bSMax Kazantsev  %outer.loop.cond = call i1 @cond()
828576ab15bSMax Kazantsev  br i1 %outer.loop.cond, label %outer, label %exit
829576ab15bSMax Kazantsev
830576ab15bSMax Kazantsevside.exit:
831576ab15bSMax Kazantsev  ret i32 0
832576ab15bSMax Kazantsev
833576ab15bSMax Kazantsevexit:
834576ab15bSMax Kazantsev  ret i32 1
835576ab15bSMax Kazantsev}
836576ab15bSMax Kazantsev
837576ab15bSMax Kazantsev; Same as test_05c, but 1st condition inverted.
838*864bb84aSNikita Popovdefine i32 @test_05g(i32 %a, ptr %bp) {
839576ab15bSMax Kazantsev; CHECK-LABEL: @test_05g(
840576ab15bSMax Kazantsev; CHECK-NEXT:  entry:
841*864bb84aSNikita Popov; CHECK-NEXT:    [[B:%.*]] = load i32, ptr [[BP:%.*]], align 4, !range [[RNG1]]
842576ab15bSMax Kazantsev; CHECK-NEXT:    br label [[OUTER:%.*]]
843576ab15bSMax Kazantsev; CHECK:       outer:
844576ab15bSMax Kazantsev; CHECK-NEXT:    [[OUTER_IV:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[IV_NEXT_LCSSA:%.*]], [[OUTER_BACKEDGE:%.*]] ]
845576ab15bSMax Kazantsev; CHECK-NEXT:    br label [[INNER:%.*]]
846576ab15bSMax Kazantsev; CHECK:       inner:
847576ab15bSMax Kazantsev; CHECK-NEXT:    [[IV:%.*]] = phi i32 [ [[OUTER_IV]], [[OUTER]] ], [ [[IV_NEXT:%.*]], [[INNER_BACKEDGE:%.*]] ]
848576ab15bSMax Kazantsev; CHECK-NEXT:    [[SIGNED_COND:%.*]] = icmp sgt i32 [[B]], [[IV]]
849576ab15bSMax Kazantsev; CHECK-NEXT:    br i1 [[SIGNED_COND]], label [[INNER_1:%.*]], label [[SIDE_EXIT:%.*]]
850576ab15bSMax Kazantsev; CHECK:       inner.1:
85190ae538cSMax Kazantsev; CHECK-NEXT:    br i1 true, label [[INNER_BACKEDGE]], label [[SIDE_EXIT]]
852576ab15bSMax Kazantsev; CHECK:       inner.backedge:
853576ab15bSMax Kazantsev; CHECK-NEXT:    [[IV_NEXT]] = add nuw nsw i32 [[IV]], 1
854576ab15bSMax Kazantsev; CHECK-NEXT:    [[INNER_LOOP_COND:%.*]] = call i1 @cond()
855576ab15bSMax Kazantsev; CHECK-NEXT:    br i1 [[INNER_LOOP_COND]], label [[INNER]], label [[OUTER_BACKEDGE]]
856576ab15bSMax Kazantsev; CHECK:       outer.backedge:
857576ab15bSMax Kazantsev; CHECK-NEXT:    [[IV_NEXT_LCSSA]] = phi i32 [ [[IV_NEXT]], [[INNER_BACKEDGE]] ]
858576ab15bSMax Kazantsev; CHECK-NEXT:    [[OUTER_LOOP_COND:%.*]] = call i1 @cond()
859576ab15bSMax Kazantsev; CHECK-NEXT:    br i1 [[OUTER_LOOP_COND]], label [[OUTER]], label [[EXIT:%.*]]
860576ab15bSMax Kazantsev; CHECK:       side.exit:
861576ab15bSMax Kazantsev; CHECK-NEXT:    ret i32 0
862576ab15bSMax Kazantsev; CHECK:       exit:
863576ab15bSMax Kazantsev; CHECK-NEXT:    ret i32 1
864576ab15bSMax Kazantsev;
865576ab15bSMax Kazantseventry:
866*864bb84aSNikita Popov  %b = load i32, ptr %bp, !range !1
867576ab15bSMax Kazantsev  br label %outer
868576ab15bSMax Kazantsev
869576ab15bSMax Kazantsevouter:
870576ab15bSMax Kazantsev  %outer.iv = phi i32 [0, %entry], [%iv.next, %outer.backedge]
871576ab15bSMax Kazantsev  br label %inner
872576ab15bSMax Kazantsev
873576ab15bSMax Kazantsev
874576ab15bSMax Kazantsevinner:
875576ab15bSMax Kazantsev  %iv = phi i32 [%outer.iv, %outer], [%iv.next, %inner.backedge]
876576ab15bSMax Kazantsev  %signed_cond = icmp sgt i32 %b, %iv
877576ab15bSMax Kazantsev  br i1 %signed_cond, label %inner.1, label %side.exit
878576ab15bSMax Kazantsev
879576ab15bSMax Kazantsevinner.1:
880576ab15bSMax Kazantsev  %unsigned_cond = icmp ult i32 %iv, %b
881576ab15bSMax Kazantsev  br i1 %unsigned_cond, label %inner.backedge, label %side.exit
882576ab15bSMax Kazantsev
883576ab15bSMax Kazantsevinner.backedge:
884576ab15bSMax Kazantsev  %iv.next = add nuw nsw i32 %iv, 1
885576ab15bSMax Kazantsev  %inner.loop.cond = call i1 @cond()
886576ab15bSMax Kazantsev  br i1 %inner.loop.cond, label %inner, label %outer.backedge
887576ab15bSMax Kazantsev
888576ab15bSMax Kazantsevouter.backedge:
889576ab15bSMax Kazantsev  %outer.loop.cond = call i1 @cond()
890576ab15bSMax Kazantsev  br i1 %outer.loop.cond, label %outer, label %exit
891576ab15bSMax Kazantsev
892576ab15bSMax Kazantsevside.exit:
893576ab15bSMax Kazantsev  ret i32 0
894576ab15bSMax Kazantsev
895576ab15bSMax Kazantsevexit:
896576ab15bSMax Kazantsev  ret i32 1
897576ab15bSMax Kazantsev}
898576ab15bSMax Kazantsev
899576ab15bSMax Kazantsev; Same as test_05d, but 1st condition inverted.
900*864bb84aSNikita Popovdefine i32 @test_05h(i32 %a, ptr %bp) {
901576ab15bSMax Kazantsev; CHECK-LABEL: @test_05h(
902576ab15bSMax Kazantsev; CHECK-NEXT:  entry:
903*864bb84aSNikita Popov; CHECK-NEXT:    [[B:%.*]] = load i32, ptr [[BP:%.*]], align 4, !range [[RNG1]]
904576ab15bSMax Kazantsev; CHECK-NEXT:    br label [[OUTER:%.*]]
905576ab15bSMax Kazantsev; CHECK:       outer:
906576ab15bSMax Kazantsev; CHECK-NEXT:    [[OUTER_IV:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[IV_NEXT_LCSSA:%.*]], [[OUTER_BACKEDGE:%.*]] ]
907576ab15bSMax Kazantsev; CHECK-NEXT:    br label [[INNER:%.*]]
908576ab15bSMax Kazantsev; CHECK:       inner:
909576ab15bSMax Kazantsev; CHECK-NEXT:    [[IV:%.*]] = phi i32 [ [[OUTER_IV]], [[OUTER]] ], [ [[IV_NEXT:%.*]], [[INNER_BACKEDGE:%.*]] ]
910576ab15bSMax Kazantsev; CHECK-NEXT:    [[SIGNED_COND:%.*]] = icmp sgt i32 [[B]], [[IV]]
911576ab15bSMax Kazantsev; CHECK-NEXT:    br i1 [[SIGNED_COND]], label [[INNER_1:%.*]], label [[SIDE_EXIT:%.*]]
912576ab15bSMax Kazantsev; CHECK:       inner.1:
91390ae538cSMax Kazantsev; CHECK-NEXT:    br i1 true, label [[INNER_BACKEDGE]], label [[SIDE_EXIT]]
914576ab15bSMax Kazantsev; CHECK:       inner.backedge:
915576ab15bSMax Kazantsev; CHECK-NEXT:    [[IV_NEXT]] = add nuw nsw i32 [[IV]], 1
916576ab15bSMax Kazantsev; CHECK-NEXT:    [[INNER_LOOP_COND:%.*]] = call i1 @cond()
917576ab15bSMax Kazantsev; CHECK-NEXT:    br i1 [[INNER_LOOP_COND]], label [[INNER]], label [[OUTER_BACKEDGE]]
918576ab15bSMax Kazantsev; CHECK:       outer.backedge:
919576ab15bSMax Kazantsev; CHECK-NEXT:    [[IV_NEXT_LCSSA]] = phi i32 [ [[IV_NEXT]], [[INNER_BACKEDGE]] ]
920576ab15bSMax Kazantsev; CHECK-NEXT:    [[OUTER_LOOP_COND:%.*]] = call i1 @cond()
921576ab15bSMax Kazantsev; CHECK-NEXT:    br i1 [[OUTER_LOOP_COND]], label [[OUTER]], label [[EXIT:%.*]]
922576ab15bSMax Kazantsev; CHECK:       side.exit:
923576ab15bSMax Kazantsev; CHECK-NEXT:    ret i32 0
924576ab15bSMax Kazantsev; CHECK:       exit:
925576ab15bSMax Kazantsev; CHECK-NEXT:    ret i32 1
926576ab15bSMax Kazantsev;
927576ab15bSMax Kazantseventry:
928*864bb84aSNikita Popov  %b = load i32, ptr %bp, !range !1
929576ab15bSMax Kazantsev  br label %outer
930576ab15bSMax Kazantsev
931576ab15bSMax Kazantsevouter:
932576ab15bSMax Kazantsev  %outer.iv = phi i32 [0, %entry], [%iv.next, %outer.backedge]
933576ab15bSMax Kazantsev  br label %inner
934576ab15bSMax Kazantsev
935576ab15bSMax Kazantsev
936576ab15bSMax Kazantsevinner:
937576ab15bSMax Kazantsev  %iv = phi i32 [%outer.iv, %outer], [%iv.next, %inner.backedge]
938576ab15bSMax Kazantsev  %signed_cond = icmp sgt i32 %b, %iv
939576ab15bSMax Kazantsev  br i1 %signed_cond, label %inner.1, label %side.exit
940576ab15bSMax Kazantsev
941576ab15bSMax Kazantsevinner.1:
942576ab15bSMax Kazantsev  %unsigned_cond = icmp ugt i32 %b, %iv
943576ab15bSMax Kazantsev  br i1 %unsigned_cond, label %inner.backedge, label %side.exit
944576ab15bSMax Kazantsev
945576ab15bSMax Kazantsevinner.backedge:
946576ab15bSMax Kazantsev  %iv.next = add nuw nsw i32 %iv, 1
947576ab15bSMax Kazantsev  %inner.loop.cond = call i1 @cond()
948576ab15bSMax Kazantsev  br i1 %inner.loop.cond, label %inner, label %outer.backedge
949576ab15bSMax Kazantsev
950576ab15bSMax Kazantsevouter.backedge:
951576ab15bSMax Kazantsev  %outer.loop.cond = call i1 @cond()
952576ab15bSMax Kazantsev  br i1 %outer.loop.cond, label %outer, label %exit
953576ab15bSMax Kazantsev
954576ab15bSMax Kazantsevside.exit:
955576ab15bSMax Kazantsev  ret i32 0
956576ab15bSMax Kazantsev
957576ab15bSMax Kazantsevexit:
958576ab15bSMax Kazantsev  ret i32 1
959576ab15bSMax Kazantsev}
960576ab15bSMax Kazantsev
961e787678cSMax Kazantsev; Same as test_02, but non-negativity of %b is known without context.
962e787678cSMax Kazantsev; FIXME: We can remove 2nd check in loop.
963*864bb84aSNikita Popovdefine i32 @test_06(i32 %a, ptr %bp) {
964e787678cSMax Kazantsev; CHECK-LABEL: @test_06(
965e787678cSMax Kazantsev; CHECK-NEXT:  entry:
966*864bb84aSNikita Popov; CHECK-NEXT:    [[B:%.*]] = load i32, ptr [[BP:%.*]], align 4, !range [[RNG0]]
967e787678cSMax Kazantsev; CHECK-NEXT:    br label [[OUTER:%.*]]
968e787678cSMax Kazantsev; CHECK:       outer:
969e787678cSMax Kazantsev; CHECK-NEXT:    [[OUTER_IV:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[OUTER_MERGE:%.*]], [[OUTER_BACKEDGE:%.*]] ]
970e787678cSMax Kazantsev; CHECK-NEXT:    br label [[INNER:%.*]]
971e787678cSMax Kazantsev; CHECK:       inner:
972e787678cSMax Kazantsev; CHECK-NEXT:    [[IV:%.*]] = phi i32 [ [[OUTER_IV]], [[OUTER]] ], [ [[IV_NEXT:%.*]], [[INNER_BACKEDGE:%.*]] ]
973e787678cSMax Kazantsev; CHECK-NEXT:    [[SIGNED_COND:%.*]] = icmp slt i32 [[IV]], [[B]]
974e787678cSMax Kazantsev; CHECK-NEXT:    br i1 [[SIGNED_COND]], label [[INNER_1:%.*]], label [[SIDE_EXIT:%.*]]
975e787678cSMax Kazantsev; CHECK:       inner.1:
976e587199aSMax Kazantsev; CHECK-NEXT:    [[UNSIGNED_COND:%.*]] = icmp ult i32 [[OUTER_IV]], [[B]]
977e787678cSMax Kazantsev; CHECK-NEXT:    br i1 [[UNSIGNED_COND]], label [[INNER_BACKEDGE]], label [[SIDE_EXIT]]
978e787678cSMax Kazantsev; CHECK:       inner.backedge:
979e787678cSMax Kazantsev; CHECK-NEXT:    [[IV_NEXT]] = add nuw nsw i32 [[IV]], 1
980e787678cSMax Kazantsev; CHECK-NEXT:    [[INNER_LOOP_COND:%.*]] = call i1 @cond()
981e787678cSMax Kazantsev; CHECK-NEXT:    br i1 [[INNER_LOOP_COND]], label [[INNER]], label [[OUTER_BACKEDGE]]
982e787678cSMax Kazantsev; CHECK:       outer.backedge:
983e787678cSMax Kazantsev; CHECK-NEXT:    [[OUTER_MERGE]] = phi i32 [ [[IV_NEXT]], [[INNER_BACKEDGE]] ]
984e787678cSMax Kazantsev; CHECK-NEXT:    [[OUTER_LOOP_COND:%.*]] = call i1 @cond()
985e787678cSMax Kazantsev; CHECK-NEXT:    br i1 [[OUTER_LOOP_COND]], label [[OUTER]], label [[EXIT:%.*]]
986e787678cSMax Kazantsev; CHECK:       side.exit:
987e787678cSMax Kazantsev; CHECK-NEXT:    ret i32 0
988e787678cSMax Kazantsev; CHECK:       exit:
989e787678cSMax Kazantsev; CHECK-NEXT:    ret i32 1
990e787678cSMax Kazantsev;
991e787678cSMax Kazantseventry:
992*864bb84aSNikita Popov  %b = load i32, ptr %bp, !range !0
993e787678cSMax Kazantsev  br label %outer
994e787678cSMax Kazantsev
995e787678cSMax Kazantsevouter:
996e787678cSMax Kazantsev  %outer.iv = phi i32 [0, %entry], [%outer.merge, %outer.backedge]
997e787678cSMax Kazantsev  br label %inner
998e787678cSMax Kazantsev
999e787678cSMax Kazantsev
1000e787678cSMax Kazantsevinner:
1001e787678cSMax Kazantsev  %iv = phi i32 [%outer.iv, %outer], [%iv.next, %inner.backedge]
1002e787678cSMax Kazantsev  %signed_cond = icmp slt i32 %iv, %b
1003e787678cSMax Kazantsev  br i1 %signed_cond, label %inner.1, label %side.exit
1004e787678cSMax Kazantsev
1005e787678cSMax Kazantsevinner.1:
1006e787678cSMax Kazantsev  %unsigned_cond = icmp ult i32 %iv, %b
1007e787678cSMax Kazantsev  br i1 %unsigned_cond, label %inner.backedge, label %side.exit
1008e787678cSMax Kazantsev
1009e787678cSMax Kazantsevinner.backedge:
1010e787678cSMax Kazantsev  %iv.next = add nuw nsw i32 %iv, 1
1011e787678cSMax Kazantsev  %inner.loop.cond = call i1 @cond()
1012e787678cSMax Kazantsev  br i1 %inner.loop.cond, label %inner, label %outer.backedge
1013e787678cSMax Kazantsev
1014e787678cSMax Kazantsevouter.backedge:
1015e787678cSMax Kazantsev  %outer.merge = phi i32 [%iv.next, %inner.backedge]
1016e787678cSMax Kazantsev  %outer.loop.cond = call i1 @cond()
1017e787678cSMax Kazantsev  br i1 %outer.loop.cond, label %outer, label %exit
1018e787678cSMax Kazantsev
1019e787678cSMax Kazantsevside.exit:
1020e787678cSMax Kazantsev  ret i32 0
1021e787678cSMax Kazantsev
1022e787678cSMax Kazantsevexit:
1023e787678cSMax Kazantsev  ret i32 1
1024e787678cSMax Kazantsev}
1025e787678cSMax Kazantsev
1026e787678cSMax Kazantsev; Same as test_03, but non-negativity of %b is known without context.
1027e787678cSMax Kazantsev; FIXME: We can remove 2nd check in loop.
1028*864bb84aSNikita Popovdefine i32 @test_07(i32 %a, ptr %bp) {
1029e787678cSMax Kazantsev; CHECK-LABEL: @test_07(
1030e787678cSMax Kazantsev; CHECK-NEXT:  entry:
1031*864bb84aSNikita Popov; CHECK-NEXT:    [[B:%.*]] = load i32, ptr [[BP:%.*]], align 4, !range [[RNG0]]
1032e787678cSMax Kazantsev; CHECK-NEXT:    br label [[OUTER:%.*]]
1033e787678cSMax Kazantsev; CHECK:       outer:
1034e787678cSMax Kazantsev; CHECK-NEXT:    [[OUTER_IV:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[OUTER_MERGE:%.*]], [[OUTER_BACKEDGE:%.*]] ]
1035e787678cSMax Kazantsev; CHECK-NEXT:    [[OUTER_COND_1:%.*]] = call i1 @cond()
1036e787678cSMax Kazantsev; CHECK-NEXT:    br i1 [[OUTER_COND_1]], label [[INNER_PREHEADER:%.*]], label [[NO_INNER:%.*]]
1037e787678cSMax Kazantsev; CHECK:       inner.preheader:
1038e787678cSMax Kazantsev; CHECK-NEXT:    br label [[INNER:%.*]]
1039e787678cSMax Kazantsev; CHECK:       no_inner:
1040e787678cSMax Kazantsev; CHECK-NEXT:    [[OUTER_COND_2:%.*]] = call i1 @cond()
1041e787678cSMax Kazantsev; CHECK-NEXT:    br label [[OUTER_BACKEDGE]]
1042e787678cSMax Kazantsev; CHECK:       inner:
1043e787678cSMax Kazantsev; CHECK-NEXT:    [[IV:%.*]] = phi i32 [ [[IV_NEXT:%.*]], [[INNER_BACKEDGE:%.*]] ], [ [[OUTER_IV]], [[INNER_PREHEADER]] ]
1044e787678cSMax Kazantsev; CHECK-NEXT:    [[SIGNED_COND:%.*]] = icmp slt i32 [[IV]], [[B]]
1045e787678cSMax Kazantsev; CHECK-NEXT:    br i1 [[SIGNED_COND]], label [[INNER_1:%.*]], label [[SIDE_EXIT:%.*]]
1046e787678cSMax Kazantsev; CHECK:       inner.1:
1047e587199aSMax Kazantsev; CHECK-NEXT:    [[UNSIGNED_COND:%.*]] = icmp ult i32 [[OUTER_IV]], [[B]]
1048e787678cSMax Kazantsev; CHECK-NEXT:    br i1 [[UNSIGNED_COND]], label [[INNER_BACKEDGE]], label [[SIDE_EXIT]]
1049e787678cSMax Kazantsev; CHECK:       inner.backedge:
1050e787678cSMax Kazantsev; CHECK-NEXT:    [[IV_NEXT]] = add nuw nsw i32 [[IV]], 1
1051e787678cSMax Kazantsev; CHECK-NEXT:    [[INNER_LOOP_COND:%.*]] = call i1 @cond()
1052e787678cSMax Kazantsev; CHECK-NEXT:    br i1 [[INNER_LOOP_COND]], label [[INNER]], label [[OUTER_BACKEDGE_LOOPEXIT:%.*]]
1053e787678cSMax Kazantsev; CHECK:       outer.backedge.loopexit:
1054e787678cSMax Kazantsev; CHECK-NEXT:    [[IV_NEXT_LCSSA:%.*]] = phi i32 [ [[IV_NEXT]], [[INNER_BACKEDGE]] ]
1055e787678cSMax Kazantsev; CHECK-NEXT:    br label [[OUTER_BACKEDGE]]
1056e787678cSMax Kazantsev; CHECK:       outer.backedge:
1057e787678cSMax Kazantsev; CHECK-NEXT:    [[OUTER_MERGE]] = phi i32 [ [[OUTER_IV]], [[NO_INNER]] ], [ [[IV_NEXT_LCSSA]], [[OUTER_BACKEDGE_LOOPEXIT]] ]
1058e787678cSMax Kazantsev; CHECK-NEXT:    [[OUTER_LOOP_COND:%.*]] = call i1 @cond()
1059e787678cSMax Kazantsev; CHECK-NEXT:    br i1 [[OUTER_LOOP_COND]], label [[OUTER]], label [[EXIT:%.*]]
1060e787678cSMax Kazantsev; CHECK:       side.exit:
1061e787678cSMax Kazantsev; CHECK-NEXT:    ret i32 0
1062e787678cSMax Kazantsev; CHECK:       exit:
1063e787678cSMax Kazantsev; CHECK-NEXT:    ret i32 1
1064e787678cSMax Kazantsev;
1065e787678cSMax Kazantseventry:
1066*864bb84aSNikita Popov  %b = load i32, ptr %bp, !range !0
1067e787678cSMax Kazantsev  br label %outer
1068e787678cSMax Kazantsev
1069e787678cSMax Kazantsevouter:
1070e787678cSMax Kazantsev  %outer.iv = phi i32 [0, %entry], [%outer.merge, %outer.backedge]
1071e787678cSMax Kazantsev  %outer_cond_1 = call i1 @cond()
1072e787678cSMax Kazantsev  br i1 %outer_cond_1, label %inner, label %no_inner
1073e787678cSMax Kazantsev
1074e787678cSMax Kazantsevno_inner:
1075e787678cSMax Kazantsev  %outer_cond_2 = call i1 @cond()
1076e787678cSMax Kazantsev  br label %outer.backedge
1077e787678cSMax Kazantsev
1078e787678cSMax Kazantsevinner:
1079e787678cSMax Kazantsev  %iv = phi i32 [%outer.iv, %outer], [%iv.next, %inner.backedge]
1080e787678cSMax Kazantsev  %signed_cond = icmp slt i32 %iv, %b
1081e787678cSMax Kazantsev  br i1 %signed_cond, label %inner.1, label %side.exit
1082e787678cSMax Kazantsev
1083e787678cSMax Kazantsevinner.1:
1084e787678cSMax Kazantsev  %unsigned_cond = icmp ult i32 %iv, %b
1085e787678cSMax Kazantsev  br i1 %unsigned_cond, label %inner.backedge, label %side.exit
1086e787678cSMax Kazantsev
1087e787678cSMax Kazantsevinner.backedge:
1088e787678cSMax Kazantsev  %iv.next = add nuw nsw i32 %iv, 1
1089e787678cSMax Kazantsev  %inner.loop.cond = call i1 @cond()
1090e787678cSMax Kazantsev  br i1 %inner.loop.cond, label %inner, label %outer.backedge
1091e787678cSMax Kazantsev
1092e787678cSMax Kazantsevouter.backedge:
1093e787678cSMax Kazantsev  %outer.merge = phi i32 [%outer.iv, %no_inner], [%iv.next, %inner.backedge]
1094e787678cSMax Kazantsev  %outer.loop.cond = call i1 @cond()
1095e787678cSMax Kazantsev  br i1 %outer.loop.cond, label %outer, label %exit
1096e787678cSMax Kazantsev
1097e787678cSMax Kazantsevside.exit:
1098e787678cSMax Kazantsev  ret i32 0
1099e787678cSMax Kazantsev
1100e787678cSMax Kazantsevexit:
1101e787678cSMax Kazantsev  ret i32 1
1102e787678cSMax Kazantsev}
1103e787678cSMax Kazantsev
1104e787678cSMax Kazantsev; Same as test_04, but non-negativity of %b is known without context.
1105e787678cSMax Kazantsev; FIXME: We can remove 2nd check in loop.
1106*864bb84aSNikita Popovdefine i32 @test_08(i32 %a, ptr %bp) {
1107e787678cSMax Kazantsev; CHECK-LABEL: @test_08(
1108e787678cSMax Kazantsev; CHECK-NEXT:  entry:
1109*864bb84aSNikita Popov; CHECK-NEXT:    [[B:%.*]] = load i32, ptr [[BP:%.*]], align 4, !range [[RNG0]]
1110e787678cSMax Kazantsev; CHECK-NEXT:    br label [[OUTER:%.*]]
1111e787678cSMax Kazantsev; CHECK:       outer:
1112e787678cSMax Kazantsev; CHECK-NEXT:    [[OUTER_IV:%.*]] = phi i32 [ 0, [[ENTRY:%.*]] ], [ [[OUTER_MERGE:%.*]], [[OUTER_BACKEDGE:%.*]] ]
1113e787678cSMax Kazantsev; CHECK-NEXT:    [[OUTER_COND_1:%.*]] = call i1 @cond()
1114e787678cSMax Kazantsev; CHECK-NEXT:    br i1 [[OUTER_COND_1]], label [[INNER_PREHEADER:%.*]], label [[NO_INNER:%.*]]
1115e787678cSMax Kazantsev; CHECK:       inner.preheader:
1116e787678cSMax Kazantsev; CHECK-NEXT:    br label [[INNER:%.*]]
1117e787678cSMax Kazantsev; CHECK:       no_inner:
1118e787678cSMax Kazantsev; CHECK-NEXT:    [[OUTER_COND_2:%.*]] = call i1 @cond()
1119e787678cSMax Kazantsev; CHECK-NEXT:    br i1 [[OUTER_COND_2]], label [[IF_TRUE:%.*]], label [[IF_FALSE:%.*]]
1120e787678cSMax Kazantsev; CHECK:       if.true:
1121e787678cSMax Kazantsev; CHECK-NEXT:    [[SMAX:%.*]] = call i32 @llvm.smax.i32(i32 [[A:%.*]], i32 [[OUTER_IV]])
1122e787678cSMax Kazantsev; CHECK-NEXT:    br label [[OUTER_BACKEDGE]]
1123e787678cSMax Kazantsev; CHECK:       if.false:
1124e787678cSMax Kazantsev; CHECK-NEXT:    br label [[OUTER_BACKEDGE]]
1125e787678cSMax Kazantsev; CHECK:       inner:
1126e787678cSMax Kazantsev; CHECK-NEXT:    [[IV:%.*]] = phi i32 [ [[IV_NEXT:%.*]], [[INNER_BACKEDGE:%.*]] ], [ [[OUTER_IV]], [[INNER_PREHEADER]] ]
1127e787678cSMax Kazantsev; CHECK-NEXT:    [[SIGNED_COND:%.*]] = icmp slt i32 [[IV]], [[B]]
1128e787678cSMax Kazantsev; CHECK-NEXT:    br i1 [[SIGNED_COND]], label [[INNER_1:%.*]], label [[SIDE_EXIT:%.*]]
1129e787678cSMax Kazantsev; CHECK:       inner.1:
1130e587199aSMax Kazantsev; CHECK-NEXT:    [[UNSIGNED_COND:%.*]] = icmp ult i32 [[OUTER_IV]], [[B]]
1131e787678cSMax Kazantsev; CHECK-NEXT:    br i1 [[UNSIGNED_COND]], label [[INNER_BACKEDGE]], label [[SIDE_EXIT]]
1132e787678cSMax Kazantsev; CHECK:       inner.backedge:
1133e787678cSMax Kazantsev; CHECK-NEXT:    [[IV_NEXT]] = add nuw nsw i32 [[IV]], 1
1134e787678cSMax Kazantsev; CHECK-NEXT:    [[INNER_LOOP_COND:%.*]] = call i1 @cond()
1135e787678cSMax Kazantsev; CHECK-NEXT:    br i1 [[INNER_LOOP_COND]], label [[INNER]], label [[OUTER_BACKEDGE_LOOPEXIT:%.*]]
1136e787678cSMax Kazantsev; CHECK:       outer.backedge.loopexit:
1137e787678cSMax Kazantsev; CHECK-NEXT:    [[IV_NEXT_LCSSA:%.*]] = phi i32 [ [[IV_NEXT]], [[INNER_BACKEDGE]] ]
1138e787678cSMax Kazantsev; CHECK-NEXT:    br label [[OUTER_BACKEDGE]]
1139e787678cSMax Kazantsev; CHECK:       outer.backedge:
1140e787678cSMax Kazantsev; CHECK-NEXT:    [[OUTER_MERGE]] = phi i32 [ [[SMAX]], [[IF_TRUE]] ], [ [[OUTER_IV]], [[IF_FALSE]] ], [ [[IV_NEXT_LCSSA]], [[OUTER_BACKEDGE_LOOPEXIT]] ]
1141e787678cSMax Kazantsev; CHECK-NEXT:    [[OUTER_LOOP_COND:%.*]] = call i1 @cond()
1142e787678cSMax Kazantsev; CHECK-NEXT:    br i1 [[OUTER_LOOP_COND]], label [[OUTER]], label [[EXIT:%.*]]
1143e787678cSMax Kazantsev; CHECK:       side.exit:
1144e787678cSMax Kazantsev; CHECK-NEXT:    ret i32 0
1145e787678cSMax Kazantsev; CHECK:       exit:
1146e787678cSMax Kazantsev; CHECK-NEXT:    ret i32 1
1147e787678cSMax Kazantsev;
1148e787678cSMax Kazantseventry:
1149*864bb84aSNikita Popov  %b = load i32, ptr %bp, !range !0
1150e787678cSMax Kazantsev  br label %outer
1151e787678cSMax Kazantsev
1152e787678cSMax Kazantsevouter:
1153e787678cSMax Kazantsev  %outer.iv = phi i32 [0, %entry], [%outer.merge, %outer.backedge]
1154e787678cSMax Kazantsev  %outer_cond_1 = call i1 @cond()
1155e787678cSMax Kazantsev  br i1 %outer_cond_1, label %inner, label %no_inner
1156e787678cSMax Kazantsev
1157e787678cSMax Kazantsevno_inner:
1158e787678cSMax Kazantsev  %outer_cond_2 = call i1 @cond()
1159e787678cSMax Kazantsev  br i1 %outer_cond_2, label %if.true, label %if.false
1160e787678cSMax Kazantsev
1161e787678cSMax Kazantsevif.true:
1162e787678cSMax Kazantsev  %smax = call i32 @llvm.smax.i32(i32 %a, i32 %outer.iv)
1163e787678cSMax Kazantsev  br label %outer.backedge
1164e787678cSMax Kazantsev
1165e787678cSMax Kazantsevif.false:
1166e787678cSMax Kazantsev  br label %outer.backedge
1167e787678cSMax Kazantsev
1168e787678cSMax Kazantsevinner:
1169e787678cSMax Kazantsev  %iv = phi i32 [%outer.iv, %outer], [%iv.next, %inner.backedge]
1170e787678cSMax Kazantsev  %signed_cond = icmp slt i32 %iv, %b
1171e787678cSMax Kazantsev  br i1 %signed_cond, label %inner.1, label %side.exit
1172e787678cSMax Kazantsev
1173e787678cSMax Kazantsevinner.1:
1174e787678cSMax Kazantsev  %unsigned_cond = icmp ult i32 %iv, %b
1175e787678cSMax Kazantsev  br i1 %unsigned_cond, label %inner.backedge, label %side.exit
1176e787678cSMax Kazantsev
1177e787678cSMax Kazantsevinner.backedge:
1178e787678cSMax Kazantsev  %iv.next = add nuw nsw i32 %iv, 1
1179e787678cSMax Kazantsev  %inner.loop.cond = call i1 @cond()
1180e787678cSMax Kazantsev  br i1 %inner.loop.cond, label %inner, label %outer.backedge
1181e787678cSMax Kazantsev
1182e787678cSMax Kazantsevouter.backedge:
1183e787678cSMax Kazantsev  %outer.merge = phi i32 [%smax, %if.true], [%outer.iv, %if.false], [%iv.next, %inner.backedge]
1184e787678cSMax Kazantsev  %outer.loop.cond = call i1 @cond()
1185e787678cSMax Kazantsev  br i1 %outer.loop.cond, label %outer, label %exit
1186e787678cSMax Kazantsev
1187e787678cSMax Kazantsevside.exit:
1188e787678cSMax Kazantsev  ret i32 0
1189e787678cSMax Kazantsev
1190e787678cSMax Kazantsevexit:
1191e787678cSMax Kazantsev  ret i32 1
1192e787678cSMax Kazantsev}
1193e787678cSMax Kazantsev
1194e787678cSMax Kazantsev!0 = !{i32 0, i32 2147483647}
119578873840SMax Kazantsev!1 = !{i32 -2147483648, i32 0}
1196