brintos

brintos / llvm-project-archived public Read only

0
0
Text · 6.9 KiB · 8adc886 Raw
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