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