120 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 @loop_pointer_iv(ptr %start, ptr %end, ptr %upper) {7; CHECK-LABEL: @loop_pointer_iv(8; CHECK-NEXT: entry:9; CHECK-NEXT: [[END_LT_UPPER:%.*]] = icmp ult ptr [[END:%.*]], [[UPPER:%.*]]10; CHECK-NEXT: br i1 [[END_LT_UPPER]], label [[LOOP_HEADER:%.*]], label [[EXIT:%.*]]11; CHECK: loop.header:12; CHECK-NEXT: [[IV:%.*]] = phi ptr [ [[START:%.*]], [[ENTRY:%.*]] ], [ [[IV_NEXT:%.*]], [[LOOP_LATCH:%.*]] ]13; CHECK-NEXT: [[C_2:%.*]] = icmp ule ptr [[IV]], [[END]]14; CHECK-NEXT: call void @use(i1 [[C_2]])15; CHECK-NEXT: [[T_2:%.*]] = icmp uge ptr [[IV]], [[START]]16; CHECK-NEXT: call void @use(i1 [[T_2]])17; CHECK-NEXT: [[C_1:%.*]] = icmp ule ptr [[IV]], [[END]]18; CHECK-NEXT: br i1 [[C_1]], label [[LOOP_LATCH]], label [[EXIT]]19; CHECK: loop.latch:20; CHECK-NEXT: call void @use(i1 true)21; CHECK-NEXT: [[IV_NEXT]] = getelementptr inbounds i8, ptr [[IV]], i8 122; CHECK-NEXT: br label [[LOOP_HEADER]]23; CHECK: exit:24; CHECK-NEXT: ret void25;26entry:27 %end.lt.upper = icmp ult ptr %end, %upper28 br i1 %end.lt.upper, label %loop.header, label %exit29 30loop.header:31 %iv = phi ptr [ %start, %entry ], [ %iv.next, %loop.latch ]32 %c.2 = icmp ule ptr %iv, %end33 call void @use(i1 %c.2)34 %t.2 = icmp uge ptr %iv, %start35 call void @use(i1 %t.2)36 %c.1 = icmp ule ptr %iv, %end37 br i1 %c.1, label %loop.latch, label %exit38 39loop.latch:40 %t.1 = icmp ult ptr %iv, %upper41 call void @use(i1 %t.1)42 %iv.next = getelementptr inbounds i8, ptr %iv, i8 143 br label %loop.header44 45exit:46 ret void47}48 49define void @loop_pointer_iv_null_start(ptr %end, ptr %upper) {50; CHECK-LABEL: @loop_pointer_iv_null_start(51; CHECK-NEXT: entry:52; CHECK-NEXT: [[END_LT_UPPER:%.*]] = icmp ult ptr [[END:%.*]], [[UPPER:%.*]]53; CHECK-NEXT: br i1 [[END_LT_UPPER]], label [[LOOP_HEADER:%.*]], label [[EXIT:%.*]]54; CHECK: loop.header:55; CHECK-NEXT: [[IV:%.*]] = phi ptr [ null, [[ENTRY:%.*]] ], [ [[IV_NEXT:%.*]], [[LOOP_LATCH:%.*]] ]56; CHECK-NEXT: [[C_1:%.*]] = icmp ule ptr [[IV]], [[END]]57; CHECK-NEXT: call void @use(i1 [[C_1]])58; CHECK-NEXT: call void @use(i1 true)59; CHECK-NEXT: [[C_3:%.*]] = icmp ule ptr [[IV]], [[END]]60; CHECK-NEXT: br i1 [[C_3]], label [[LOOP_LATCH]], label [[EXIT]]61; CHECK: loop.latch:62; CHECK-NEXT: call void @use(i1 true)63; CHECK-NEXT: [[IV_NEXT]] = getelementptr inbounds i8, ptr [[IV]], i8 164; CHECK-NEXT: br label [[LOOP_HEADER]]65; CHECK: exit:66; CHECK-NEXT: ret void67;68entry:69 %end.lt.upper = icmp ult ptr %end, %upper70 br i1 %end.lt.upper, label %loop.header, label %exit71 72loop.header:73 %iv = phi ptr [ null, %entry ], [ %iv.next, %loop.latch ]74 %c.1 = icmp ule ptr %iv, %end75 call void @use(i1 %c.1)76 %c.2 = icmp uge ptr %iv, null77 call void @use(i1 %c.2)78 %c.3 = icmp ule ptr %iv, %end79 br i1 %c.3, label %loop.latch, label %exit80 81loop.latch:82 %c.4 = icmp ult ptr %iv, %upper83 call void @use(i1 %c.4)84 %iv.next = getelementptr inbounds i8, ptr %iv, i8 185 br label %loop.header86 87exit:88 ret void89}90 91define void @test_start_null_cmp_null(ptr %start) {92; CHECK-LABEL: @test_start_null_cmp_null(93; CHECK-NEXT: entry:94; CHECK-NEXT: br label [[LOOP_HEADER:%.*]]95; CHECK: loop.header:96; CHECK-NEXT: [[IV:%.*]] = phi ptr [ null, [[ENTRY:%.*]] ], [ [[IV_NEXT:%.*]], [[LOOP_LATCH:%.*]] ]97; CHECK-NEXT: [[CMP_I_I122:%.*]] = icmp eq ptr [[IV]], null98; CHECK-NEXT: br i1 [[CMP_I_I122]], label [[LOOP_LATCH]], label [[EXIT:%.*]]99; CHECK: loop.latch:100; CHECK-NEXT: [[IV_NEXT]] = getelementptr inbounds i8, ptr [[IV]], i64 1101; CHECK-NEXT: br label [[LOOP_HEADER]]102; CHECK: exit:103; CHECK-NEXT: ret void104;105entry:106 br label %loop.header107 108loop.header:109 %iv = phi ptr [ null, %entry ], [ %iv.next, %loop.latch ]110 %cmp.i.i122 = icmp eq ptr %iv, null111 br i1 %cmp.i.i122, label %loop.latch, label %exit112 113loop.latch:114 %iv.next = getelementptr inbounds i8, ptr %iv, i64 1115 br label %loop.header116 117exit:118 ret void119}120