16162f6e9SFlorian Hahn; NOTE: Assertions have been autogenerated by utils/update_test_checks.py 26162f6e9SFlorian Hahn; RUN: opt -passes=constraint-elimination -S %s | FileCheck %s 36162f6e9SFlorian Hahn 46162f6e9SFlorian Hahntarget datalayout = "e-m:o-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128" 56162f6e9SFlorian Hahn 66162f6e9SFlorian Hahn 76162f6e9SFlorian Hahndeclare void @use(i16) 86162f6e9SFlorian Hahndeclare void @llvm.assume(i1) 96162f6e9SFlorian Hahn 106162f6e9SFlorian Hahndefine void @test_monotonic_ptr_iv_inc_1_eq_to_uge(i8 %len.n, i16 %a) { 116162f6e9SFlorian Hahn; CHECK-LABEL: @test_monotonic_ptr_iv_inc_1_eq_to_uge( 126162f6e9SFlorian Hahn; CHECK-NEXT: entry: 136162f6e9SFlorian Hahn; CHECK-NEXT: [[LEN:%.*]] = zext i8 [[LEN_N:%.*]] to i16 146162f6e9SFlorian Hahn; CHECK-NEXT: [[LEN_NEG:%.*]] = icmp uge i16 [[LEN]], [[A:%.*]] 156162f6e9SFlorian Hahn; CHECK-NEXT: br i1 [[LEN_NEG]], label [[EXIT:%.*]], label [[LOOP_PH:%.*]] 166162f6e9SFlorian Hahn; CHECK: loop.ph: 176162f6e9SFlorian Hahn; CHECK-NEXT: br label [[LOOP_HEADER:%.*]] 186162f6e9SFlorian Hahn; CHECK: loop.header: 196162f6e9SFlorian Hahn; CHECK-NEXT: [[IV:%.*]] = phi i16 [ 0, [[LOOP_PH]] ], [ [[IV_NEXT:%.*]], [[LOOP_LATCH:%.*]] ] 206162f6e9SFlorian Hahn; CHECK-NEXT: [[C:%.*]] = icmp eq i16 [[IV]], [[LEN]] 216162f6e9SFlorian Hahn; CHECK-NEXT: br i1 [[C]], label [[EXIT]], label [[FOR_BODY:%.*]] 226162f6e9SFlorian Hahn; CHECK: for.body: 23*98e016d9SFlorian Hahn; CHECK-NEXT: [[AND:%.*]] = and i1 true, true 246162f6e9SFlorian Hahn; CHECK-NEXT: br i1 [[AND]], label [[LOOP_LATCH]], label [[EXIT]] 256162f6e9SFlorian Hahn; CHECK: loop.latch: 266162f6e9SFlorian Hahn; CHECK-NEXT: call void @use(i16 [[IV]]) 276162f6e9SFlorian Hahn; CHECK-NEXT: [[IV_NEXT]] = add nuw nsw i16 [[IV]], 1 286162f6e9SFlorian Hahn; CHECK-NEXT: br label [[LOOP_HEADER]] 296162f6e9SFlorian Hahn; CHECK: exit: 306162f6e9SFlorian Hahn; CHECK-NEXT: ret void 316162f6e9SFlorian Hahn; 326162f6e9SFlorian Hahnentry: 336162f6e9SFlorian Hahn %len = zext i8 %len.n to i16 346162f6e9SFlorian Hahn %len.neg = icmp uge i16 %len, %a 356162f6e9SFlorian Hahn br i1 %len.neg, label %exit, label %loop.ph 366162f6e9SFlorian Hahn 376162f6e9SFlorian Hahnloop.ph: 386162f6e9SFlorian Hahn br label %loop.header 396162f6e9SFlorian Hahn 406162f6e9SFlorian Hahnloop.header: 416162f6e9SFlorian Hahn %iv = phi i16 [ 0, %loop.ph ], [ %iv.next, %loop.latch ] 426162f6e9SFlorian Hahn %c = icmp eq i16 %iv, %len 436162f6e9SFlorian Hahn br i1 %c, label %exit, label %for.body 446162f6e9SFlorian Hahn 456162f6e9SFlorian Hahnfor.body: 466162f6e9SFlorian Hahn %t.1 = icmp uge i16 %iv, 0 476162f6e9SFlorian Hahn %t.2 = icmp ult i16 %iv, %a 486162f6e9SFlorian Hahn %and = and i1 %t.1, %t.2 496162f6e9SFlorian Hahn br i1 %and, label %loop.latch, label %exit 506162f6e9SFlorian Hahn 516162f6e9SFlorian Hahnloop.latch: 526162f6e9SFlorian Hahn call void @use(i16 %iv) 536162f6e9SFlorian Hahn %iv.next = add nuw nsw i16 %iv, 1 546162f6e9SFlorian Hahn br label %loop.header 556162f6e9SFlorian Hahn 566162f6e9SFlorian Hahnexit: 576162f6e9SFlorian Hahn ret void 586162f6e9SFlorian Hahn} 596162f6e9SFlorian Hahn 606162f6e9SFlorian Hahndefine void @test_remove_check_with_incrementing_integer_induction(i8 %len.n, i16 %a) { 616162f6e9SFlorian Hahn; CHECK-LABEL: @test_remove_check_with_incrementing_integer_induction( 626162f6e9SFlorian Hahn; CHECK-NEXT: entry: 636162f6e9SFlorian Hahn; CHECK-NEXT: [[LEN:%.*]] = zext i8 [[LEN_N:%.*]] to i16 646162f6e9SFlorian Hahn; CHECK-NEXT: [[LEN_NEG_NOT:%.*]] = icmp ult i16 [[LEN]], [[A:%.*]] 656162f6e9SFlorian Hahn; CHECK-NEXT: br i1 [[LEN_NEG_NOT]], label [[LOOP_HEADER:%.*]], label [[EXIT:%.*]] 666162f6e9SFlorian Hahn; CHECK: loop.header: 676162f6e9SFlorian Hahn; CHECK-NEXT: [[IV:%.*]] = phi i16 [ [[IV_NEXT:%.*]], [[LOOP_LATCH:%.*]] ], [ 0, [[ENTRY:%.*]] ] 686162f6e9SFlorian Hahn; CHECK-NEXT: [[C:%.*]] = icmp ne i16 [[IV]], [[LEN]] 696162f6e9SFlorian Hahn; CHECK-NEXT: [[T_2:%.*]] = icmp ult i16 [[IV]], [[A]] 706162f6e9SFlorian Hahn; CHECK-NEXT: [[OR_COND:%.*]] = and i1 [[C]], [[T_2]] 716162f6e9SFlorian Hahn; CHECK-NEXT: br i1 [[OR_COND]], label [[LOOP_LATCH]], label [[EXIT]] 726162f6e9SFlorian Hahn; CHECK: loop.latch: 736162f6e9SFlorian Hahn; CHECK-NEXT: call void @use(i16 [[IV]]) 746162f6e9SFlorian Hahn; CHECK-NEXT: [[IV_NEXT]] = add nuw nsw i16 [[IV]], 1 756162f6e9SFlorian Hahn; CHECK-NEXT: br label [[LOOP_HEADER]] 766162f6e9SFlorian Hahn; CHECK: exit: 776162f6e9SFlorian Hahn; CHECK-NEXT: ret void 786162f6e9SFlorian Hahn; 796162f6e9SFlorian Hahnentry: 806162f6e9SFlorian Hahn %len = zext i8 %len.n to i16 816162f6e9SFlorian Hahn %len.neg.not = icmp ult i16 %len, %a 826162f6e9SFlorian Hahn br i1 %len.neg.not, label %loop.header, label %exit 836162f6e9SFlorian Hahn 846162f6e9SFlorian Hahnloop.header: ; preds = %entry, %loop.latch 856162f6e9SFlorian Hahn %iv = phi i16 [ %iv.next, %loop.latch ], [ 0, %entry ] 866162f6e9SFlorian Hahn %c = icmp ne i16 %iv, %len 876162f6e9SFlorian Hahn %t.2 = icmp ult i16 %iv, %a 886162f6e9SFlorian Hahn %or.cond = and i1 %c, %t.2 896162f6e9SFlorian Hahn br i1 %or.cond, label %loop.latch, label %exit 906162f6e9SFlorian Hahn 916162f6e9SFlorian Hahnloop.latch: ; preds = %loop.header 926162f6e9SFlorian Hahn call void @use(i16 %iv) 936162f6e9SFlorian Hahn %iv.next = add nuw nsw i16 %iv, 1 946162f6e9SFlorian Hahn br label %loop.header 956162f6e9SFlorian Hahn 966162f6e9SFlorian Hahnexit: ; preds = %loop.header, %entry 976162f6e9SFlorian Hahn ret void 986162f6e9SFlorian Hahn} 996162f6e9SFlorian Hahn 1006162f6e9SFlorian Hahndefine void @test_monotonic_ptr_iv_inc_2_eq_to_uge(i8 %len.n, i16 %a) { 1016162f6e9SFlorian Hahn; CHECK-LABEL: @test_monotonic_ptr_iv_inc_2_eq_to_uge( 1026162f6e9SFlorian Hahn; CHECK-NEXT: entry: 1036162f6e9SFlorian Hahn; CHECK-NEXT: [[LEN:%.*]] = zext i8 [[LEN_N:%.*]] to i16 1046162f6e9SFlorian Hahn; CHECK-NEXT: [[LEN_LT:%.*]] = icmp ult i16 [[LEN]], [[A:%.*]] 1056162f6e9SFlorian Hahn; CHECK-NEXT: br i1 [[LEN_LT]], label [[LOOP_PH:%.*]], label [[EXIT:%.*]] 1066162f6e9SFlorian Hahn; CHECK: loop.ph: 1076162f6e9SFlorian Hahn; CHECK-NEXT: br label [[LOOP_HEADER:%.*]] 1086162f6e9SFlorian Hahn; CHECK: loop.header: 1096162f6e9SFlorian Hahn; CHECK-NEXT: [[IV:%.*]] = phi i16 [ 0, [[LOOP_PH]] ], [ [[IV_NEXT:%.*]], [[LOOP_LATCH:%.*]] ] 1106162f6e9SFlorian Hahn; CHECK-NEXT: [[C:%.*]] = icmp eq i16 [[IV]], [[LEN]] 1116162f6e9SFlorian Hahn; CHECK-NEXT: br i1 [[C]], label [[EXIT]], label [[FOR_BODY:%.*]] 1126162f6e9SFlorian Hahn; CHECK: for.body: 1136162f6e9SFlorian Hahn; CHECK-NEXT: [[T_2:%.*]] = icmp ult i16 [[IV]], [[A]] 114e6a1657fSFlorian Hahn; CHECK-NEXT: [[AND:%.*]] = and i1 true, [[T_2]] 1156162f6e9SFlorian Hahn; CHECK-NEXT: br i1 [[AND]], label [[LOOP_LATCH]], label [[EXIT]] 1166162f6e9SFlorian Hahn; CHECK: loop.latch: 1176162f6e9SFlorian Hahn; CHECK-NEXT: call void @use(i16 [[IV]]) 1186162f6e9SFlorian Hahn; CHECK-NEXT: [[IV_NEXT]] = add nuw i16 [[IV]], 2 1196162f6e9SFlorian Hahn; CHECK-NEXT: br label [[LOOP_HEADER]] 1206162f6e9SFlorian Hahn; CHECK: exit: 1216162f6e9SFlorian Hahn; CHECK-NEXT: ret void 1226162f6e9SFlorian Hahn; 1236162f6e9SFlorian Hahnentry: 1246162f6e9SFlorian Hahn %len = zext i8 %len.n to i16 1256162f6e9SFlorian Hahn %len.lt = icmp ult i16 %len, %a 1266162f6e9SFlorian Hahn br i1 %len.lt, label %loop.ph, label %exit 1276162f6e9SFlorian Hahn 1286162f6e9SFlorian Hahnloop.ph: 1296162f6e9SFlorian Hahn br label %loop.header 1306162f6e9SFlorian Hahn 1316162f6e9SFlorian Hahnloop.header: 1326162f6e9SFlorian Hahn %iv = phi i16 [ 0, %loop.ph ], [ %iv.next, %loop.latch ] 1336162f6e9SFlorian Hahn %c = icmp eq i16 %iv, %len 1346162f6e9SFlorian Hahn br i1 %c, label %exit, label %for.body 1356162f6e9SFlorian Hahn 1366162f6e9SFlorian Hahnfor.body: 1376162f6e9SFlorian Hahn %t.1 = icmp uge i16 %iv, 0 1386162f6e9SFlorian Hahn %t.2 = icmp ult i16 %iv, %a 1396162f6e9SFlorian Hahn %and = and i1 %t.1, %t.2 1406162f6e9SFlorian Hahn br i1 %and, label %loop.latch, label %exit 1416162f6e9SFlorian Hahn 1426162f6e9SFlorian Hahnloop.latch: 1436162f6e9SFlorian Hahn call void @use(i16 %iv) 1446162f6e9SFlorian Hahn %iv.next = add nuw i16 %iv, 2 1456162f6e9SFlorian Hahn br label %loop.header 1466162f6e9SFlorian Hahn 1476162f6e9SFlorian Hahnexit: 1486162f6e9SFlorian Hahn ret void 1496162f6e9SFlorian Hahn} 1506162f6e9SFlorian Hahn 1516162f6e9SFlorian Hahndefine void @test_monotonic_ptr_iv_inc_2_eq_to_uge_variable_start(i16 %start, i8 %len.n, i16 %a) { 1526162f6e9SFlorian Hahn; CHECK-LABEL: @test_monotonic_ptr_iv_inc_2_eq_to_uge_variable_start( 1536162f6e9SFlorian Hahn; CHECK-NEXT: entry: 1546162f6e9SFlorian Hahn; CHECK-NEXT: [[LEN:%.*]] = zext i8 [[LEN_N:%.*]] to i16 1556162f6e9SFlorian Hahn; CHECK-NEXT: [[LEN_LT:%.*]] = icmp ult i16 [[LEN]], [[A:%.*]] 1566162f6e9SFlorian Hahn; CHECK-NEXT: [[START_LT:%.*]] = icmp ult i16 [[START:%.*]], [[LEN]] 1576162f6e9SFlorian Hahn; CHECK-NEXT: [[AND_0:%.*]] = and i1 [[LEN_LT]], [[START_LT]] 1586162f6e9SFlorian Hahn; CHECK-NEXT: br i1 [[AND_0]], label [[LOOP_PH:%.*]], label [[EXIT:%.*]] 1596162f6e9SFlorian Hahn; CHECK: loop.ph: 1606162f6e9SFlorian Hahn; CHECK-NEXT: br label [[LOOP_HEADER:%.*]] 1616162f6e9SFlorian Hahn; CHECK: loop.header: 1626162f6e9SFlorian Hahn; CHECK-NEXT: [[IV:%.*]] = phi i16 [ [[START]], [[LOOP_PH]] ], [ [[IV_NEXT:%.*]], [[LOOP_LATCH:%.*]] ] 1636162f6e9SFlorian Hahn; CHECK-NEXT: [[C:%.*]] = icmp eq i16 [[IV]], [[LEN]] 1646162f6e9SFlorian Hahn; CHECK-NEXT: br i1 [[C]], label [[EXIT]], label [[FOR_BODY:%.*]] 1656162f6e9SFlorian Hahn; CHECK: for.body: 1666162f6e9SFlorian Hahn; CHECK-NEXT: [[T_2:%.*]] = icmp ult i16 [[IV]], [[A]] 167*98e016d9SFlorian Hahn; CHECK-NEXT: [[AND:%.*]] = and i1 true, [[T_2]] 1686162f6e9SFlorian Hahn; CHECK-NEXT: br i1 [[AND]], label [[LOOP_LATCH]], label [[EXIT]] 1696162f6e9SFlorian Hahn; CHECK: loop.latch: 1706162f6e9SFlorian Hahn; CHECK-NEXT: call void @use(i16 [[IV]]) 1716162f6e9SFlorian Hahn; CHECK-NEXT: [[IV_NEXT]] = add nuw i16 [[IV]], 2 1726162f6e9SFlorian Hahn; CHECK-NEXT: br label [[LOOP_HEADER]] 1736162f6e9SFlorian Hahn; CHECK: exit: 1746162f6e9SFlorian Hahn; CHECK-NEXT: ret void 1756162f6e9SFlorian Hahn; 1766162f6e9SFlorian Hahnentry: 1776162f6e9SFlorian Hahn %len = zext i8 %len.n to i16 1786162f6e9SFlorian Hahn %len.lt = icmp ult i16 %len, %a 1796162f6e9SFlorian Hahn %start.lt = icmp ult i16 %start, %len 1806162f6e9SFlorian Hahn %and.0 = and i1 %len.lt, %start.lt 1816162f6e9SFlorian Hahn br i1 %and.0, label %loop.ph, label %exit 1826162f6e9SFlorian Hahn 1836162f6e9SFlorian Hahnloop.ph: 1846162f6e9SFlorian Hahn br label %loop.header 1856162f6e9SFlorian Hahn 1866162f6e9SFlorian Hahnloop.header: 1876162f6e9SFlorian Hahn %iv = phi i16 [ %start, %loop.ph ], [ %iv.next, %loop.latch ] 1886162f6e9SFlorian Hahn %c = icmp eq i16 %iv, %len 1896162f6e9SFlorian Hahn br i1 %c, label %exit, label %for.body 1906162f6e9SFlorian Hahn 1916162f6e9SFlorian Hahnfor.body: 1926162f6e9SFlorian Hahn %t.1 = icmp uge i16 %iv, 0 1936162f6e9SFlorian Hahn %t.2 = icmp ult i16 %iv, %a 1946162f6e9SFlorian Hahn %and = and i1 %t.1, %t.2 1956162f6e9SFlorian Hahn br i1 %and, label %loop.latch, label %exit 1966162f6e9SFlorian Hahn 1976162f6e9SFlorian Hahnloop.latch: 1986162f6e9SFlorian Hahn call void @use(i16 %iv) 1996162f6e9SFlorian Hahn %iv.next = add nuw i16 %iv, 2 2006162f6e9SFlorian Hahn br label %loop.header 2016162f6e9SFlorian Hahn 2026162f6e9SFlorian Hahnexit: 2036162f6e9SFlorian Hahn ret void 2046162f6e9SFlorian Hahn} 2056162f6e9SFlorian Hahn 2066162f6e9SFlorian Hahn 207