brintos

brintos / llvm-project-archived public Read only

0
0
Text · 9.0 KiB · 91546d4 Raw
219 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py2; RUN: opt -passes=constraint-elimination -S %s | FileCheck %s3 4declare void @use(i1)5 6define void @checks_in_loops_removable(ptr %ptr, ptr %lower, ptr %upper, i8 %n) {7; CHECK-LABEL: @checks_in_loops_removable(8; CHECK-NEXT:  entry:9; CHECK-NEXT:    [[CMP_PTR_LOWER:%.*]] = icmp ult ptr [[PTR:%.*]], [[LOWER:%.*]]10; CHECK-NEXT:    br i1 [[CMP_PTR_LOWER]], label [[TRAP:%.*]], label [[PRE_1:%.*]]11; CHECK:       pre.1:12; CHECK-NEXT:    [[IDX_EXT:%.*]] = zext i8 [[N:%.*]] to i1613; CHECK-NEXT:    [[PTR_N:%.*]] = getelementptr inbounds i8, ptr [[PTR]], i16 [[IDX_EXT]]14; CHECK-NEXT:    [[CMP_PTR_N_UPPER:%.*]] = icmp ult ptr [[PTR_N]], [[UPPER:%.*]]15; CHECK-NEXT:    br i1 [[CMP_PTR_N_UPPER]], label [[PRE_2:%.*]], label [[TRAP]]16; CHECK:       pre.2:17; CHECK-NEXT:    [[CMP_N_NOT_ZERO:%.*]] = icmp eq i8 [[N]], 018; CHECK-NEXT:    br i1 [[CMP_N_NOT_ZERO]], label [[EXIT:%.*]], label [[LOOP_HEADER:%.*]]19; CHECK:       trap:20; CHECK-NEXT:    ret void21; CHECK:       loop.header:22; CHECK-NEXT:    [[IV:%.*]] = phi i16 [ 0, [[PRE_2]] ], [ [[IV_NEXT:%.*]], [[LOOP_LATCH:%.*]] ]23; CHECK-NEXT:    [[PTR_IV:%.*]] = getelementptr inbounds i8, ptr [[PTR]], i16 [[IV]]24; CHECK-NEXT:    [[CMP_PTR_IV_LOWER:%.*]] = icmp ugt ptr [[LOWER]], [[PTR_IV]]25; CHECK-NEXT:    [[CMP_PTR_IV_UPPER:%.*]] = icmp ule ptr [[UPPER]], [[PTR_IV]]26; CHECK-NEXT:    br i1 [[CMP_PTR_IV_UPPER]], label [[TRAP]], label [[LOOP_LATCH]]27; CHECK:       loop.latch:28; CHECK-NEXT:    store i8 0, ptr [[PTR_IV]], align 429; CHECK-NEXT:    [[IV_NEXT]] = add nuw nsw i16 [[IV]], 130; CHECK-NEXT:    [[EXITCOND:%.*]] = icmp ne i16 [[IV_NEXT]], [[IDX_EXT]]31; CHECK-NEXT:    br i1 [[EXITCOND]], label [[LOOP_HEADER]], label [[EXIT]]32; CHECK:       exit:33; CHECK-NEXT:    ret void34;35entry:36  %cmp.ptr.lower = icmp ult ptr %ptr, %lower37  br i1 %cmp.ptr.lower, label %trap, label %pre.138 39pre.1:40  %idx.ext = zext i8 %n to i1641  %ptr.n = getelementptr inbounds i8, ptr %ptr, i16 %idx.ext42  %cmp.ptr.n.upper = icmp ult ptr %ptr.n, %upper43  br i1 %cmp.ptr.n.upper, label %pre.2, label %trap44 45pre.2:46  %cmp.n.not.zero = icmp eq i8 %n, 047  br i1 %cmp.n.not.zero, label %exit, label %loop.header48 49trap:50  ret void51 52loop.header:53  %iv = phi i16 [ 0, %pre.2 ], [ %iv.next, %loop.latch ]54  %ptr.iv = getelementptr inbounds i8, ptr %ptr, i16 %iv55  %cmp.ptr.iv.lower = icmp ugt ptr %lower, %ptr.iv56  %cmp.ptr.iv.upper = icmp ule ptr %upper, %ptr.iv57  %or = or i1 %cmp.ptr.iv.lower, %cmp.ptr.iv.upper58  br i1 %or, label %trap, label %loop.latch59 60loop.latch:61  store i8 0, ptr %ptr.iv, align 462  %iv.next = add nuw nsw i16 %iv, 163  %exitcond = icmp ne i16 %iv.next, %idx.ext64  br i1 %exitcond, label %loop.header, label %exit65 66exit:67  ret void68}69 70define void @some_checks_in_loops_removable(ptr %ptr, ptr %lower, ptr %upper, i8 %n) {71; CHECK-LABEL: @some_checks_in_loops_removable(72; CHECK-NEXT:  entry:73; CHECK-NEXT:    [[CMP_PTR_LOWER:%.*]] = icmp ult ptr [[PTR:%.*]], [[LOWER:%.*]]74; CHECK-NEXT:    br i1 [[CMP_PTR_LOWER]], label [[TRAP:%.*]], label [[PRE_1:%.*]]75; CHECK:       pre.1:76; CHECK-NEXT:    [[IDX_EXT:%.*]] = zext i8 [[N:%.*]] to i1677; CHECK-NEXT:    [[PTR_N:%.*]] = getelementptr inbounds i8, ptr [[PTR]], i16 [[IDX_EXT]]78; CHECK-NEXT:    [[CMP_PTR_N_UPPER:%.*]] = icmp ult ptr [[PTR_N]], [[UPPER:%.*]]79; CHECK-NEXT:    br i1 [[CMP_PTR_N_UPPER]], label [[PRE_2:%.*]], label [[TRAP]]80; CHECK:       pre.2:81; CHECK-NEXT:    [[CMP_N_NOT_ZERO:%.*]] = icmp eq i8 [[N]], 082; CHECK-NEXT:    br i1 [[CMP_N_NOT_ZERO]], label [[EXIT:%.*]], label [[LOOP_HEADER:%.*]]83; CHECK:       trap:84; CHECK-NEXT:    ret void85; CHECK:       loop.header:86; CHECK-NEXT:    [[IV:%.*]] = phi i16 [ 0, [[PRE_2]] ], [ [[IV_NEXT:%.*]], [[LOOP_LATCH:%.*]] ]87; CHECK-NEXT:    [[PTR_IV:%.*]] = getelementptr inbounds i8, ptr [[PTR]], i16 [[IV]]88; CHECK-NEXT:    [[CMP_PTR_IV_LOWER:%.*]] = icmp ugt ptr [[LOWER]], [[PTR_IV]]89; CHECK-NEXT:    [[CMP_PTR_IV_UPPER:%.*]] = icmp ule ptr [[UPPER]], [[PTR_IV]]90; CHECK-NEXT:    br i1 [[CMP_PTR_IV_UPPER]], label [[TRAP]], label [[LOOP_BODY:%.*]]91; CHECK:       loop.body:92; CHECK-NEXT:    [[IV_1:%.*]] = add nuw nsw i16 [[IV]], 193; CHECK-NEXT:    [[PTR_IV_1:%.*]] = getelementptr inbounds i8, ptr [[PTR]], i16 [[IV_1]]94; CHECK-NEXT:    [[CMP_PTR_IV_1_UPPER:%.*]] = icmp ule ptr [[UPPER]], [[PTR_IV_1]]95; CHECK-NEXT:    [[OR_1:%.*]] = or i1 false, [[CMP_PTR_IV_1_UPPER]]96; CHECK-NEXT:    br i1 [[CMP_PTR_IV_UPPER]], label [[TRAP]], label [[LOOP_LATCH]]97; CHECK:       loop.latch:98; CHECK-NEXT:    store i8 0, ptr [[PTR_IV]], align 499; CHECK-NEXT:    [[IV_NEXT]] = add nuw nsw i16 [[IV]], 1100; CHECK-NEXT:    [[EXITCOND:%.*]] = icmp ne i16 [[IV_NEXT]], [[IDX_EXT]]101; CHECK-NEXT:    br i1 [[EXITCOND]], label [[LOOP_HEADER]], label [[EXIT]]102; CHECK:       exit:103; CHECK-NEXT:    ret void104;105entry:106  %cmp.ptr.lower = icmp ult ptr %ptr, %lower107  br i1 %cmp.ptr.lower, label %trap, label %pre.1108 109pre.1:110  %idx.ext = zext i8 %n to i16111  %ptr.n = getelementptr inbounds i8, ptr %ptr, i16 %idx.ext112  %cmp.ptr.n.upper = icmp ult ptr %ptr.n, %upper113  br i1 %cmp.ptr.n.upper, label %pre.2, label %trap114 115pre.2:116  %cmp.n.not.zero = icmp eq i8 %n, 0117  br i1 %cmp.n.not.zero, label %exit, label %loop.header118 119trap:120  ret void121 122loop.header:123  %iv = phi i16 [ 0, %pre.2 ], [ %iv.next, %loop.latch ]124  %ptr.iv = getelementptr inbounds i8, ptr %ptr, i16 %iv125  %cmp.ptr.iv.lower = icmp ugt ptr %lower, %ptr.iv126  %cmp.ptr.iv.upper = icmp ule ptr %upper, %ptr.iv127  %or = or i1 %cmp.ptr.iv.lower, %cmp.ptr.iv.upper128  br i1 %or, label %trap, label %loop.body129 130loop.body:131  %iv.1 = add nuw nsw i16 %iv, 1132  %ptr.iv.1 = getelementptr inbounds i8, ptr %ptr, i16 %iv.1133  %cmp.ptr.iv.1.lower = icmp ugt ptr %lower, %ptr.iv.1134  %cmp.ptr.iv.1.upper = icmp ule ptr %upper, %ptr.iv.1135  %or.1 = or i1 %cmp.ptr.iv.1.lower, %cmp.ptr.iv.1.upper136  br i1 %or, label %trap, label %loop.latch137 138loop.latch:139  store i8 0, ptr %ptr.iv, align 4140  %iv.next = add nuw nsw i16 %iv, 1141  %exitcond = icmp ne i16 %iv.next, %idx.ext142  br i1 %exitcond, label %loop.header, label %exit143 144exit:145  ret void146}147 148; N might be zero, cannot remove upper checks.149define void @no_checks_in_loops_removable(ptr %ptr, ptr %lower, ptr %upper, i8 %n) {150; CHECK-LABEL: @no_checks_in_loops_removable(151; CHECK-NEXT:  entry:152; CHECK-NEXT:    [[CMP_PTR_LOWER:%.*]] = icmp ult ptr [[PTR:%.*]], [[LOWER:%.*]]153; CHECK-NEXT:    br i1 [[CMP_PTR_LOWER]], label [[TRAP:%.*]], label [[PRE_1:%.*]]154; CHECK:       pre.1:155; CHECK-NEXT:    [[IDX_EXT:%.*]] = zext i8 [[N:%.*]] to i16156; CHECK-NEXT:    [[PTR_N:%.*]] = getelementptr inbounds i8, ptr [[PTR]], i16 [[IDX_EXT]]157; CHECK-NEXT:    [[CMP_PTR_N_UPPER:%.*]] = icmp ult ptr [[PTR_N]], [[UPPER:%.*]]158; CHECK-NEXT:    br i1 [[CMP_PTR_N_UPPER]], label [[LOOP_HEADER:%.*]], label [[TRAP]]159; CHECK:       trap:160; CHECK-NEXT:    ret void161; CHECK:       loop.header:162; CHECK-NEXT:    [[IV:%.*]] = phi i16 [ 0, [[PRE_1]] ], [ [[IV_NEXT:%.*]], [[LOOP_LATCH:%.*]] ]163; CHECK-NEXT:    [[PTR_IV:%.*]] = getelementptr inbounds i8, ptr [[PTR]], i16 [[IV]]164; CHECK-NEXT:    [[CMP_PTR_IV_LOWER:%.*]] = icmp ugt ptr [[LOWER]], [[PTR_IV]]165; CHECK-NEXT:    [[CMP_PTR_IV_UPPER:%.*]] = icmp ule ptr [[UPPER]], [[PTR_IV]]166; CHECK-NEXT:    br i1 [[CMP_PTR_IV_UPPER]], label [[TRAP]], label [[LOOP_BODY:%.*]]167; CHECK:       loop.body:168; CHECK-NEXT:    [[IV_1:%.*]] = add nuw nsw i16 [[IV]], 1169; CHECK-NEXT:    [[PTR_IV_1:%.*]] = getelementptr inbounds i8, ptr [[PTR]], i16 [[IV_1]]170; CHECK-NEXT:    [[CMP_PTR_IV_1_UPPER:%.*]] = icmp ule ptr [[UPPER]], [[PTR_IV_1]]171; CHECK-NEXT:    [[OR_1:%.*]] = or i1 false, [[CMP_PTR_IV_1_UPPER]]172; CHECK-NEXT:    br i1 [[CMP_PTR_IV_UPPER]], label [[TRAP]], label [[LOOP_LATCH]]173; CHECK:       loop.latch:174; CHECK-NEXT:    store i8 0, ptr [[PTR_IV]], align 4175; CHECK-NEXT:    [[IV_NEXT]] = add nuw nsw i16 [[IV]], 1176; CHECK-NEXT:    [[EXITCOND:%.*]] = icmp ne i16 [[IV_NEXT]], [[IDX_EXT]]177; CHECK-NEXT:    br i1 [[EXITCOND]], label [[LOOP_HEADER]], label [[EXIT:%.*]]178; CHECK:       exit:179; CHECK-NEXT:    ret void180;181entry:182  %cmp.ptr.lower = icmp ult ptr %ptr, %lower183  br i1 %cmp.ptr.lower, label %trap, label %pre.1184 185pre.1:186  %idx.ext = zext i8 %n to i16187  %ptr.n = getelementptr inbounds i8, ptr %ptr, i16 %idx.ext188  %cmp.ptr.n.upper = icmp ult ptr %ptr.n, %upper189  br i1 %cmp.ptr.n.upper, label %loop.header, label %trap190 191trap:192  ret void193 194loop.header:195  %iv = phi i16 [ 0, %pre.1 ], [ %iv.next, %loop.latch ]196  %ptr.iv = getelementptr inbounds i8, ptr %ptr, i16 %iv197  %cmp.ptr.iv.lower = icmp ugt ptr %lower, %ptr.iv198  %cmp.ptr.iv.upper = icmp ule ptr %upper, %ptr.iv199  %or = or i1 %cmp.ptr.iv.lower, %cmp.ptr.iv.upper200  br i1 %or, label %trap, label %loop.body201 202loop.body:203  %iv.1 = add nuw nsw i16 %iv, 1204  %ptr.iv.1 = getelementptr inbounds i8, ptr %ptr, i16 %iv.1205  %cmp.ptr.iv.1.lower = icmp ugt ptr %lower, %ptr.iv.1206  %cmp.ptr.iv.1.upper = icmp ule ptr %upper, %ptr.iv.1207  %or.1 = or i1 %cmp.ptr.iv.1.lower, %cmp.ptr.iv.1.upper208  br i1 %or, label %trap, label %loop.latch209 210loop.latch:211  store i8 0, ptr %ptr.iv, align 4212  %iv.next = add nuw nsw i16 %iv, 1213  %exitcond = icmp ne i16 %iv.next, %idx.ext214  br i1 %exitcond, label %loop.header, label %exit215 216exit:217  ret void218}219