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