1f25b0919SRamkumar Ramachandra; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 2f25b0919SRamkumar Ramachandra; RUN: opt < %s -passes=instcombine -S | FileCheck %s 3f25b0919SRamkumar Ramachandra 4f25b0919SRamkumar Ramachandradefine i64 @test_lshr(i1 %c) { 5f25b0919SRamkumar Ramachandra; CHECK-LABEL: @test_lshr( 6f25b0919SRamkumar Ramachandra; CHECK-NEXT: entry: 7f25b0919SRamkumar Ramachandra; CHECK-NEXT: br label [[LOOP:%.*]] 8f25b0919SRamkumar Ramachandra; CHECK: loop: 9f25b0919SRamkumar Ramachandra; CHECK-NEXT: br i1 [[C:%.*]], label [[EXIT:%.*]], label [[LOOP]] 10f25b0919SRamkumar Ramachandra; CHECK: exit: 11f25b0919SRamkumar Ramachandra; CHECK-NEXT: ret i64 1023 12f25b0919SRamkumar Ramachandra; 13f25b0919SRamkumar Ramachandraentry: 14f25b0919SRamkumar Ramachandra br label %loop 15f25b0919SRamkumar Ramachandraloop: 16f25b0919SRamkumar Ramachandra %iv.lshr = phi i64 [1023, %entry], [%iv.lshr.next, %loop] 17f25b0919SRamkumar Ramachandra %iv.lshr.next = lshr i64 %iv.lshr, 1 18f25b0919SRamkumar Ramachandra br i1 %c, label %exit, label %loop 19f25b0919SRamkumar Ramachandraexit: 20f25b0919SRamkumar Ramachandra %res = or i64 %iv.lshr, 1023 21f25b0919SRamkumar Ramachandra ret i64 %res 22f25b0919SRamkumar Ramachandra} 23f25b0919SRamkumar Ramachandra 24f25b0919SRamkumar Ramachandradefine i64 @test_add(i1 %c) { 25f25b0919SRamkumar Ramachandra; CHECK-LABEL: @test_add( 26f25b0919SRamkumar Ramachandra; CHECK-NEXT: entry: 27f25b0919SRamkumar Ramachandra; CHECK-NEXT: br label [[LOOP:%.*]] 28f25b0919SRamkumar Ramachandra; CHECK: loop: 29f25b0919SRamkumar Ramachandra; CHECK-NEXT: br i1 [[C:%.*]], label [[EXIT:%.*]], label [[LOOP]] 30f25b0919SRamkumar Ramachandra; CHECK: exit: 31f25b0919SRamkumar Ramachandra; CHECK-NEXT: ret i64 0 32f25b0919SRamkumar Ramachandra; 33f25b0919SRamkumar Ramachandraentry: 34f25b0919SRamkumar Ramachandra br label %loop 35f25b0919SRamkumar Ramachandraloop: 36f25b0919SRamkumar Ramachandra %iv = phi i64 [8, %entry], [%iv.next, %loop] 37f25b0919SRamkumar Ramachandra %iv.next = add nuw i64 %iv, 4 38f25b0919SRamkumar Ramachandra br i1 %c, label %exit, label %loop 39f25b0919SRamkumar Ramachandraexit: 40f25b0919SRamkumar Ramachandra %res = and i64 %iv, 1 41f25b0919SRamkumar Ramachandra ret i64 %res 42f25b0919SRamkumar Ramachandra} 43f25b0919SRamkumar Ramachandra 44f25b0919SRamkumar Ramachandradefine i64 @test_sub(i1 %c) { 45f25b0919SRamkumar Ramachandra; CHECK-LABEL: @test_sub( 46f25b0919SRamkumar Ramachandra; CHECK-NEXT: entry: 47f25b0919SRamkumar Ramachandra; CHECK-NEXT: br label [[LOOP:%.*]] 48f25b0919SRamkumar Ramachandra; CHECK: loop: 49f25b0919SRamkumar Ramachandra; CHECK-NEXT: br i1 [[C:%.*]], label [[EXIT:%.*]], label [[LOOP]] 50f25b0919SRamkumar Ramachandra; CHECK: exit: 51f25b0919SRamkumar Ramachandra; CHECK-NEXT: ret i64 0 52f25b0919SRamkumar Ramachandra; 53f25b0919SRamkumar Ramachandraentry: 54f25b0919SRamkumar Ramachandra br label %loop 55f25b0919SRamkumar Ramachandraloop: 56f25b0919SRamkumar Ramachandra %iv = phi i64 [8, %entry], [%iv.next, %loop] 57f25b0919SRamkumar Ramachandra %iv.next = sub nuw i64 %iv, 4 58f25b0919SRamkumar Ramachandra br i1 %c, label %exit, label %loop 59f25b0919SRamkumar Ramachandraexit: 60f25b0919SRamkumar Ramachandra %res = and i64 %iv, 1 61f25b0919SRamkumar Ramachandra ret i64 %res 62f25b0919SRamkumar Ramachandra} 63f25b0919SRamkumar Ramachandra 64f25b0919SRamkumar Ramachandradefine i64 @test_mul(i1 %c) { 65f25b0919SRamkumar Ramachandra; CHECK-LABEL: @test_mul( 66f25b0919SRamkumar Ramachandra; CHECK-NEXT: entry: 67f25b0919SRamkumar Ramachandra; CHECK-NEXT: br label [[LOOP:%.*]] 68f25b0919SRamkumar Ramachandra; CHECK: loop: 69f25b0919SRamkumar Ramachandra; CHECK-NEXT: br i1 [[C:%.*]], label [[EXIT:%.*]], label [[LOOP]] 70f25b0919SRamkumar Ramachandra; CHECK: exit: 71f25b0919SRamkumar Ramachandra; CHECK-NEXT: ret i64 0 72f25b0919SRamkumar Ramachandra; 73f25b0919SRamkumar Ramachandraentry: 74f25b0919SRamkumar Ramachandra br label %loop 75f25b0919SRamkumar Ramachandraloop: 76f25b0919SRamkumar Ramachandra %iv = phi i64 [8, %entry], [%iv.next, %loop] 77f25b0919SRamkumar Ramachandra %iv.next = mul i64 %iv, 2 78f25b0919SRamkumar Ramachandra br i1 %c, label %exit, label %loop 79f25b0919SRamkumar Ramachandraexit: 80f25b0919SRamkumar Ramachandra %res = and i64 %iv, 2 81f25b0919SRamkumar Ramachandra ret i64 %res 82f25b0919SRamkumar Ramachandra} 83f25b0919SRamkumar Ramachandra 84abe0cd46SRamkumar Ramachandradefine i64 @test_udiv(i1 %c) { 85abe0cd46SRamkumar Ramachandra; CHECK-LABEL: @test_udiv( 86abe0cd46SRamkumar Ramachandra; CHECK-NEXT: entry: 87abe0cd46SRamkumar Ramachandra; CHECK-NEXT: br label [[LOOP:%.*]] 88abe0cd46SRamkumar Ramachandra; CHECK: loop: 89abe0cd46SRamkumar Ramachandra; CHECK-NEXT: br i1 [[C:%.*]], label [[EXIT:%.*]], label [[LOOP]] 90abe0cd46SRamkumar Ramachandra; CHECK: exit: 91*fef6613eSRamkumar Ramachandra; CHECK-NEXT: ret i64 0 92abe0cd46SRamkumar Ramachandra; 93abe0cd46SRamkumar Ramachandraentry: 94abe0cd46SRamkumar Ramachandra br label %loop 95abe0cd46SRamkumar Ramachandraloop: 96abe0cd46SRamkumar Ramachandra %iv = phi i64 [9, %entry], [%iv.next, %loop] 97abe0cd46SRamkumar Ramachandra %iv.next = udiv i64 %iv, 3 98abe0cd46SRamkumar Ramachandra br i1 %c, label %exit, label %loop 99abe0cd46SRamkumar Ramachandraexit: 100abe0cd46SRamkumar Ramachandra %res = and i64 %iv, 16 101abe0cd46SRamkumar Ramachandra ret i64 %res 102abe0cd46SRamkumar Ramachandra} 103abe0cd46SRamkumar Ramachandra 104abe0cd46SRamkumar Ramachandradefine i64 @test_udiv_neg(i1 %c) { 105abe0cd46SRamkumar Ramachandra; CHECK-LABEL: @test_udiv_neg( 106abe0cd46SRamkumar Ramachandra; CHECK-NEXT: entry: 107abe0cd46SRamkumar Ramachandra; CHECK-NEXT: br label [[LOOP:%.*]] 108abe0cd46SRamkumar Ramachandra; CHECK: loop: 109abe0cd46SRamkumar Ramachandra; CHECK-NEXT: [[IV:%.*]] = phi i64 [ 2, [[ENTRY:%.*]] ], [ [[IV_NEXT:%.*]], [[LOOP]] ] 110abe0cd46SRamkumar Ramachandra; CHECK-NEXT: [[IV_NEXT]] = udiv i64 9, [[IV]] 111abe0cd46SRamkumar Ramachandra; CHECK-NEXT: br i1 [[C:%.*]], label [[EXIT:%.*]], label [[LOOP]] 112abe0cd46SRamkumar Ramachandra; CHECK: exit: 113abe0cd46SRamkumar Ramachandra; CHECK-NEXT: [[RES:%.*]] = and i64 [[IV]], 4 114abe0cd46SRamkumar Ramachandra; CHECK-NEXT: ret i64 [[RES]] 115abe0cd46SRamkumar Ramachandra; 116abe0cd46SRamkumar Ramachandraentry: 117abe0cd46SRamkumar Ramachandra br label %loop 118abe0cd46SRamkumar Ramachandraloop: 119abe0cd46SRamkumar Ramachandra %iv = phi i64 [2, %entry], [%iv.next, %loop] 120abe0cd46SRamkumar Ramachandra %iv.next = udiv i64 9, %iv 121abe0cd46SRamkumar Ramachandra br i1 %c, label %exit, label %loop 122abe0cd46SRamkumar Ramachandraexit: 123abe0cd46SRamkumar Ramachandra %res = and i64 %iv, 4 124abe0cd46SRamkumar Ramachandra ret i64 %res 125abe0cd46SRamkumar Ramachandra} 126abe0cd46SRamkumar Ramachandra 127abe0cd46SRamkumar Ramachandradefine i64 @test_urem(i1 %c) { 128abe0cd46SRamkumar Ramachandra; CHECK-LABEL: @test_urem( 129abe0cd46SRamkumar Ramachandra; CHECK-NEXT: entry: 130abe0cd46SRamkumar Ramachandra; CHECK-NEXT: br label [[LOOP:%.*]] 131abe0cd46SRamkumar Ramachandra; CHECK: loop: 132abe0cd46SRamkumar Ramachandra; CHECK-NEXT: br i1 [[C:%.*]], label [[EXIT:%.*]], label [[LOOP]] 133abe0cd46SRamkumar Ramachandra; CHECK: exit: 134*fef6613eSRamkumar Ramachandra; CHECK-NEXT: ret i64 0 135abe0cd46SRamkumar Ramachandra; 136abe0cd46SRamkumar Ramachandraentry: 137abe0cd46SRamkumar Ramachandra br label %loop 138abe0cd46SRamkumar Ramachandraloop: 139abe0cd46SRamkumar Ramachandra %iv = phi i64 [3, %entry], [%iv.next, %loop] 140abe0cd46SRamkumar Ramachandra %iv.next = urem i64 9, %iv 141abe0cd46SRamkumar Ramachandra br i1 %c, label %exit, label %loop 142abe0cd46SRamkumar Ramachandraexit: 143abe0cd46SRamkumar Ramachandra %res = and i64 %iv, 4 144abe0cd46SRamkumar Ramachandra ret i64 %res 145abe0cd46SRamkumar Ramachandra} 146abe0cd46SRamkumar Ramachandra 147f25b0919SRamkumar Ramachandradefine i64 @test_and(i1 %c) { 148f25b0919SRamkumar Ramachandra; CHECK-LABEL: @test_and( 149f25b0919SRamkumar Ramachandra; CHECK-NEXT: entry: 150f25b0919SRamkumar Ramachandra; CHECK-NEXT: br label [[LOOP:%.*]] 151f25b0919SRamkumar Ramachandra; CHECK: loop: 152f25b0919SRamkumar Ramachandra; CHECK-NEXT: br i1 [[C:%.*]], label [[EXIT:%.*]], label [[LOOP]] 153f25b0919SRamkumar Ramachandra; CHECK: exit: 154f25b0919SRamkumar Ramachandra; CHECK-NEXT: ret i64 2047 155f25b0919SRamkumar Ramachandra; 156f25b0919SRamkumar Ramachandraentry: 157f25b0919SRamkumar Ramachandra br label %loop 158f25b0919SRamkumar Ramachandraloop: 159f25b0919SRamkumar Ramachandra %iv = phi i64 [1025, %entry], [%iv.next, %loop] 160f25b0919SRamkumar Ramachandra %iv.next = and i64 %iv, 1024 161f25b0919SRamkumar Ramachandra br i1 %c, label %exit, label %loop 162f25b0919SRamkumar Ramachandraexit: 163f25b0919SRamkumar Ramachandra %res = or i64 %iv, 1023 164f25b0919SRamkumar Ramachandra ret i64 %res 165f25b0919SRamkumar Ramachandra} 166f25b0919SRamkumar Ramachandra 167f25b0919SRamkumar Ramachandradefine i64 @test_or(i1 %c) { 168f25b0919SRamkumar Ramachandra; CHECK-LABEL: @test_or( 169f25b0919SRamkumar Ramachandra; CHECK-NEXT: entry: 170f25b0919SRamkumar Ramachandra; CHECK-NEXT: br label [[LOOP:%.*]] 171f25b0919SRamkumar Ramachandra; CHECK: loop: 172f25b0919SRamkumar Ramachandra; CHECK-NEXT: br i1 [[C:%.*]], label [[EXIT:%.*]], label [[LOOP]] 173f25b0919SRamkumar Ramachandra; CHECK: exit: 174f25b0919SRamkumar Ramachandra; CHECK-NEXT: ret i64 2047 175f25b0919SRamkumar Ramachandra; 176f25b0919SRamkumar Ramachandraentry: 177f25b0919SRamkumar Ramachandra br label %loop 178f25b0919SRamkumar Ramachandraloop: 179f25b0919SRamkumar Ramachandra %iv = phi i64 [1025, %entry], [%iv.next, %loop] 180f25b0919SRamkumar Ramachandra %iv.next = or i64 %iv, 1024 181f25b0919SRamkumar Ramachandra br i1 %c, label %exit, label %loop 182f25b0919SRamkumar Ramachandraexit: 183f25b0919SRamkumar Ramachandra %res = or i64 %iv, 1023 184f25b0919SRamkumar Ramachandra ret i64 %res 185f25b0919SRamkumar Ramachandra} 186f25b0919SRamkumar Ramachandra 187f25b0919SRamkumar Ramachandradefine i64 @test_ashr_zeros(i1 %c) { 188f25b0919SRamkumar Ramachandra; CHECK-LABEL: @test_ashr_zeros( 189f25b0919SRamkumar Ramachandra; CHECK-NEXT: entry: 190f25b0919SRamkumar Ramachandra; CHECK-NEXT: br label [[LOOP:%.*]] 191f25b0919SRamkumar Ramachandra; CHECK: loop: 192f25b0919SRamkumar Ramachandra; CHECK-NEXT: br i1 [[C:%.*]], label [[EXIT:%.*]], label [[LOOP]] 193f25b0919SRamkumar Ramachandra; CHECK: exit: 194f25b0919SRamkumar Ramachandra; CHECK-NEXT: ret i64 1023 195f25b0919SRamkumar Ramachandra; 196f25b0919SRamkumar Ramachandraentry: 197f25b0919SRamkumar Ramachandra br label %loop 198f25b0919SRamkumar Ramachandraloop: 199f25b0919SRamkumar Ramachandra %iv.ashr = phi i64 [1023, %entry], [%iv.ashr.next, %loop] 200f25b0919SRamkumar Ramachandra %iv.ashr.next = ashr i64 %iv.ashr, 1 201f25b0919SRamkumar Ramachandra br i1 %c, label %exit, label %loop 202f25b0919SRamkumar Ramachandraexit: 203f25b0919SRamkumar Ramachandra %res = or i64 %iv.ashr, 1023 204f25b0919SRamkumar Ramachandra ret i64 %res 205f25b0919SRamkumar Ramachandra} 206f25b0919SRamkumar Ramachandra 207f25b0919SRamkumar Ramachandradefine i64 @test_ashr_ones(i1 %c) { 208f25b0919SRamkumar Ramachandra; CHECK-LABEL: @test_ashr_ones( 209f25b0919SRamkumar Ramachandra; CHECK-NEXT: entry: 210f25b0919SRamkumar Ramachandra; CHECK-NEXT: br label [[LOOP:%.*]] 211f25b0919SRamkumar Ramachandra; CHECK: loop: 212f25b0919SRamkumar Ramachandra; CHECK-NEXT: br i1 [[C:%.*]], label [[EXIT:%.*]], label [[LOOP]] 213f25b0919SRamkumar Ramachandra; CHECK: exit: 214f25b0919SRamkumar Ramachandra; CHECK-NEXT: ret i64 -1 215f25b0919SRamkumar Ramachandra; 216f25b0919SRamkumar Ramachandraentry: 217f25b0919SRamkumar Ramachandra br label %loop 218f25b0919SRamkumar Ramachandraloop: 219f25b0919SRamkumar Ramachandra %iv.ashr = phi i64 [-1023, %entry], [%iv.ashr.next, %loop] 220f25b0919SRamkumar Ramachandra %iv.ashr.next = ashr i64 %iv.ashr, 1 221f25b0919SRamkumar Ramachandra br i1 %c, label %exit, label %loop 222f25b0919SRamkumar Ramachandraexit: 223f25b0919SRamkumar Ramachandra %res = or i64 %iv.ashr, 1023 224f25b0919SRamkumar Ramachandra ret i64 %res 225f25b0919SRamkumar Ramachandra} 226f25b0919SRamkumar Ramachandra 227f25b0919SRamkumar Ramachandra; Same as previous, but swapped operands to phi 228f25b0919SRamkumar Ramachandradefine i64 @test_ashr_ones2(i1 %c) { 229f25b0919SRamkumar Ramachandra; CHECK-LABEL: @test_ashr_ones2( 230f25b0919SRamkumar Ramachandra; CHECK-NEXT: entry: 231f25b0919SRamkumar Ramachandra; CHECK-NEXT: br label [[LOOP:%.*]] 232f25b0919SRamkumar Ramachandra; CHECK: loop: 233f25b0919SRamkumar Ramachandra; CHECK-NEXT: br i1 [[C:%.*]], label [[EXIT:%.*]], label [[LOOP]] 234f25b0919SRamkumar Ramachandra; CHECK: exit: 235f25b0919SRamkumar Ramachandra; CHECK-NEXT: ret i64 -1 236f25b0919SRamkumar Ramachandra; 237f25b0919SRamkumar Ramachandraentry: 238f25b0919SRamkumar Ramachandra br label %loop 239f25b0919SRamkumar Ramachandraloop: 240f25b0919SRamkumar Ramachandra %iv.ashr = phi i64 [%iv.ashr.next, %loop], [-1023, %entry] 241f25b0919SRamkumar Ramachandra %iv.ashr.next = ashr i64 %iv.ashr, 1 242f25b0919SRamkumar Ramachandra br i1 %c, label %exit, label %loop 243f25b0919SRamkumar Ramachandraexit: 244f25b0919SRamkumar Ramachandra %res = or i64 %iv.ashr, 1023 245f25b0919SRamkumar Ramachandra ret i64 %res 246f25b0919SRamkumar Ramachandra} 247f25b0919SRamkumar Ramachandra 248f25b0919SRamkumar Ramachandra 249f25b0919SRamkumar Ramachandra; negative case for when start is unknown 250f25b0919SRamkumar Ramachandradefine i64 @test_ashr_unknown(i1 %c, i64 %start) { 251f25b0919SRamkumar Ramachandra; CHECK-LABEL: @test_ashr_unknown( 252f25b0919SRamkumar Ramachandra; CHECK-NEXT: entry: 253f25b0919SRamkumar Ramachandra; CHECK-NEXT: br label [[LOOP:%.*]] 254f25b0919SRamkumar Ramachandra; CHECK: loop: 255f25b0919SRamkumar Ramachandra; CHECK-NEXT: [[IV_ASHR:%.*]] = phi i64 [ [[START:%.*]], [[ENTRY:%.*]] ], [ [[IV_ASHR_NEXT:%.*]], [[LOOP]] ] 256f25b0919SRamkumar Ramachandra; CHECK-NEXT: [[IV_ASHR_NEXT]] = ashr i64 [[IV_ASHR]], 1 257f25b0919SRamkumar Ramachandra; CHECK-NEXT: br i1 [[C:%.*]], label [[EXIT:%.*]], label [[LOOP]] 258f25b0919SRamkumar Ramachandra; CHECK: exit: 259f25b0919SRamkumar Ramachandra; CHECK-NEXT: [[RES:%.*]] = or i64 [[IV_ASHR]], 1023 260f25b0919SRamkumar Ramachandra; CHECK-NEXT: ret i64 [[RES]] 261f25b0919SRamkumar Ramachandra; 262f25b0919SRamkumar Ramachandraentry: 263f25b0919SRamkumar Ramachandra br label %loop 264f25b0919SRamkumar Ramachandraloop: 265f25b0919SRamkumar Ramachandra %iv.ashr = phi i64 [%start, %entry], [%iv.ashr.next, %loop] 266f25b0919SRamkumar Ramachandra %iv.ashr.next = ashr i64 %iv.ashr, 1 267f25b0919SRamkumar Ramachandra br i1 %c, label %exit, label %loop 268f25b0919SRamkumar Ramachandraexit: 269f25b0919SRamkumar Ramachandra %res = or i64 %iv.ashr, 1023 270f25b0919SRamkumar Ramachandra ret i64 %res 271f25b0919SRamkumar Ramachandra} 272f25b0919SRamkumar Ramachandra 273f25b0919SRamkumar Ramachandra; Negative case where we don't have a (shift) recurrence because the operands 274f25b0919SRamkumar Ramachandra; of the ashr are swapped. (This does end up being a divide recurrence.) 275f25b0919SRamkumar Ramachandradefine i64 @test_ashr_wrong_op(i1 %c, i64 %start) { 276f25b0919SRamkumar Ramachandra; CHECK-LABEL: @test_ashr_wrong_op( 277f25b0919SRamkumar Ramachandra; CHECK-NEXT: entry: 278f25b0919SRamkumar Ramachandra; CHECK-NEXT: br label [[LOOP:%.*]] 279f25b0919SRamkumar Ramachandra; CHECK: loop: 280f25b0919SRamkumar Ramachandra; CHECK-NEXT: [[IV_ASHR:%.*]] = phi i64 [ [[START:%.*]], [[ENTRY:%.*]] ], [ [[IV_ASHR_NEXT:%.*]], [[LOOP]] ] 281f25b0919SRamkumar Ramachandra; CHECK-NEXT: [[IV_ASHR_NEXT]] = lshr i64 1, [[IV_ASHR]] 282f25b0919SRamkumar Ramachandra; CHECK-NEXT: br i1 [[C:%.*]], label [[EXIT:%.*]], label [[LOOP]] 283f25b0919SRamkumar Ramachandra; CHECK: exit: 284f25b0919SRamkumar Ramachandra; CHECK-NEXT: [[RES:%.*]] = or i64 [[IV_ASHR]], 1023 285f25b0919SRamkumar Ramachandra; CHECK-NEXT: ret i64 [[RES]] 286f25b0919SRamkumar Ramachandra; 287f25b0919SRamkumar Ramachandraentry: 288f25b0919SRamkumar Ramachandra br label %loop 289f25b0919SRamkumar Ramachandraloop: 290f25b0919SRamkumar Ramachandra %iv.ashr = phi i64 [%start, %entry], [%iv.ashr.next, %loop] 291f25b0919SRamkumar Ramachandra %iv.ashr.next = ashr i64 1, %iv.ashr 292f25b0919SRamkumar Ramachandra br i1 %c, label %exit, label %loop 293f25b0919SRamkumar Ramachandraexit: 294f25b0919SRamkumar Ramachandra %res = or i64 %iv.ashr, 1023 295f25b0919SRamkumar Ramachandra ret i64 %res 296f25b0919SRamkumar Ramachandra} 297f25b0919SRamkumar Ramachandra 298f25b0919SRamkumar Ramachandra 299f25b0919SRamkumar Ramachandradefine i64 @test_shl(i1 %c) { 300f25b0919SRamkumar Ramachandra; CHECK-LABEL: @test_shl( 301f25b0919SRamkumar Ramachandra; CHECK-NEXT: entry: 302f25b0919SRamkumar Ramachandra; CHECK-NEXT: br label [[LOOP:%.*]] 303f25b0919SRamkumar Ramachandra; CHECK: loop: 304f25b0919SRamkumar Ramachandra; CHECK-NEXT: br i1 [[C:%.*]], label [[EXIT:%.*]], label [[LOOP]] 305f25b0919SRamkumar Ramachandra; CHECK: exit: 306f25b0919SRamkumar Ramachandra; CHECK-NEXT: ret i64 0 307f25b0919SRamkumar Ramachandra; 308f25b0919SRamkumar Ramachandraentry: 309f25b0919SRamkumar Ramachandra br label %loop 310f25b0919SRamkumar Ramachandraloop: 311f25b0919SRamkumar Ramachandra %iv.shl = phi i64 [8, %entry], [%iv.shl.next, %loop] 312f25b0919SRamkumar Ramachandra %iv.shl.next = shl i64 %iv.shl, 1 313f25b0919SRamkumar Ramachandra br i1 %c, label %exit, label %loop 314f25b0919SRamkumar Ramachandraexit: 315f25b0919SRamkumar Ramachandra %res = and i64 %iv.shl, 7 316f25b0919SRamkumar Ramachandra ret i64 %res 317f25b0919SRamkumar Ramachandra} 318