152 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_analyze_test_checks.py2; RUN: opt < %s -disable-output -scalar-evolution-use-expensive-range-sharpening -passes='print<scalar-evolution>' 2>&1 | FileCheck %s3 4define i32 @test_01(i32 %start, ptr %p, ptr %q) {5; CHECK-LABEL: 'test_01'6; CHECK-NEXT: Classifying expressions for: @test_017; CHECK-NEXT: %0 = zext i32 %start to i648; CHECK-NEXT: --> (zext i32 %start to i64) U: [0,4294967296) S: [0,4294967296)9; CHECK-NEXT: %indvars.iv = phi i64 [ %indvars.iv.next, %backedge ], [ %0, %entry ]10; CHECK-NEXT: --> {(zext i32 %start to i64),+,-1}<nsw><%loop> U: [0,4294967296) S: [0,4294967296) Exits: <<Unknown>> LoopDispositions: { %loop: Computable }11; CHECK-NEXT: %iv = phi i32 [ %start, %entry ], [ %iv.next, %backedge ]12; CHECK-NEXT: --> {%start,+,-1}<%loop> U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Computable }13; CHECK-NEXT: %iv.next = add i32 %iv, -114; CHECK-NEXT: --> {(-1 + %start),+,-1}<%loop> U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Computable }15; CHECK-NEXT: %index = zext i32 %iv.next to i6416; CHECK-NEXT: --> (zext i32 {(-1 + %start),+,-1}<%loop> to i64) U: [0,4294967296) S: [0,4294967296) Exits: <<Unknown>> LoopDispositions: { %loop: Computable }17; CHECK-NEXT: %store.addr = getelementptr i32, ptr %p, i64 %index18; CHECK-NEXT: --> ((4 * (zext i32 {(-1 + %start),+,-1}<%loop> to i64))<nuw><nsw> + %p) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Computable }19; CHECK-NEXT: %load.addr = getelementptr i32, ptr %q, i64 %index20; CHECK-NEXT: --> ((4 * (zext i32 {(-1 + %start),+,-1}<%loop> to i64))<nuw><nsw> + %q) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Computable }21; CHECK-NEXT: %stop = load i32, ptr %load.addr, align 422; CHECK-NEXT: --> %stop U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }23; CHECK-NEXT: %indvars.iv.next = add nsw i64 %indvars.iv, -124; CHECK-NEXT: --> {(-1 + (zext i32 %start to i64))<nsw>,+,-1}<nsw><%loop> U: [-4294967296,4294967295) S: [-1,4294967295) Exits: <<Unknown>> LoopDispositions: { %loop: Computable }25; CHECK-NEXT: Determining loop execution counts for: @test_0126; CHECK-NEXT: Loop %loop: <multiple exits> Unpredictable backedge-taken count.27; CHECK-NEXT: exit count for loop: (zext i32 %start to i64)28; CHECK-NEXT: exit count for backedge: ***COULDNOTCOMPUTE***29; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i64 429496729530; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is (zext i32 %start to i64)31; CHECK-NEXT: symbolic max exit count for loop: (zext i32 %start to i64)32; CHECK-NEXT: symbolic max exit count for backedge: ***COULDNOTCOMPUTE***33;34entry:35 %0 = zext i32 %start to i6436 br label %loop37 38loop: ; preds = %backedge, %entry39 %indvars.iv = phi i64 [ %indvars.iv.next, %backedge ], [ %0, %entry ]40 %iv = phi i32 [ %start, %entry ], [ %iv.next, %backedge ]41 %cond = icmp eq i64 %indvars.iv, 042 br i1 %cond, label %exit, label %backedge43 44backedge: ; preds = %loop45 %iv.next = add i32 %iv, -146 %index = zext i32 %iv.next to i6447 %store.addr = getelementptr i32, ptr %p, i64 %index48 store i32 1, ptr %store.addr, align 449 %load.addr = getelementptr i32, ptr %q, i64 %index50 %stop = load i32, ptr %load.addr, align 451 %loop.cond = icmp eq i32 %stop, 052 %indvars.iv.next = add nsw i64 %indvars.iv, -153 br i1 %loop.cond, label %loop, label %failure54 55exit: ; preds = %loop56 ret i32 057 58failure: ; preds = %backedge59 unreachable60}61 62; Check that we do not mess up with wrapping ranges.63define i32 @test_02(i32 %start, ptr %p, ptr %q) {64; CHECK-LABEL: 'test_02'65; CHECK-NEXT: Classifying expressions for: @test_0266; CHECK-NEXT: %zext = zext i32 %start to i6467; CHECK-NEXT: --> (zext i32 %start to i64) U: [0,4294967296) S: [0,4294967296)68; CHECK-NEXT: %shl = shl i64 %zext, 3169; CHECK-NEXT: --> (2147483648 * (zext i32 %start to i64))<nuw><nsw> U: [0,9223372034707292161) S: [0,9223372034707292161)70; CHECK-NEXT: %indvars.iv = phi i64 [ %indvars.iv.next, %loop ], [ %shl, %entry ]71; CHECK-NEXT: --> {(2147483648 * (zext i32 %start to i64))<nuw><nsw>,+,-1}<nsw><%loop> U: [-9223372036854775808,9223372034707292161) S: [-9223372036854775808,9223372034707292161) Exits: -9223372036854775806 LoopDispositions: { %loop: Computable }72; CHECK-NEXT: %indvars.iv.next = add nsw i64 %indvars.iv, -173; CHECK-NEXT: --> {(-1 + (2147483648 * (zext i32 %start to i64))<nuw><nsw>)<nsw>,+,-1}<nw><%loop> U: full-set S: full-set Exits: -9223372036854775807 LoopDispositions: { %loop: Computable }74; CHECK-NEXT: Determining loop execution counts for: @test_0275; CHECK-NEXT: Loop %loop: backedge-taken count is (9223372036854775806 + (2147483648 * (zext i32 %start to i64))<nuw><nsw>)<nuw>76; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i64 -214748365077; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is (9223372036854775806 + (2147483648 * (zext i32 %start to i64))<nuw><nsw>)<nuw>78; CHECK-NEXT: Loop %loop: Trip multiple is 179;80entry:81 %zext = zext i32 %start to i6482 %shl = shl i64 %zext, 3183 br label %loop84 85loop: ; preds = %backedge, %entry86 %indvars.iv = phi i64 [ %indvars.iv.next, %loop ], [ %shl, %entry ]87 %cond = icmp eq i64 %indvars.iv, -922337203685477580688 %indvars.iv.next = add nsw i64 %indvars.iv, -189 br i1 %cond, label %exit, label %loop90 91exit: ; preds = %loop92 ret i32 093}94 95define void @pointer_iv_nowrap(ptr %startptr, ptr %endptr) local_unnamed_addr {96; CHECK-LABEL: 'pointer_iv_nowrap'97; CHECK-NEXT: Classifying expressions for: @pointer_iv_nowrap98; CHECK-NEXT: %init = getelementptr inbounds i8, ptr %startptr, i64 200099; CHECK-NEXT: --> (2000 + %startptr) U: full-set S: full-set100; CHECK-NEXT: %iv = phi ptr [ %init, %entry ], [ %iv.next, %loop ]101; CHECK-NEXT: --> {(2000 + %startptr),+,1}<nuw><%loop> U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Computable }102; CHECK-NEXT: %iv.next = getelementptr inbounds i8, ptr %iv, i64 1103; CHECK-NEXT: --> {(2001 + %startptr),+,1}<nuw><%loop> U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Computable }104; CHECK-NEXT: Determining loop execution counts for: @pointer_iv_nowrap105; CHECK-NEXT: Loop %loop: Unpredictable backedge-taken count.106; CHECK-NEXT: Loop %loop: Unpredictable constant max backedge-taken count.107; CHECK-NEXT: Loop %loop: Unpredictable symbolic max backedge-taken count.108;109entry:110 %init = getelementptr inbounds i8, ptr %startptr, i64 2000111 br label %loop112 113loop:114 %iv = phi ptr [ %init, %entry ], [ %iv.next, %loop ]115 %iv.next = getelementptr inbounds i8, ptr %iv, i64 1116 %ec = icmp ugt ptr %iv.next, %endptr117 br i1 %ec, label %end, label %loop118 119end:120 ret void121}122 123define void @pointer_iv_nowrap_guard(ptr %startptr, ptr %endptr) local_unnamed_addr {124; CHECK-LABEL: 'pointer_iv_nowrap_guard'125; CHECK-NEXT: Classifying expressions for: @pointer_iv_nowrap_guard126; CHECK-NEXT: %init = getelementptr inbounds i32, ptr %startptr, i64 2000127; CHECK-NEXT: --> (8000 + %startptr)<nuw> U: [8000,0) S: [8000,0)128; CHECK-NEXT: %iv = phi ptr [ %init, %entry ], [ %iv.next, %loop ]129; CHECK-NEXT: --> {(8000 + %startptr)<nuw>,+,4}<nuw><%loop> U: [8000,0) S: [8000,0) Exits: (8000 + (4 * ((-8001 + (-1 * (ptrtoint ptr %startptr to i64)) + ((8004 + (ptrtoint ptr %startptr to i64)) umax (ptrtoint ptr %endptr to i64))) /u 4))<nuw> + %startptr) LoopDispositions: { %loop: Computable }130; CHECK-NEXT: %iv.next = getelementptr inbounds i32, ptr %iv, i64 1131; CHECK-NEXT: --> {(8004 + %startptr),+,4}<nuw><%loop> U: full-set S: full-set Exits: (8004 + (4 * ((-8001 + (-1 * (ptrtoint ptr %startptr to i64)) + ((8004 + (ptrtoint ptr %startptr to i64)) umax (ptrtoint ptr %endptr to i64))) /u 4))<nuw> + %startptr) LoopDispositions: { %loop: Computable }132; CHECK-NEXT: Determining loop execution counts for: @pointer_iv_nowrap_guard133; CHECK-NEXT: Loop %loop: backedge-taken count is ((-8001 + (-1 * (ptrtoint ptr %startptr to i64)) + ((8004 + (ptrtoint ptr %startptr to i64)) umax (ptrtoint ptr %endptr to i64))) /u 4)134; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i64 4611686018427387903135; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is ((-8001 + (-1 * (ptrtoint ptr %startptr to i64)) + ((8004 + (ptrtoint ptr %startptr to i64)) umax (ptrtoint ptr %endptr to i64))) /u 4)136; CHECK-NEXT: Loop %loop: Trip multiple is 1137;138entry:139 %init = getelementptr inbounds i32, ptr %startptr, i64 2000140 %cmp2 = icmp ult ptr %init, %endptr141 br i1 %cmp2, label %loop, label %end142 143loop:144 %iv = phi ptr [ %init, %entry ], [ %iv.next, %loop ]145 %iv.next = getelementptr inbounds i32, ptr %iv, i64 1146 %ec = icmp uge ptr %iv.next, %endptr147 br i1 %ec, label %end, label %loop148 149end:150 ret void151}152