207 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; RUN: opt -passes=constraint-elimination -S %s | FileCheck %s3 4target datalayout = "e-m:o-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128"5 6 7declare void @use(i16)8declare void @llvm.assume(i1)9 10define void @test_monotonic_ptr_iv_inc_1_eq_to_uge(i8 %len.n, i16 %a) {11; CHECK-LABEL: @test_monotonic_ptr_iv_inc_1_eq_to_uge(12; CHECK-NEXT: entry:13; CHECK-NEXT: [[LEN:%.*]] = zext i8 [[LEN_N:%.*]] to i1614; CHECK-NEXT: [[LEN_NEG:%.*]] = icmp uge i16 [[LEN]], [[A:%.*]]15; CHECK-NEXT: br i1 [[LEN_NEG]], label [[EXIT:%.*]], label [[LOOP_PH:%.*]]16; CHECK: loop.ph:17; CHECK-NEXT: br label [[LOOP_HEADER:%.*]]18; CHECK: loop.header:19; CHECK-NEXT: [[IV:%.*]] = phi i16 [ 0, [[LOOP_PH]] ], [ [[IV_NEXT:%.*]], [[LOOP_LATCH:%.*]] ]20; CHECK-NEXT: [[C:%.*]] = icmp eq i16 [[IV]], [[LEN]]21; CHECK-NEXT: br i1 [[C]], label [[EXIT]], label [[FOR_BODY:%.*]]22; CHECK: for.body:23; CHECK-NEXT: [[AND:%.*]] = and i1 true, true24; CHECK-NEXT: br i1 [[AND]], label [[LOOP_LATCH]], label [[EXIT]]25; CHECK: loop.latch:26; CHECK-NEXT: call void @use(i16 [[IV]])27; CHECK-NEXT: [[IV_NEXT]] = add nuw nsw i16 [[IV]], 128; CHECK-NEXT: br label [[LOOP_HEADER]]29; CHECK: exit:30; CHECK-NEXT: ret void31;32entry:33 %len = zext i8 %len.n to i1634 %len.neg = icmp uge i16 %len, %a35 br i1 %len.neg, label %exit, label %loop.ph36 37loop.ph:38 br label %loop.header39 40loop.header:41 %iv = phi i16 [ 0, %loop.ph ], [ %iv.next, %loop.latch ]42 %c = icmp eq i16 %iv, %len43 br i1 %c, label %exit, label %for.body44 45for.body:46 %t.1 = icmp uge i16 %iv, 047 %t.2 = icmp ult i16 %iv, %a48 %and = and i1 %t.1, %t.249 br i1 %and, label %loop.latch, label %exit50 51loop.latch:52 call void @use(i16 %iv)53 %iv.next = add nuw nsw i16 %iv, 154 br label %loop.header55 56exit:57 ret void58}59 60define void @test_remove_check_with_incrementing_integer_induction(i8 %len.n, i16 %a) {61; CHECK-LABEL: @test_remove_check_with_incrementing_integer_induction(62; CHECK-NEXT: entry:63; CHECK-NEXT: [[LEN:%.*]] = zext i8 [[LEN_N:%.*]] to i1664; CHECK-NEXT: [[LEN_NEG_NOT:%.*]] = icmp ult i16 [[LEN]], [[A:%.*]]65; CHECK-NEXT: br i1 [[LEN_NEG_NOT]], label [[LOOP_HEADER:%.*]], label [[EXIT:%.*]]66; CHECK: loop.header:67; CHECK-NEXT: [[IV:%.*]] = phi i16 [ [[IV_NEXT:%.*]], [[LOOP_LATCH:%.*]] ], [ 0, [[ENTRY:%.*]] ]68; CHECK-NEXT: [[C:%.*]] = icmp ne i16 [[IV]], [[LEN]]69; CHECK-NEXT: [[T_2:%.*]] = icmp ult i16 [[IV]], [[A]]70; CHECK-NEXT: [[OR_COND:%.*]] = and i1 [[C]], [[T_2]]71; CHECK-NEXT: br i1 [[OR_COND]], label [[LOOP_LATCH]], label [[EXIT]]72; CHECK: loop.latch:73; CHECK-NEXT: call void @use(i16 [[IV]])74; CHECK-NEXT: [[IV_NEXT]] = add nuw nsw i16 [[IV]], 175; CHECK-NEXT: br label [[LOOP_HEADER]]76; CHECK: exit:77; CHECK-NEXT: ret void78;79entry:80 %len = zext i8 %len.n to i1681 %len.neg.not = icmp ult i16 %len, %a82 br i1 %len.neg.not, label %loop.header, label %exit83 84loop.header: ; preds = %entry, %loop.latch85 %iv = phi i16 [ %iv.next, %loop.latch ], [ 0, %entry ]86 %c = icmp ne i16 %iv, %len87 %t.2 = icmp ult i16 %iv, %a88 %or.cond = and i1 %c, %t.289 br i1 %or.cond, label %loop.latch, label %exit90 91loop.latch: ; preds = %loop.header92 call void @use(i16 %iv)93 %iv.next = add nuw nsw i16 %iv, 194 br label %loop.header95 96exit: ; preds = %loop.header, %entry97 ret void98}99 100define void @test_monotonic_ptr_iv_inc_2_eq_to_uge(i8 %len.n, i16 %a) {101; CHECK-LABEL: @test_monotonic_ptr_iv_inc_2_eq_to_uge(102; CHECK-NEXT: entry:103; CHECK-NEXT: [[LEN:%.*]] = zext i8 [[LEN_N:%.*]] to i16104; CHECK-NEXT: [[LEN_LT:%.*]] = icmp ult i16 [[LEN]], [[A:%.*]]105; CHECK-NEXT: br i1 [[LEN_LT]], label [[LOOP_PH:%.*]], label [[EXIT:%.*]]106; CHECK: loop.ph:107; CHECK-NEXT: br label [[LOOP_HEADER:%.*]]108; CHECK: loop.header:109; CHECK-NEXT: [[IV:%.*]] = phi i16 [ 0, [[LOOP_PH]] ], [ [[IV_NEXT:%.*]], [[LOOP_LATCH:%.*]] ]110; CHECK-NEXT: [[C:%.*]] = icmp eq i16 [[IV]], [[LEN]]111; CHECK-NEXT: br i1 [[C]], label [[EXIT]], label [[FOR_BODY:%.*]]112; CHECK: for.body:113; CHECK-NEXT: [[T_2:%.*]] = icmp ult i16 [[IV]], [[A]]114; CHECK-NEXT: [[AND:%.*]] = and i1 true, [[T_2]]115; CHECK-NEXT: br i1 [[AND]], label [[LOOP_LATCH]], label [[EXIT]]116; CHECK: loop.latch:117; CHECK-NEXT: call void @use(i16 [[IV]])118; CHECK-NEXT: [[IV_NEXT]] = add nuw i16 [[IV]], 2119; CHECK-NEXT: br label [[LOOP_HEADER]]120; CHECK: exit:121; CHECK-NEXT: ret void122;123entry:124 %len = zext i8 %len.n to i16125 %len.lt = icmp ult i16 %len, %a126 br i1 %len.lt, label %loop.ph, label %exit127 128loop.ph:129 br label %loop.header130 131loop.header:132 %iv = phi i16 [ 0, %loop.ph ], [ %iv.next, %loop.latch ]133 %c = icmp eq i16 %iv, %len134 br i1 %c, label %exit, label %for.body135 136for.body:137 %t.1 = icmp uge i16 %iv, 0138 %t.2 = icmp ult i16 %iv, %a139 %and = and i1 %t.1, %t.2140 br i1 %and, label %loop.latch, label %exit141 142loop.latch:143 call void @use(i16 %iv)144 %iv.next = add nuw i16 %iv, 2145 br label %loop.header146 147exit:148 ret void149}150 151define void @test_monotonic_ptr_iv_inc_2_eq_to_uge_variable_start(i16 %start, i8 %len.n, i16 %a) {152; CHECK-LABEL: @test_monotonic_ptr_iv_inc_2_eq_to_uge_variable_start(153; CHECK-NEXT: entry:154; CHECK-NEXT: [[LEN:%.*]] = zext i8 [[LEN_N:%.*]] to i16155; CHECK-NEXT: [[LEN_LT:%.*]] = icmp ult i16 [[LEN]], [[A:%.*]]156; CHECK-NEXT: [[START_LT:%.*]] = icmp ult i16 [[START:%.*]], [[LEN]]157; CHECK-NEXT: [[AND_0:%.*]] = and i1 [[LEN_LT]], [[START_LT]]158; CHECK-NEXT: br i1 [[AND_0]], label [[LOOP_PH:%.*]], label [[EXIT:%.*]]159; CHECK: loop.ph:160; CHECK-NEXT: br label [[LOOP_HEADER:%.*]]161; CHECK: loop.header:162; CHECK-NEXT: [[IV:%.*]] = phi i16 [ [[START]], [[LOOP_PH]] ], [ [[IV_NEXT:%.*]], [[LOOP_LATCH:%.*]] ]163; CHECK-NEXT: [[C:%.*]] = icmp eq i16 [[IV]], [[LEN]]164; CHECK-NEXT: br i1 [[C]], label [[EXIT]], label [[FOR_BODY:%.*]]165; CHECK: for.body:166; CHECK-NEXT: [[T_2:%.*]] = icmp ult i16 [[IV]], [[A]]167; CHECK-NEXT: [[AND:%.*]] = and i1 true, [[T_2]]168; CHECK-NEXT: br i1 [[AND]], label [[LOOP_LATCH]], label [[EXIT]]169; CHECK: loop.latch:170; CHECK-NEXT: call void @use(i16 [[IV]])171; CHECK-NEXT: [[IV_NEXT]] = add nuw i16 [[IV]], 2172; CHECK-NEXT: br label [[LOOP_HEADER]]173; CHECK: exit:174; CHECK-NEXT: ret void175;176entry:177 %len = zext i8 %len.n to i16178 %len.lt = icmp ult i16 %len, %a179 %start.lt = icmp ult i16 %start, %len180 %and.0 = and i1 %len.lt, %start.lt181 br i1 %and.0, label %loop.ph, label %exit182 183loop.ph:184 br label %loop.header185 186loop.header:187 %iv = phi i16 [ %start, %loop.ph ], [ %iv.next, %loop.latch ]188 %c = icmp eq i16 %iv, %len189 br i1 %c, label %exit, label %for.body190 191for.body:192 %t.1 = icmp uge i16 %iv, 0193 %t.2 = icmp ult i16 %iv, %a194 %and = and i1 %t.1, %t.2195 br i1 %and, label %loop.latch, label %exit196 197loop.latch:198 call void @use(i16 %iv)199 %iv.next = add nuw i16 %iv, 2200 br label %loop.header201 202exit:203 ret void204}205 206 207