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