1dc5da485SNikita Popov; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 4 2dc5da485SNikita Popov; RUN: opt -S -passes=instcombine < %s | FileCheck %s 3dc5da485SNikita Popov 4dc5da485SNikita Popovdefine void @int_iv_nuw(i64 %base, i64 %end) { 5dc5da485SNikita Popov; CHECK-LABEL: define void @int_iv_nuw( 6dc5da485SNikita Popov; CHECK-SAME: i64 [[BASE:%.*]], i64 [[END:%.*]]) { 7dc5da485SNikita Popov; CHECK-NEXT: entry: 8dc5da485SNikita Popov; CHECK-NEXT: br label [[LOOP:%.*]] 9dc5da485SNikita Popov; CHECK: loop: 107ce1a11fSNikita Popov; CHECK-NEXT: [[IV:%.*]] = phi i64 [ [[IV_NEXT:%.*]], [[LOOP]] ], [ 0, [[ENTRY:%.*]] ] 117ce1a11fSNikita Popov; CHECK-NEXT: [[IV2:%.*]] = add nuw i64 [[IV]], [[BASE]] 12dc5da485SNikita Popov; CHECK-NEXT: call void @use.i64(i64 [[IV2]]) 13dc5da485SNikita Popov; CHECK-NEXT: [[IV_NEXT]] = add nuw nsw i64 [[IV]], 4 14dc5da485SNikita Popov; CHECK-NEXT: [[CMP:%.*]] = icmp eq i64 [[IV_NEXT]], [[END]] 15dc5da485SNikita Popov; CHECK-NEXT: br i1 [[CMP]], label [[EXIT:%.*]], label [[LOOP]] 16dc5da485SNikita Popov; CHECK: exit: 17dc5da485SNikita Popov; CHECK-NEXT: ret void 18dc5da485SNikita Popov; 19dc5da485SNikita Popoventry: 20dc5da485SNikita Popov br label %loop 21dc5da485SNikita Popov 22dc5da485SNikita Popovloop: 23dc5da485SNikita Popov %iv2 = phi i64 [ %iv2.next, %loop ], [ %base, %entry ] 24dc5da485SNikita Popov %iv = phi i64 [ %iv.next, %loop ], [ 0, %entry ] 25dc5da485SNikita Popov call void @use.i64(i64 %iv2) 26dc5da485SNikita Popov %iv.next = add nuw nsw i64 %iv, 4 27dc5da485SNikita Popov %iv2.next = add nuw i64 %iv.next, %base 28dc5da485SNikita Popov %cmp = icmp eq i64 %iv.next, %end 29dc5da485SNikita Popov br i1 %cmp, label %exit, label %loop 30dc5da485SNikita Popov 31dc5da485SNikita Popovexit: 32dc5da485SNikita Popov ret void 33dc5da485SNikita Popov} 34dc5da485SNikita Popov 35dc5da485SNikita Popovdefine void @int_iv_nsw(i64 %base, i64 %end) { 36dc5da485SNikita Popov; CHECK-LABEL: define void @int_iv_nsw( 37dc5da485SNikita Popov; CHECK-SAME: i64 [[BASE:%.*]], i64 [[END:%.*]]) { 38dc5da485SNikita Popov; CHECK-NEXT: entry: 39dc5da485SNikita Popov; CHECK-NEXT: br label [[LOOP:%.*]] 40dc5da485SNikita Popov; CHECK: loop: 417ce1a11fSNikita Popov; CHECK-NEXT: [[IV:%.*]] = phi i64 [ [[IV_NEXT:%.*]], [[LOOP]] ], [ 0, [[ENTRY:%.*]] ] 427ce1a11fSNikita Popov; CHECK-NEXT: [[IV2:%.*]] = add nsw i64 [[IV]], [[BASE]] 43dc5da485SNikita Popov; CHECK-NEXT: call void @use.i64(i64 [[IV2]]) 44dc5da485SNikita Popov; CHECK-NEXT: [[IV_NEXT]] = add nuw nsw i64 [[IV]], 4 45dc5da485SNikita Popov; CHECK-NEXT: [[CMP:%.*]] = icmp eq i64 [[IV_NEXT]], [[END]] 46dc5da485SNikita Popov; CHECK-NEXT: br i1 [[CMP]], label [[EXIT:%.*]], label [[LOOP]] 47dc5da485SNikita Popov; CHECK: exit: 48dc5da485SNikita Popov; CHECK-NEXT: ret void 49dc5da485SNikita Popov; 50dc5da485SNikita Popoventry: 51dc5da485SNikita Popov br label %loop 52dc5da485SNikita Popov 53dc5da485SNikita Popovloop: 54dc5da485SNikita Popov %iv2 = phi i64 [ %iv2.next, %loop ], [ %base, %entry ] 55dc5da485SNikita Popov %iv = phi i64 [ %iv.next, %loop ], [ 0, %entry ] 56dc5da485SNikita Popov call void @use.i64(i64 %iv2) 57dc5da485SNikita Popov %iv.next = add nuw nsw i64 %iv, 4 58dc5da485SNikita Popov %iv2.next = add nsw i64 %iv.next, %base 59dc5da485SNikita Popov %cmp = icmp eq i64 %iv.next, %end 60dc5da485SNikita Popov br i1 %cmp, label %exit, label %loop 61dc5da485SNikita Popov 62dc5da485SNikita Popovexit: 63dc5da485SNikita Popov ret void 64dc5da485SNikita Popov} 65dc5da485SNikita Popov 661789dc2fSNikita Popovdefine void @int_iv_commuted_add(i64 %base, i64 %end) { 671789dc2fSNikita Popov; CHECK-LABEL: define void @int_iv_commuted_add( 68dc5da485SNikita Popov; CHECK-SAME: i64 [[BASE:%.*]], i64 [[END:%.*]]) { 69dc5da485SNikita Popov; CHECK-NEXT: entry: 70dc5da485SNikita Popov; CHECK-NEXT: [[BASE2:%.*]] = mul i64 [[BASE]], 42 71dc5da485SNikita Popov; CHECK-NEXT: br label [[LOOP:%.*]] 72dc5da485SNikita Popov; CHECK: loop: 737ce1a11fSNikita Popov; CHECK-NEXT: [[IV:%.*]] = phi i64 [ [[IV_NEXT:%.*]], [[LOOP]] ], [ 0, [[ENTRY:%.*]] ] 747ce1a11fSNikita Popov; CHECK-NEXT: [[IV2:%.*]] = add i64 [[IV]], [[BASE2]] 75dc5da485SNikita Popov; CHECK-NEXT: call void @use.i64(i64 [[IV2]]) 76dc5da485SNikita Popov; CHECK-NEXT: [[IV_NEXT]] = add nuw nsw i64 [[IV]], 4 77dc5da485SNikita Popov; CHECK-NEXT: [[CMP:%.*]] = icmp eq i64 [[IV_NEXT]], [[END]] 78dc5da485SNikita Popov; CHECK-NEXT: br i1 [[CMP]], label [[EXIT:%.*]], label [[LOOP]] 79dc5da485SNikita Popov; CHECK: exit: 80dc5da485SNikita Popov; CHECK-NEXT: ret void 81dc5da485SNikita Popov; 82dc5da485SNikita Popoventry: 83dc5da485SNikita Popov %base2 = mul i64 %base, 42 ; thwart complexity-based canonicalization 84dc5da485SNikita Popov br label %loop 85dc5da485SNikita Popov 86dc5da485SNikita Popovloop: 87dc5da485SNikita Popov %iv2 = phi i64 [ %iv2.next, %loop ], [ %base2, %entry ] 88dc5da485SNikita Popov %iv = phi i64 [ %iv.next, %loop ], [ 0, %entry ] 89dc5da485SNikita Popov call void @use.i64(i64 %iv2) 90dc5da485SNikita Popov %iv.next = add nuw nsw i64 %iv, 4 91dc5da485SNikita Popov %iv2.next = add i64 %base2, %iv.next 92dc5da485SNikita Popov %cmp = icmp eq i64 %iv.next, %end 93dc5da485SNikita Popov br i1 %cmp, label %exit, label %loop 94dc5da485SNikita Popov 95dc5da485SNikita Popovexit: 96dc5da485SNikita Popov ret void 97dc5da485SNikita Popov} 98dc5da485SNikita Popov 991789dc2fSNikita Popovdefine void @int_iv_commuted_phi1(i64 %base, i64 %end) { 1001789dc2fSNikita Popov; CHECK-LABEL: define void @int_iv_commuted_phi1( 1011789dc2fSNikita Popov; CHECK-SAME: i64 [[BASE:%.*]], i64 [[END:%.*]]) { 1021789dc2fSNikita Popov; CHECK-NEXT: entry: 1031789dc2fSNikita Popov; CHECK-NEXT: br label [[LOOP:%.*]] 1041789dc2fSNikita Popov; CHECK: loop: 1057ce1a11fSNikita Popov; CHECK-NEXT: [[IV:%.*]] = phi i64 [ 0, [[ENTRY:%.*]] ], [ [[IV_NEXT:%.*]], [[LOOP]] ] 1067ce1a11fSNikita Popov; CHECK-NEXT: [[IV2:%.*]] = add i64 [[IV]], [[BASE]] 1071789dc2fSNikita Popov; CHECK-NEXT: call void @use.i64(i64 [[IV2]]) 1081789dc2fSNikita Popov; CHECK-NEXT: [[IV_NEXT]] = add nuw nsw i64 [[IV]], 4 1091789dc2fSNikita Popov; CHECK-NEXT: [[CMP:%.*]] = icmp eq i64 [[IV_NEXT]], [[END]] 1101789dc2fSNikita Popov; CHECK-NEXT: br i1 [[CMP]], label [[EXIT:%.*]], label [[LOOP]] 1111789dc2fSNikita Popov; CHECK: exit: 1121789dc2fSNikita Popov; CHECK-NEXT: ret void 1131789dc2fSNikita Popov; 1141789dc2fSNikita Popoventry: 1151789dc2fSNikita Popov br label %loop 1161789dc2fSNikita Popov 1171789dc2fSNikita Popovloop: 1181789dc2fSNikita Popov %iv2 = phi i64 [ %base, %entry ], [ %iv2.next, %loop ] 1191789dc2fSNikita Popov %iv = phi i64 [ %iv.next, %loop ], [ 0, %entry ] 1201789dc2fSNikita Popov call void @use.i64(i64 %iv2) 1211789dc2fSNikita Popov %iv.next = add nuw nsw i64 %iv, 4 1221789dc2fSNikita Popov %iv2.next = add i64 %iv.next, %base 1231789dc2fSNikita Popov %cmp = icmp eq i64 %iv.next, %end 1241789dc2fSNikita Popov br i1 %cmp, label %exit, label %loop 1251789dc2fSNikita Popov 1261789dc2fSNikita Popovexit: 1271789dc2fSNikita Popov ret void 1281789dc2fSNikita Popov} 1291789dc2fSNikita Popov 1301789dc2fSNikita Popovdefine void @int_iv_commuted_phi2(i64 %base, i64 %end) { 1311789dc2fSNikita Popov; CHECK-LABEL: define void @int_iv_commuted_phi2( 1321789dc2fSNikita Popov; CHECK-SAME: i64 [[BASE:%.*]], i64 [[END:%.*]]) { 1331789dc2fSNikita Popov; CHECK-NEXT: entry: 1341789dc2fSNikita Popov; CHECK-NEXT: br label [[LOOP:%.*]] 1351789dc2fSNikita Popov; CHECK: loop: 1367ce1a11fSNikita Popov; CHECK-NEXT: [[IV:%.*]] = phi i64 [ [[IV_NEXT:%.*]], [[LOOP]] ], [ 0, [[ENTRY:%.*]] ] 1377ce1a11fSNikita Popov; CHECK-NEXT: [[IV2:%.*]] = add i64 [[IV]], [[BASE]] 1381789dc2fSNikita Popov; CHECK-NEXT: call void @use.i64(i64 [[IV2]]) 1391789dc2fSNikita Popov; CHECK-NEXT: [[IV_NEXT]] = add nuw nsw i64 [[IV]], 4 1401789dc2fSNikita Popov; CHECK-NEXT: [[CMP:%.*]] = icmp eq i64 [[IV_NEXT]], [[END]] 1411789dc2fSNikita Popov; CHECK-NEXT: br i1 [[CMP]], label [[EXIT:%.*]], label [[LOOP]] 1421789dc2fSNikita Popov; CHECK: exit: 1431789dc2fSNikita Popov; CHECK-NEXT: ret void 1441789dc2fSNikita Popov; 1451789dc2fSNikita Popoventry: 1461789dc2fSNikita Popov br label %loop 1471789dc2fSNikita Popov 1481789dc2fSNikita Popovloop: 1491789dc2fSNikita Popov %iv2 = phi i64 [ %iv2.next, %loop ], [ %base, %entry ] 1501789dc2fSNikita Popov %iv = phi i64 [ 0, %entry ], [ %iv.next, %loop ] 1511789dc2fSNikita Popov call void @use.i64(i64 %iv2) 1521789dc2fSNikita Popov %iv.next = add nuw nsw i64 %iv, 4 1531789dc2fSNikita Popov %iv2.next = add i64 %iv.next, %base 1541789dc2fSNikita Popov %cmp = icmp eq i64 %iv.next, %end 1551789dc2fSNikita Popov br i1 %cmp, label %exit, label %loop 1561789dc2fSNikita Popov 1571789dc2fSNikita Popovexit: 1581789dc2fSNikita Popov ret void 1591789dc2fSNikita Popov} 1601789dc2fSNikita Popov 161dc5da485SNikita Popovdefine void @int_iv_vector(<2 x i64> %base) { 162dc5da485SNikita Popov; CHECK-LABEL: define void @int_iv_vector( 163dc5da485SNikita Popov; CHECK-SAME: <2 x i64> [[BASE:%.*]]) { 164dc5da485SNikita Popov; CHECK-NEXT: entry: 165dc5da485SNikita Popov; CHECK-NEXT: br label [[LOOP:%.*]] 166dc5da485SNikita Popov; CHECK: loop: 1677ce1a11fSNikita Popov; CHECK-NEXT: [[IV:%.*]] = phi <2 x i64> [ [[IV_NEXT:%.*]], [[LOOP]] ], [ zeroinitializer, [[ENTRY:%.*]] ] 1687ce1a11fSNikita Popov; CHECK-NEXT: [[IV2:%.*]] = add <2 x i64> [[IV]], [[BASE]] 169dc5da485SNikita Popov; CHECK-NEXT: call void @use.v2i64(<2 x i64> [[IV2]]) 17038fffa63SPaul Walker; CHECK-NEXT: [[IV_NEXT]] = add nuw nsw <2 x i64> [[IV]], splat (i64 4) 171dc5da485SNikita Popov; CHECK-NEXT: [[CMP:%.*]] = call i1 @get.i1() 172dc5da485SNikita Popov; CHECK-NEXT: br i1 [[CMP]], label [[EXIT:%.*]], label [[LOOP]] 173dc5da485SNikita Popov; CHECK: exit: 174dc5da485SNikita Popov; CHECK-NEXT: ret void 175dc5da485SNikita Popov; 176dc5da485SNikita Popoventry: 177dc5da485SNikita Popov br label %loop 178dc5da485SNikita Popov 179dc5da485SNikita Popovloop: 180dc5da485SNikita Popov %iv2 = phi <2 x i64> [ %iv2.next, %loop ], [ %base, %entry ] 181dc5da485SNikita Popov %iv = phi <2 x i64> [ %iv.next, %loop ], [ zeroinitializer, %entry ] 182dc5da485SNikita Popov call void @use.v2i64(<2 x i64> %iv2) 183dc5da485SNikita Popov %iv.next = add nuw nsw <2 x i64> %iv, <i64 4, i64 4> 184dc5da485SNikita Popov %iv2.next = add <2 x i64> %iv.next, %base 185dc5da485SNikita Popov %cmp = call i1 @get.i1() 186dc5da485SNikita Popov br i1 %cmp, label %exit, label %loop 187dc5da485SNikita Popov 188dc5da485SNikita Popovexit: 189dc5da485SNikita Popov ret void 190dc5da485SNikita Popov} 191dc5da485SNikita Popov 192c7799fadSNikita Popovdefine void @int_iv_vector_poison_invalid(<2 x i64> %base) { 193c7799fadSNikita Popov; CHECK-LABEL: define void @int_iv_vector_poison_invalid( 194c7799fadSNikita Popov; CHECK-SAME: <2 x i64> [[BASE:%.*]]) { 195c7799fadSNikita Popov; CHECK-NEXT: entry: 196c7799fadSNikita Popov; CHECK-NEXT: br label [[LOOP:%.*]] 197c7799fadSNikita Popov; CHECK: loop: 198c7799fadSNikita Popov; CHECK-NEXT: [[IV2:%.*]] = phi <2 x i64> [ [[IV2_NEXT:%.*]], [[LOOP]] ], [ [[BASE]], [[ENTRY:%.*]] ] 199c7799fadSNikita Popov; CHECK-NEXT: [[IV:%.*]] = phi <2 x i64> [ [[IV_NEXT:%.*]], [[LOOP]] ], [ <i64 0, i64 poison>, [[ENTRY]] ] 200c7799fadSNikita Popov; CHECK-NEXT: call void @use.v2i64(<2 x i64> [[IV2]]) 20138fffa63SPaul Walker; CHECK-NEXT: [[IV_NEXT]] = add nuw nsw <2 x i64> [[IV]], splat (i64 4) 202c7799fadSNikita Popov; CHECK-NEXT: [[IV2_NEXT]] = add <2 x i64> [[IV_NEXT]], [[BASE]] 203c7799fadSNikita Popov; CHECK-NEXT: [[CMP:%.*]] = call i1 @get.i1() 204c7799fadSNikita Popov; CHECK-NEXT: br i1 [[CMP]], label [[EXIT:%.*]], label [[LOOP]] 205c7799fadSNikita Popov; CHECK: exit: 206c7799fadSNikita Popov; CHECK-NEXT: ret void 207c7799fadSNikita Popov; 208c7799fadSNikita Popoventry: 209c7799fadSNikita Popov br label %loop 210c7799fadSNikita Popov 211c7799fadSNikita Popovloop: 212c7799fadSNikita Popov %iv2 = phi <2 x i64> [ %iv2.next, %loop ], [ %base, %entry ] 213c7799fadSNikita Popov %iv = phi <2 x i64> [ %iv.next, %loop ], [ <i64 0, i64 poison>, %entry ] 214c7799fadSNikita Popov call void @use.v2i64(<2 x i64> %iv2) 215c7799fadSNikita Popov %iv.next = add nuw nsw <2 x i64> %iv, <i64 4, i64 4> 216c7799fadSNikita Popov %iv2.next = add <2 x i64> %iv.next, %base 217c7799fadSNikita Popov %cmp = call i1 @get.i1() 218c7799fadSNikita Popov br i1 %cmp, label %exit, label %loop 219c7799fadSNikita Popov 220c7799fadSNikita Popovexit: 221c7799fadSNikita Popov ret void 222c7799fadSNikita Popov} 223c7799fadSNikita Popov 224dc5da485SNikita Popovdefine void @int_iv_loop_variant_step(i64 %base, i64 %end) { 225dc5da485SNikita Popov; CHECK-LABEL: define void @int_iv_loop_variant_step( 226dc5da485SNikita Popov; CHECK-SAME: i64 [[BASE:%.*]], i64 [[END:%.*]]) { 227dc5da485SNikita Popov; CHECK-NEXT: entry: 228dc5da485SNikita Popov; CHECK-NEXT: br label [[LOOP:%.*]] 229dc5da485SNikita Popov; CHECK: loop: 2307ce1a11fSNikita Popov; CHECK-NEXT: [[IV:%.*]] = phi i64 [ [[IV_NEXT:%.*]], [[LOOP]] ], [ 0, [[ENTRY:%.*]] ] 2317ce1a11fSNikita Popov; CHECK-NEXT: [[IV2:%.*]] = add nuw i64 [[IV]], [[BASE]] 232dc5da485SNikita Popov; CHECK-NEXT: call void @use.i64(i64 [[IV2]]) 233dc5da485SNikita Popov; CHECK-NEXT: [[STEP:%.*]] = call i64 @get.i64() 234dc5da485SNikita Popov; CHECK-NEXT: [[IV_NEXT]] = add nuw nsw i64 [[IV]], [[STEP]] 235dc5da485SNikita Popov; CHECK-NEXT: [[CMP:%.*]] = icmp eq i64 [[IV_NEXT]], [[END]] 236dc5da485SNikita Popov; CHECK-NEXT: br i1 [[CMP]], label [[EXIT:%.*]], label [[LOOP]] 237dc5da485SNikita Popov; CHECK: exit: 238dc5da485SNikita Popov; CHECK-NEXT: ret void 239dc5da485SNikita Popov; 240dc5da485SNikita Popoventry: 241dc5da485SNikita Popov br label %loop 242dc5da485SNikita Popov 243dc5da485SNikita Popovloop: 244dc5da485SNikita Popov %iv2 = phi i64 [ %iv2.next, %loop ], [ %base, %entry ] 245dc5da485SNikita Popov %iv = phi i64 [ %iv.next, %loop ], [ 0, %entry ] 246dc5da485SNikita Popov call void @use.i64(i64 %iv2) 247dc5da485SNikita Popov %step = call i64 @get.i64() 248dc5da485SNikita Popov %iv.next = add nuw nsw i64 %iv, %step 249dc5da485SNikita Popov %iv2.next = add nuw i64 %iv.next, %base 250dc5da485SNikita Popov %cmp = icmp eq i64 %iv.next, %end 251dc5da485SNikita Popov br i1 %cmp, label %exit, label %loop 252dc5da485SNikita Popov 253dc5da485SNikita Popovexit: 254dc5da485SNikita Popov ret void 255dc5da485SNikita Popov} 256dc5da485SNikita Popov 257c7799fadSNikita Popovdefine void @int_iv_xor(i64 %base, i64 %end) { 258c7799fadSNikita Popov; CHECK-LABEL: define void @int_iv_xor( 259c7799fadSNikita Popov; CHECK-SAME: i64 [[BASE:%.*]], i64 [[END:%.*]]) { 260c7799fadSNikita Popov; CHECK-NEXT: entry: 261c7799fadSNikita Popov; CHECK-NEXT: br label [[LOOP:%.*]] 262c7799fadSNikita Popov; CHECK: loop: 2637ce1a11fSNikita Popov; CHECK-NEXT: [[IV:%.*]] = phi i64 [ [[IV_NEXT:%.*]], [[LOOP]] ], [ 0, [[ENTRY:%.*]] ] 2647ce1a11fSNikita Popov; CHECK-NEXT: [[IV2:%.*]] = xor i64 [[IV]], [[BASE]] 265c7799fadSNikita Popov; CHECK-NEXT: call void @use.i64(i64 [[IV2]]) 266c7799fadSNikita Popov; CHECK-NEXT: [[IV_NEXT]] = add nuw nsw i64 [[IV]], 4 267c7799fadSNikita Popov; CHECK-NEXT: [[CMP:%.*]] = icmp eq i64 [[IV_NEXT]], [[END]] 268c7799fadSNikita Popov; CHECK-NEXT: br i1 [[CMP]], label [[EXIT:%.*]], label [[LOOP]] 269c7799fadSNikita Popov; CHECK: exit: 270c7799fadSNikita Popov; CHECK-NEXT: ret void 271c7799fadSNikita Popov; 272c7799fadSNikita Popoventry: 273c7799fadSNikita Popov br label %loop 274c7799fadSNikita Popov 275c7799fadSNikita Popovloop: 276c7799fadSNikita Popov %iv2 = phi i64 [ %iv2.next, %loop ], [ %base, %entry ] 277c7799fadSNikita Popov %iv = phi i64 [ %iv.next, %loop ], [ 0, %entry ] 278c7799fadSNikita Popov call void @use.i64(i64 %iv2) 279c7799fadSNikita Popov %iv.next = add nuw nsw i64 %iv, 4 280c7799fadSNikita Popov %iv2.next = xor i64 %iv.next, %base 281c7799fadSNikita Popov %cmp = icmp eq i64 %iv.next, %end 282c7799fadSNikita Popov br i1 %cmp, label %exit, label %loop 283c7799fadSNikita Popov 284c7799fadSNikita Popovexit: 285c7799fadSNikita Popov ret void 286c7799fadSNikita Popov} 287c7799fadSNikita Popov 288c7799fadSNikita Popovdefine void @int_iv_or(i64 %base, i64 %end) { 289c7799fadSNikita Popov; CHECK-LABEL: define void @int_iv_or( 290c7799fadSNikita Popov; CHECK-SAME: i64 [[BASE:%.*]], i64 [[END:%.*]]) { 291c7799fadSNikita Popov; CHECK-NEXT: entry: 292c7799fadSNikita Popov; CHECK-NEXT: br label [[LOOP:%.*]] 293c7799fadSNikita Popov; CHECK: loop: 2947ce1a11fSNikita Popov; CHECK-NEXT: [[IV:%.*]] = phi i64 [ [[IV_NEXT:%.*]], [[LOOP]] ], [ 0, [[ENTRY:%.*]] ] 2957ce1a11fSNikita Popov; CHECK-NEXT: [[IV2:%.*]] = or i64 [[IV]], [[BASE]] 296c7799fadSNikita Popov; CHECK-NEXT: call void @use.i64(i64 [[IV2]]) 297c7799fadSNikita Popov; CHECK-NEXT: [[IV_NEXT]] = add nuw nsw i64 [[IV]], 4 298c7799fadSNikita Popov; CHECK-NEXT: [[CMP:%.*]] = icmp eq i64 [[IV_NEXT]], [[END]] 299c7799fadSNikita Popov; CHECK-NEXT: br i1 [[CMP]], label [[EXIT:%.*]], label [[LOOP]] 300c7799fadSNikita Popov; CHECK: exit: 301c7799fadSNikita Popov; CHECK-NEXT: ret void 302c7799fadSNikita Popov; 303c7799fadSNikita Popoventry: 304c7799fadSNikita Popov br label %loop 305c7799fadSNikita Popov 306c7799fadSNikita Popovloop: 307c7799fadSNikita Popov %iv2 = phi i64 [ %iv2.next, %loop ], [ %base, %entry ] 308c7799fadSNikita Popov %iv = phi i64 [ %iv.next, %loop ], [ 0, %entry ] 309c7799fadSNikita Popov call void @use.i64(i64 %iv2) 310c7799fadSNikita Popov %iv.next = add nuw nsw i64 %iv, 4 311c7799fadSNikita Popov %iv2.next = or i64 %iv.next, %base 312c7799fadSNikita Popov %cmp = icmp eq i64 %iv.next, %end 313c7799fadSNikita Popov br i1 %cmp, label %exit, label %loop 314c7799fadSNikita Popov 315c7799fadSNikita Popovexit: 316c7799fadSNikita Popov ret void 317c7799fadSNikita Popov} 318c7799fadSNikita Popov 319c7799fadSNikita Popovdefine void @int_iv_or_disjoint(i64 %base, i64 %end) { 320c7799fadSNikita Popov; CHECK-LABEL: define void @int_iv_or_disjoint( 321c7799fadSNikita Popov; CHECK-SAME: i64 [[BASE:%.*]], i64 [[END:%.*]]) { 322c7799fadSNikita Popov; CHECK-NEXT: entry: 323c7799fadSNikita Popov; CHECK-NEXT: br label [[LOOP:%.*]] 324c7799fadSNikita Popov; CHECK: loop: 3257ce1a11fSNikita Popov; CHECK-NEXT: [[IV:%.*]] = phi i64 [ [[IV_NEXT:%.*]], [[LOOP]] ], [ 0, [[ENTRY:%.*]] ] 3267ce1a11fSNikita Popov; CHECK-NEXT: [[IV2:%.*]] = or disjoint i64 [[IV]], [[BASE]] 327c7799fadSNikita Popov; CHECK-NEXT: call void @use.i64(i64 [[IV2]]) 328c7799fadSNikita Popov; CHECK-NEXT: [[IV_NEXT]] = add nuw nsw i64 [[IV]], 4 329c7799fadSNikita Popov; CHECK-NEXT: [[CMP:%.*]] = icmp eq i64 [[IV_NEXT]], [[END]] 330c7799fadSNikita Popov; CHECK-NEXT: br i1 [[CMP]], label [[EXIT:%.*]], label [[LOOP]] 331c7799fadSNikita Popov; CHECK: exit: 332c7799fadSNikita Popov; CHECK-NEXT: ret void 333c7799fadSNikita Popov; 334c7799fadSNikita Popoventry: 335c7799fadSNikita Popov br label %loop 336c7799fadSNikita Popov 337c7799fadSNikita Popovloop: 338c7799fadSNikita Popov %iv2 = phi i64 [ %iv2.next, %loop ], [ %base, %entry ] 339c7799fadSNikita Popov %iv = phi i64 [ %iv.next, %loop ], [ 0, %entry ] 340c7799fadSNikita Popov call void @use.i64(i64 %iv2) 341c7799fadSNikita Popov %iv.next = add nuw nsw i64 %iv, 4 342c7799fadSNikita Popov %iv2.next = or disjoint i64 %iv.next, %base 343c7799fadSNikita Popov %cmp = icmp eq i64 %iv.next, %end 344c7799fadSNikita Popov br i1 %cmp, label %exit, label %loop 345c7799fadSNikita Popov 346c7799fadSNikita Popovexit: 347c7799fadSNikita Popov ret void 348c7799fadSNikita Popov} 349c7799fadSNikita Popov 350c7799fadSNikita Popovdefine void @int_iv_and(i64 %base, i64 %end) { 351c7799fadSNikita Popov; CHECK-LABEL: define void @int_iv_and( 352c7799fadSNikita Popov; CHECK-SAME: i64 [[BASE:%.*]], i64 [[END:%.*]]) { 353c7799fadSNikita Popov; CHECK-NEXT: entry: 354c7799fadSNikita Popov; CHECK-NEXT: br label [[LOOP:%.*]] 355c7799fadSNikita Popov; CHECK: loop: 3567ce1a11fSNikita Popov; CHECK-NEXT: [[IV:%.*]] = phi i64 [ [[IV_NEXT:%.*]], [[LOOP]] ], [ -1, [[ENTRY:%.*]] ] 3577ce1a11fSNikita Popov; CHECK-NEXT: [[IV2:%.*]] = and i64 [[IV]], [[BASE]] 358c7799fadSNikita Popov; CHECK-NEXT: call void @use.i64(i64 [[IV2]]) 359c7799fadSNikita Popov; CHECK-NEXT: [[IV_NEXT]] = add nuw nsw i64 [[IV]], 4 360c7799fadSNikita Popov; CHECK-NEXT: [[CMP:%.*]] = icmp eq i64 [[IV_NEXT]], [[END]] 361c7799fadSNikita Popov; CHECK-NEXT: br i1 [[CMP]], label [[EXIT:%.*]], label [[LOOP]] 362c7799fadSNikita Popov; CHECK: exit: 363c7799fadSNikita Popov; CHECK-NEXT: ret void 364c7799fadSNikita Popov; 365c7799fadSNikita Popoventry: 366c7799fadSNikita Popov br label %loop 367c7799fadSNikita Popov 368c7799fadSNikita Popovloop: 369c7799fadSNikita Popov %iv2 = phi i64 [ %iv2.next, %loop ], [ %base, %entry ] 370c7799fadSNikita Popov %iv = phi i64 [ %iv.next, %loop ], [ -1, %entry ] 371c7799fadSNikita Popov call void @use.i64(i64 %iv2) 372c7799fadSNikita Popov %iv.next = add nuw nsw i64 %iv, 4 373c7799fadSNikita Popov %iv2.next = and i64 %iv.next, %base 374c7799fadSNikita Popov %cmp = icmp eq i64 %iv.next, %end 375c7799fadSNikita Popov br i1 %cmp, label %exit, label %loop 376c7799fadSNikita Popov 377c7799fadSNikita Popovexit: 378c7799fadSNikita Popov ret void 379c7799fadSNikita Popov} 380c7799fadSNikita Popov 381c7799fadSNikita Popovdefine void @int_iv_sub(i64 %base, i64 %end) { 382c7799fadSNikita Popov; CHECK-LABEL: define void @int_iv_sub( 383c7799fadSNikita Popov; CHECK-SAME: i64 [[BASE:%.*]], i64 [[END:%.*]]) { 384c7799fadSNikita Popov; CHECK-NEXT: entry: 385c7799fadSNikita Popov; CHECK-NEXT: br label [[LOOP:%.*]] 386c7799fadSNikita Popov; CHECK: loop: 387c7799fadSNikita Popov; CHECK-NEXT: [[IV2:%.*]] = phi i64 [ [[IV2_NEXT:%.*]], [[LOOP]] ], [ [[BASE]], [[ENTRY:%.*]] ] 388c7799fadSNikita Popov; CHECK-NEXT: [[IV:%.*]] = phi i64 [ [[IV_NEXT:%.*]], [[LOOP]] ], [ 0, [[ENTRY]] ] 389c7799fadSNikita Popov; CHECK-NEXT: call void @use.i64(i64 [[IV2]]) 390c7799fadSNikita Popov; CHECK-NEXT: [[IV_NEXT]] = add nuw nsw i64 [[IV]], 4 391c7799fadSNikita Popov; CHECK-NEXT: [[IV2_NEXT]] = sub i64 [[BASE]], [[IV_NEXT]] 392c7799fadSNikita Popov; CHECK-NEXT: [[CMP:%.*]] = icmp eq i64 [[IV_NEXT]], [[END]] 393c7799fadSNikita Popov; CHECK-NEXT: br i1 [[CMP]], label [[EXIT:%.*]], label [[LOOP]] 394c7799fadSNikita Popov; CHECK: exit: 395c7799fadSNikita Popov; CHECK-NEXT: ret void 396c7799fadSNikita Popov; 397c7799fadSNikita Popoventry: 398c7799fadSNikita Popov br label %loop 399c7799fadSNikita Popov 400c7799fadSNikita Popovloop: 401c7799fadSNikita Popov %iv2 = phi i64 [ %iv2.next, %loop ], [ %base, %entry ] 402c7799fadSNikita Popov %iv = phi i64 [ %iv.next, %loop ], [ 0, %entry ] 403c7799fadSNikita Popov call void @use.i64(i64 %iv2) 404c7799fadSNikita Popov %iv.next = add nuw nsw i64 %iv, 4 405c7799fadSNikita Popov %iv2.next = sub i64 %base, %iv.next 406c7799fadSNikita Popov %cmp = icmp eq i64 %iv.next, %end 407c7799fadSNikita Popov br i1 %cmp, label %exit, label %loop 408c7799fadSNikita Popov 409c7799fadSNikita Popovexit: 410c7799fadSNikita Popov ret void 411c7799fadSNikita Popov} 412c7799fadSNikita Popov 413c7799fadSNikita Popovdefine void @int_iv_sub_invalid_order(i64 %base, i64 %end) { 414c7799fadSNikita Popov; CHECK-LABEL: define void @int_iv_sub_invalid_order( 415c7799fadSNikita Popov; CHECK-SAME: i64 [[BASE:%.*]], i64 [[END:%.*]]) { 416c7799fadSNikita Popov; CHECK-NEXT: entry: 417c7799fadSNikita Popov; CHECK-NEXT: br label [[LOOP:%.*]] 418c7799fadSNikita Popov; CHECK: loop: 419c7799fadSNikita Popov; CHECK-NEXT: [[IV2:%.*]] = phi i64 [ [[IV2_NEXT:%.*]], [[LOOP]] ], [ [[BASE]], [[ENTRY:%.*]] ] 420c7799fadSNikita Popov; CHECK-NEXT: [[IV:%.*]] = phi i64 [ [[IV_NEXT:%.*]], [[LOOP]] ], [ 0, [[ENTRY]] ] 421c7799fadSNikita Popov; CHECK-NEXT: call void @use.i64(i64 [[IV2]]) 422c7799fadSNikita Popov; CHECK-NEXT: [[IV_NEXT]] = add nuw nsw i64 [[IV]], 4 423c7799fadSNikita Popov; CHECK-NEXT: [[IV2_NEXT]] = sub i64 [[IV_NEXT]], [[BASE]] 424c7799fadSNikita Popov; CHECK-NEXT: [[CMP:%.*]] = icmp eq i64 [[IV_NEXT]], [[END]] 425c7799fadSNikita Popov; CHECK-NEXT: br i1 [[CMP]], label [[EXIT:%.*]], label [[LOOP]] 426c7799fadSNikita Popov; CHECK: exit: 427c7799fadSNikita Popov; CHECK-NEXT: ret void 428c7799fadSNikita Popov; 429c7799fadSNikita Popoventry: 430c7799fadSNikita Popov br label %loop 431c7799fadSNikita Popov 432c7799fadSNikita Popovloop: 433c7799fadSNikita Popov %iv2 = phi i64 [ %iv2.next, %loop ], [ %base, %entry ] 434c7799fadSNikita Popov %iv = phi i64 [ %iv.next, %loop ], [ 0, %entry ] 435c7799fadSNikita Popov call void @use.i64(i64 %iv2) 436c7799fadSNikita Popov %iv.next = add nuw nsw i64 %iv, 4 437c7799fadSNikita Popov %iv2.next = sub i64 %iv.next, %base 438c7799fadSNikita Popov %cmp = icmp eq i64 %iv.next, %end 439c7799fadSNikita Popov br i1 %cmp, label %exit, label %loop 440c7799fadSNikita Popov 441c7799fadSNikita Popovexit: 442c7799fadSNikita Popov ret void 443c7799fadSNikita Popov} 444c7799fadSNikita Popov 445c7799fadSNikita Popovdefine void @int_iv_add_wrong_start(i64 %base, i64 %end) { 446c7799fadSNikita Popov; CHECK-LABEL: define void @int_iv_add_wrong_start( 447c7799fadSNikita Popov; CHECK-SAME: i64 [[BASE:%.*]], i64 [[END:%.*]]) { 448c7799fadSNikita Popov; CHECK-NEXT: entry: 449c7799fadSNikita Popov; CHECK-NEXT: br label [[LOOP:%.*]] 450c7799fadSNikita Popov; CHECK: loop: 451c7799fadSNikita Popov; CHECK-NEXT: [[IV2:%.*]] = phi i64 [ [[IV2_NEXT:%.*]], [[LOOP]] ], [ [[BASE]], [[ENTRY:%.*]] ] 452c7799fadSNikita Popov; CHECK-NEXT: [[IV:%.*]] = phi i64 [ [[IV_NEXT:%.*]], [[LOOP]] ], [ 1, [[ENTRY]] ] 453c7799fadSNikita Popov; CHECK-NEXT: call void @use.i64(i64 [[IV2]]) 454c7799fadSNikita Popov; CHECK-NEXT: [[IV_NEXT]] = add nuw nsw i64 [[IV]], 4 455a1058776SNikita Popov; CHECK-NEXT: [[IV2_NEXT]] = add i64 [[BASE]], [[IV_NEXT]] 456c7799fadSNikita Popov; CHECK-NEXT: [[CMP:%.*]] = icmp eq i64 [[IV_NEXT]], [[END]] 457c7799fadSNikita Popov; CHECK-NEXT: br i1 [[CMP]], label [[EXIT:%.*]], label [[LOOP]] 458c7799fadSNikita Popov; CHECK: exit: 459c7799fadSNikita Popov; CHECK-NEXT: ret void 460c7799fadSNikita Popov; 461c7799fadSNikita Popoventry: 462c7799fadSNikita Popov br label %loop 463c7799fadSNikita Popov 464c7799fadSNikita Popovloop: 465c7799fadSNikita Popov %iv2 = phi i64 [ %iv2.next, %loop ], [ %base, %entry ] 466c7799fadSNikita Popov %iv = phi i64 [ %iv.next, %loop ], [ 1, %entry ] 467c7799fadSNikita Popov call void @use.i64(i64 %iv2) 468c7799fadSNikita Popov %iv.next = add nuw nsw i64 %iv, 4 469c7799fadSNikita Popov %iv2.next = add i64 %base, %iv.next 470c7799fadSNikita Popov %cmp = icmp eq i64 %iv.next, %end 471c7799fadSNikita Popov br i1 %cmp, label %exit, label %loop 472c7799fadSNikita Popov 473c7799fadSNikita Popovexit: 474c7799fadSNikita Popov ret void 475c7799fadSNikita Popov} 476c7799fadSNikita Popov 477c7799fadSNikita Popovdefine void @int_iv_and_wrong_start(i64 %base, i64 %end) { 478c7799fadSNikita Popov; CHECK-LABEL: define void @int_iv_and_wrong_start( 479c7799fadSNikita Popov; CHECK-SAME: i64 [[BASE:%.*]], i64 [[END:%.*]]) { 480c7799fadSNikita Popov; CHECK-NEXT: entry: 481c7799fadSNikita Popov; CHECK-NEXT: br label [[LOOP:%.*]] 482c7799fadSNikita Popov; CHECK: loop: 483c7799fadSNikita Popov; CHECK-NEXT: [[IV2:%.*]] = phi i64 [ [[IV2_NEXT:%.*]], [[LOOP]] ], [ [[BASE]], [[ENTRY:%.*]] ] 484c7799fadSNikita Popov; CHECK-NEXT: [[IV:%.*]] = phi i64 [ [[IV_NEXT:%.*]], [[LOOP]] ], [ 0, [[ENTRY]] ] 485c7799fadSNikita Popov; CHECK-NEXT: call void @use.i64(i64 [[IV2]]) 486c7799fadSNikita Popov; CHECK-NEXT: [[IV_NEXT]] = add nuw nsw i64 [[IV]], 4 487c7799fadSNikita Popov; CHECK-NEXT: [[IV2_NEXT]] = and i64 [[IV_NEXT]], [[BASE]] 488c7799fadSNikita Popov; CHECK-NEXT: [[CMP:%.*]] = icmp eq i64 [[IV_NEXT]], [[END]] 489c7799fadSNikita Popov; CHECK-NEXT: br i1 [[CMP]], label [[EXIT:%.*]], label [[LOOP]] 490c7799fadSNikita Popov; CHECK: exit: 491c7799fadSNikita Popov; CHECK-NEXT: ret void 492c7799fadSNikita Popov; 493c7799fadSNikita Popoventry: 494c7799fadSNikita Popov br label %loop 495c7799fadSNikita Popov 496c7799fadSNikita Popovloop: 497c7799fadSNikita Popov %iv2 = phi i64 [ %iv2.next, %loop ], [ %base, %entry ] 498c7799fadSNikita Popov %iv = phi i64 [ %iv.next, %loop ], [ 0, %entry ] 499c7799fadSNikita Popov call void @use.i64(i64 %iv2) 500c7799fadSNikita Popov %iv.next = add nuw nsw i64 %iv, 4 501c7799fadSNikita Popov %iv2.next = and i64 %iv.next, %base 502c7799fadSNikita Popov %cmp = icmp eq i64 %iv.next, %end 503c7799fadSNikita Popov br i1 %cmp, label %exit, label %loop 504c7799fadSNikita Popov 505c7799fadSNikita Popovexit: 506c7799fadSNikita Popov ret void 507c7799fadSNikita Popov} 508c7799fadSNikita Popov 509dc5da485SNikita Popovdefine void @ptr_iv_inbounds(ptr %base, i64 %end) { 510dc5da485SNikita Popov; CHECK-LABEL: define void @ptr_iv_inbounds( 511dc5da485SNikita Popov; CHECK-SAME: ptr [[BASE:%.*]], i64 [[END:%.*]]) { 512dc5da485SNikita Popov; CHECK-NEXT: entry: 513dc5da485SNikita Popov; CHECK-NEXT: br label [[LOOP:%.*]] 514dc5da485SNikita Popov; CHECK: loop: 5157ce1a11fSNikita Popov; CHECK-NEXT: [[IV:%.*]] = phi i64 [ [[IV_NEXT:%.*]], [[LOOP]] ], [ 0, [[ENTRY:%.*]] ] 516*462cb3cdSNikita Popov; CHECK-NEXT: [[IV_PTR:%.*]] = getelementptr inbounds nuw i8, ptr [[BASE]], i64 [[IV]] 517dc5da485SNikita Popov; CHECK-NEXT: call void @use.p0(ptr [[IV_PTR]]) 518dc5da485SNikita Popov; CHECK-NEXT: [[IV_NEXT]] = add nuw nsw i64 [[IV]], 4 519dc5da485SNikita Popov; CHECK-NEXT: [[CMP:%.*]] = icmp eq i64 [[IV_NEXT]], [[END]] 520dc5da485SNikita Popov; CHECK-NEXT: br i1 [[CMP]], label [[EXIT:%.*]], label [[LOOP]] 521dc5da485SNikita Popov; CHECK: exit: 522dc5da485SNikita Popov; CHECK-NEXT: ret void 523dc5da485SNikita Popov; 524dc5da485SNikita Popoventry: 525dc5da485SNikita Popov br label %loop 526dc5da485SNikita Popov 527dc5da485SNikita Popovloop: 528dc5da485SNikita Popov %iv.ptr = phi ptr [ %iv.ptr.next, %loop ], [ %base, %entry ] 529dc5da485SNikita Popov %iv = phi i64 [ %iv.next, %loop ], [ 0, %entry ] 530dc5da485SNikita Popov call void @use.p0(ptr %iv.ptr) 531dc5da485SNikita Popov %iv.next = add nuw nsw i64 %iv, 4 532dc5da485SNikita Popov %iv.ptr.next = getelementptr inbounds i8, ptr %base, i64 %iv.next 533dc5da485SNikita Popov %cmp = icmp eq i64 %iv.next, %end 534dc5da485SNikita Popov br i1 %cmp, label %exit, label %loop 535dc5da485SNikita Popov 536dc5da485SNikita Popovexit: 537dc5da485SNikita Popov ret void 538dc5da485SNikita Popov} 539dc5da485SNikita Popov 5406efba061SNikita Popovdefine void @ptr_iv_nuw(ptr %base, i64 %end) { 5416efba061SNikita Popov; CHECK-LABEL: define void @ptr_iv_nuw( 5426efba061SNikita Popov; CHECK-SAME: ptr [[BASE:%.*]], i64 [[END:%.*]]) { 5436efba061SNikita Popov; CHECK-NEXT: entry: 5446efba061SNikita Popov; CHECK-NEXT: br label [[LOOP:%.*]] 5456efba061SNikita Popov; CHECK: loop: 5466efba061SNikita Popov; CHECK-NEXT: [[IV:%.*]] = phi i64 [ [[IV_NEXT:%.*]], [[LOOP]] ], [ 0, [[ENTRY:%.*]] ] 5476efba061SNikita Popov; CHECK-NEXT: [[IV_PTR:%.*]] = getelementptr nuw i8, ptr [[BASE]], i64 [[IV]] 5486efba061SNikita Popov; CHECK-NEXT: call void @use.p0(ptr [[IV_PTR]]) 5496efba061SNikita Popov; CHECK-NEXT: [[IV_NEXT]] = add nuw nsw i64 [[IV]], 4 5506efba061SNikita Popov; CHECK-NEXT: [[CMP:%.*]] = icmp eq i64 [[IV_NEXT]], [[END]] 5516efba061SNikita Popov; CHECK-NEXT: br i1 [[CMP]], label [[EXIT:%.*]], label [[LOOP]] 5526efba061SNikita Popov; CHECK: exit: 5536efba061SNikita Popov; CHECK-NEXT: ret void 5546efba061SNikita Popov; 5556efba061SNikita Popoventry: 5566efba061SNikita Popov br label %loop 5576efba061SNikita Popov 5586efba061SNikita Popovloop: 5596efba061SNikita Popov %iv.ptr = phi ptr [ %iv.ptr.next, %loop ], [ %base, %entry ] 5606efba061SNikita Popov %iv = phi i64 [ %iv.next, %loop ], [ 0, %entry ] 5616efba061SNikita Popov call void @use.p0(ptr %iv.ptr) 5626efba061SNikita Popov %iv.next = add nuw nsw i64 %iv, 4 5636efba061SNikita Popov %iv.ptr.next = getelementptr nuw i8, ptr %base, i64 %iv.next 5646efba061SNikita Popov %cmp = icmp eq i64 %iv.next, %end 5656efba061SNikita Popov br i1 %cmp, label %exit, label %loop 5666efba061SNikita Popov 5676efba061SNikita Popovexit: 5686efba061SNikita Popov ret void 5696efba061SNikita Popov} 5706efba061SNikita Popov 5716efba061SNikita Popovdefine void @ptr_iv_no_flags(ptr %base, i64 %end) { 5726efba061SNikita Popov; CHECK-LABEL: define void @ptr_iv_no_flags( 573dc5da485SNikita Popov; CHECK-SAME: ptr [[BASE:%.*]], i64 [[END:%.*]]) { 574dc5da485SNikita Popov; CHECK-NEXT: entry: 575dc5da485SNikita Popov; CHECK-NEXT: br label [[LOOP:%.*]] 576dc5da485SNikita Popov; CHECK: loop: 5777ce1a11fSNikita Popov; CHECK-NEXT: [[IV:%.*]] = phi i64 [ [[IV_NEXT:%.*]], [[LOOP]] ], [ 0, [[ENTRY:%.*]] ] 5787ce1a11fSNikita Popov; CHECK-NEXT: [[IV_PTR:%.*]] = getelementptr i8, ptr [[BASE]], i64 [[IV]] 579dc5da485SNikita Popov; CHECK-NEXT: call void @use.p0(ptr [[IV_PTR]]) 580dc5da485SNikita Popov; CHECK-NEXT: [[IV_NEXT]] = add nuw nsw i64 [[IV]], 4 581dc5da485SNikita Popov; CHECK-NEXT: [[CMP:%.*]] = icmp eq i64 [[IV_NEXT]], [[END]] 582dc5da485SNikita Popov; CHECK-NEXT: br i1 [[CMP]], label [[EXIT:%.*]], label [[LOOP]] 583dc5da485SNikita Popov; CHECK: exit: 584dc5da485SNikita Popov; CHECK-NEXT: ret void 585dc5da485SNikita Popov; 586dc5da485SNikita Popoventry: 587dc5da485SNikita Popov br label %loop 588dc5da485SNikita Popov 589dc5da485SNikita Popovloop: 590dc5da485SNikita Popov %iv.ptr = phi ptr [ %iv.ptr.next, %loop ], [ %base, %entry ] 591dc5da485SNikita Popov %iv = phi i64 [ %iv.next, %loop ], [ 0, %entry ] 592dc5da485SNikita Popov call void @use.p0(ptr %iv.ptr) 593dc5da485SNikita Popov %iv.next = add nuw nsw i64 %iv, 4 594dc5da485SNikita Popov %iv.ptr.next = getelementptr i8, ptr %base, i64 %iv.next 595dc5da485SNikita Popov %cmp = icmp eq i64 %iv.next, %end 596dc5da485SNikita Popov br i1 %cmp, label %exit, label %loop 597dc5da485SNikita Popov 598dc5da485SNikita Popovexit: 599dc5da485SNikita Popov ret void 600dc5da485SNikita Popov} 601dc5da485SNikita Popov 6021789dc2fSNikita Popovdefine void @ptr_iv_non_i8_type(ptr %base, i64 %end) { 6031789dc2fSNikita Popov; CHECK-LABEL: define void @ptr_iv_non_i8_type( 6041789dc2fSNikita Popov; CHECK-SAME: ptr [[BASE:%.*]], i64 [[END:%.*]]) { 6051789dc2fSNikita Popov; CHECK-NEXT: entry: 6061789dc2fSNikita Popov; CHECK-NEXT: br label [[LOOP:%.*]] 6071789dc2fSNikita Popov; CHECK: loop: 6087ce1a11fSNikita Popov; CHECK-NEXT: [[IV:%.*]] = phi i64 [ [[IV_NEXT:%.*]], [[LOOP]] ], [ 0, [[ENTRY:%.*]] ] 6097ce1a11fSNikita Popov; CHECK-NEXT: [[IV_PTR:%.*]] = getelementptr i32, ptr [[BASE]], i64 [[IV]] 6101789dc2fSNikita Popov; CHECK-NEXT: call void @use.p0(ptr [[IV_PTR]]) 6111789dc2fSNikita Popov; CHECK-NEXT: [[IV_NEXT]] = add nuw nsw i64 [[IV]], 4 6121789dc2fSNikita Popov; CHECK-NEXT: [[CMP:%.*]] = icmp eq i64 [[IV_NEXT]], [[END]] 6131789dc2fSNikita Popov; CHECK-NEXT: br i1 [[CMP]], label [[EXIT:%.*]], label [[LOOP]] 6141789dc2fSNikita Popov; CHECK: exit: 6151789dc2fSNikita Popov; CHECK-NEXT: ret void 6161789dc2fSNikita Popov; 6171789dc2fSNikita Popoventry: 6181789dc2fSNikita Popov br label %loop 6191789dc2fSNikita Popov 6201789dc2fSNikita Popovloop: 6211789dc2fSNikita Popov %iv.ptr = phi ptr [ %iv.ptr.next, %loop ], [ %base, %entry ] 6221789dc2fSNikita Popov %iv = phi i64 [ %iv.next, %loop ], [ 0, %entry ] 6231789dc2fSNikita Popov call void @use.p0(ptr %iv.ptr) 6241789dc2fSNikita Popov %iv.next = add nuw nsw i64 %iv, 4 6251789dc2fSNikita Popov %iv.ptr.next = getelementptr i32, ptr %base, i64 %iv.next 6261789dc2fSNikita Popov %cmp = icmp eq i64 %iv.next, %end 6271789dc2fSNikita Popov br i1 %cmp, label %exit, label %loop 6281789dc2fSNikita Popov 6291789dc2fSNikita Popovexit: 6301789dc2fSNikita Popov ret void 6311789dc2fSNikita Popov} 6321789dc2fSNikita Popov 633dc5da485SNikita Popovdefine void @ptr_iv_vector(<2 x ptr> %base, i64 %end) { 634dc5da485SNikita Popov; CHECK-LABEL: define void @ptr_iv_vector( 635dc5da485SNikita Popov; CHECK-SAME: <2 x ptr> [[BASE:%.*]], i64 [[END:%.*]]) { 636dc5da485SNikita Popov; CHECK-NEXT: entry: 637dc5da485SNikita Popov; CHECK-NEXT: br label [[LOOP:%.*]] 638dc5da485SNikita Popov; CHECK: loop: 6397ce1a11fSNikita Popov; CHECK-NEXT: [[IV:%.*]] = phi i64 [ [[IV_NEXT:%.*]], [[LOOP]] ], [ 0, [[ENTRY:%.*]] ] 6407ce1a11fSNikita Popov; CHECK-NEXT: [[IV_PTR:%.*]] = getelementptr inbounds i8, <2 x ptr> [[BASE]], i64 [[IV]] 641dc5da485SNikita Popov; CHECK-NEXT: call void @use.v2p0(<2 x ptr> [[IV_PTR]]) 642dc5da485SNikita Popov; CHECK-NEXT: [[IV_NEXT]] = add nuw nsw i64 [[IV]], 4 643dc5da485SNikita Popov; CHECK-NEXT: [[CMP:%.*]] = icmp eq i64 [[IV_NEXT]], [[END]] 644dc5da485SNikita Popov; CHECK-NEXT: br i1 [[CMP]], label [[EXIT:%.*]], label [[LOOP]] 645dc5da485SNikita Popov; CHECK: exit: 646dc5da485SNikita Popov; CHECK-NEXT: ret void 647dc5da485SNikita Popov; 648dc5da485SNikita Popoventry: 649dc5da485SNikita Popov br label %loop 650dc5da485SNikita Popov 651dc5da485SNikita Popovloop: 652dc5da485SNikita Popov %iv.ptr = phi <2 x ptr> [ %iv.ptr.next, %loop ], [ %base, %entry ] 653dc5da485SNikita Popov %iv = phi i64 [ %iv.next, %loop ], [ 0, %entry ] 654dc5da485SNikita Popov call void @use.v2p0(<2 x ptr> %iv.ptr) 655dc5da485SNikita Popov %iv.next = add nuw nsw i64 %iv, 4 656dc5da485SNikita Popov %iv.ptr.next = getelementptr inbounds i8, <2 x ptr> %base, i64 %iv.next 657dc5da485SNikita Popov %cmp = icmp eq i64 %iv.next, %end 658dc5da485SNikita Popov br i1 %cmp, label %exit, label %loop 659dc5da485SNikita Popov 660dc5da485SNikita Popovexit: 661dc5da485SNikita Popov ret void 662dc5da485SNikita Popov} 663dc5da485SNikita Popov 664dc5da485SNikita Popovdefine void @ptr_iv_vector2(<2 x ptr> %base) { 665dc5da485SNikita Popov; CHECK-LABEL: define void @ptr_iv_vector2( 666dc5da485SNikita Popov; CHECK-SAME: <2 x ptr> [[BASE:%.*]]) { 667dc5da485SNikita Popov; CHECK-NEXT: entry: 668dc5da485SNikita Popov; CHECK-NEXT: br label [[LOOP:%.*]] 669dc5da485SNikita Popov; CHECK: loop: 6707ce1a11fSNikita Popov; CHECK-NEXT: [[IV:%.*]] = phi <2 x i64> [ [[IV_NEXT:%.*]], [[LOOP]] ], [ zeroinitializer, [[ENTRY:%.*]] ] 6717ce1a11fSNikita Popov; CHECK-NEXT: [[IV_PTR:%.*]] = getelementptr i8, <2 x ptr> [[BASE]], <2 x i64> [[IV]] 672dc5da485SNikita Popov; CHECK-NEXT: call void @use.v2p0(<2 x ptr> [[IV_PTR]]) 67338fffa63SPaul Walker; CHECK-NEXT: [[IV_NEXT]] = add nuw nsw <2 x i64> [[IV]], splat (i64 4) 674dc5da485SNikita Popov; CHECK-NEXT: [[CMP:%.*]] = call i1 @get.i1() 675dc5da485SNikita Popov; CHECK-NEXT: br i1 [[CMP]], label [[EXIT:%.*]], label [[LOOP]] 676dc5da485SNikita Popov; CHECK: exit: 677dc5da485SNikita Popov; CHECK-NEXT: ret void 678dc5da485SNikita Popov; 679dc5da485SNikita Popoventry: 680dc5da485SNikita Popov br label %loop 681dc5da485SNikita Popov 682dc5da485SNikita Popovloop: 683dc5da485SNikita Popov %iv.ptr = phi <2 x ptr> [ %iv.ptr.next, %loop ], [ %base, %entry ] 684dc5da485SNikita Popov %iv = phi <2 x i64> [ %iv.next, %loop ], [ zeroinitializer, %entry ] 685dc5da485SNikita Popov call void @use.v2p0(<2 x ptr> %iv.ptr) 686dc5da485SNikita Popov %iv.next = add nuw nsw <2 x i64> %iv, <i64 4, i64 4> 687dc5da485SNikita Popov %iv.ptr.next = getelementptr i8, <2 x ptr> %base, <2 x i64> %iv.next 688dc5da485SNikita Popov %cmp = call i1 @get.i1() 689dc5da485SNikita Popov br i1 %cmp, label %exit, label %loop 690dc5da485SNikita Popov 691dc5da485SNikita Popovexit: 692dc5da485SNikita Popov ret void 693dc5da485SNikita Popov} 694dc5da485SNikita Popov 695dc5da485SNikita Popovdefine void @different_loops(i64 %base) { 696dc5da485SNikita Popov; CHECK-LABEL: define void @different_loops( 697dc5da485SNikita Popov; CHECK-SAME: i64 [[BASE:%.*]]) { 698dc5da485SNikita Popov; CHECK-NEXT: entry: 699dc5da485SNikita Popov; CHECK-NEXT: br label [[LOOP1:%.*]] 700dc5da485SNikita Popov; CHECK: loop1: 701dc5da485SNikita Popov; CHECK-NEXT: [[IV:%.*]] = phi i64 [ [[IV_NEXT:%.*]], [[LOOP1]] ], [ 0, [[ENTRY:%.*]] ] 702dc5da485SNikita Popov; CHECK-NEXT: call void @use.i64(i64 [[IV]]) 703dc5da485SNikita Popov; CHECK-NEXT: [[IV_NEXT]] = add nuw nsw i64 [[IV]], 4 704dc5da485SNikita Popov; CHECK-NEXT: [[CMP:%.*]] = call i1 @get.i1() 705dc5da485SNikita Popov; CHECK-NEXT: br i1 [[CMP]], label [[LOOP2:%.*]], label [[LOOP1]] 706dc5da485SNikita Popov; CHECK: loop2: 707dc5da485SNikita Popov; CHECK-NEXT: [[IV2:%.*]] = phi i64 [ [[IV2_NEXT:%.*]], [[LOOP2]] ], [ [[BASE]], [[LOOP1]] ] 708dc5da485SNikita Popov; CHECK-NEXT: call void @use.i64(i64 [[IV2]]) 709a1058776SNikita Popov; CHECK-NEXT: [[IV2_NEXT]] = add nuw i64 [[BASE]], [[IV_NEXT]] 710dc5da485SNikita Popov; CHECK-NEXT: [[CMP2:%.*]] = call i1 @get.i1() 711dc5da485SNikita Popov; CHECK-NEXT: br i1 [[CMP2]], label [[EXIT:%.*]], label [[LOOP2]] 712dc5da485SNikita Popov; CHECK: exit: 713dc5da485SNikita Popov; CHECK-NEXT: ret void 714dc5da485SNikita Popov; 715dc5da485SNikita Popoventry: 716dc5da485SNikita Popov br label %loop1 717dc5da485SNikita Popov 718dc5da485SNikita Popovloop1: 719dc5da485SNikita Popov %iv = phi i64 [ %iv.next, %loop1 ], [ 0, %entry ] 720dc5da485SNikita Popov call void @use.i64(i64 %iv) 721dc5da485SNikita Popov %iv.next = add nuw nsw i64 %iv, 4 722dc5da485SNikita Popov %cmp = call i1 @get.i1() 723dc5da485SNikita Popov br i1 %cmp, label %loop2, label %loop1 724dc5da485SNikita Popov 725dc5da485SNikita Popovloop2: 726dc5da485SNikita Popov %iv2 = phi i64 [ %iv2.next, %loop2 ], [ %base, %loop1 ] 727dc5da485SNikita Popov call void @use.i64(i64 %iv2) 728dc5da485SNikita Popov %iv2.next = add nuw i64 %base, %iv.next 729dc5da485SNikita Popov %cmp2 = call i1 @get.i1() 730dc5da485SNikita Popov br i1 %cmp2, label %exit, label %loop2 731dc5da485SNikita Popov 732dc5da485SNikita Popovexit: 733dc5da485SNikita Popov ret void 734dc5da485SNikita Popov} 735dc5da485SNikita Popov 736dc5da485SNikita Popovdeclare void @use.p0(ptr) 737dc5da485SNikita Popovdeclare void @use.v2p0(<2 x ptr>) 738dc5da485SNikita Popovdeclare void @use.i64(i64) 739dc5da485SNikita Popovdeclare void @use.v2i64(<2 x i64>) 740dc5da485SNikita Popovdeclare i1 @get.i1() 741dc5da485SNikita Popovdeclare i64 @get.i64() 742