1; NOTE: Assertions have been autogenerated by utils/update_analyze_test_checks.py UTC_ARGS: --version 5 2; RUN: opt -passes='print<scalar-evolution>' -scalar-evolution-classify-expressions=0 -disable-output %s 2>&1 | FileCheck %s 3 4define i32 @ptr_induction_ult(ptr %a, ptr %b) { 5; CHECK-LABEL: 'ptr_induction_ult' 6; CHECK-NEXT: Determining loop execution counts for: @ptr_induction_ult 7; CHECK-NEXT: Loop %loop: Unpredictable backedge-taken count. 8; CHECK-NEXT: Loop %loop: Unpredictable constant max backedge-taken count. 9; CHECK-NEXT: Loop %loop: Unpredictable symbolic max backedge-taken count. 10; CHECK-NEXT: Loop %loop: Predicated backedge-taken count is (((-1 * (ptrtoint ptr %a to i64)) + (ptrtoint ptr %b to i64)) /u 4) 11; CHECK-NEXT: Predicates: 12; CHECK-NEXT: Equal predicate: (zext i2 ((trunc i64 (ptrtoint ptr %b to i64) to i2) + (-1 * (trunc i64 (ptrtoint ptr %a to i64) to i2))) to i64) == 0 13; CHECK-NEXT: Loop %loop: Predicated constant max backedge-taken count is i64 4611686018427387903 14; CHECK-NEXT: Predicates: 15; CHECK-NEXT: Equal predicate: (zext i2 ((trunc i64 (ptrtoint ptr %b to i64) to i2) + (-1 * (trunc i64 (ptrtoint ptr %a to i64) to i2))) to i64) == 0 16; CHECK-NEXT: Loop %loop: Predicated symbolic max backedge-taken count is (((-1 * (ptrtoint ptr %a to i64)) + (ptrtoint ptr %b to i64)) /u 4) 17; CHECK-NEXT: Predicates: 18; CHECK-NEXT: Equal predicate: (zext i2 ((trunc i64 (ptrtoint ptr %b to i64) to i2) + (-1 * (trunc i64 (ptrtoint ptr %a to i64) to i2))) to i64) == 0 19; 20entry: 21 %cmp.6 = icmp ult ptr %a, %b 22 br i1 %cmp.6, label %loop, label %exit 23 24loop: 25 %ptr.iv = phi ptr [ %ptr.iv.next, %loop ], [ %a, %entry ] 26 %ptr.iv.next = getelementptr i32, ptr %ptr.iv, i64 1 27 %exitcond = icmp eq ptr %ptr.iv, %b 28 br i1 %exitcond, label %exit, label %loop 29 30exit: 31 ret i32 0 32} 33 34define i32 @ptr_induction_ult_3_step_6(ptr %a, ptr %b) { 35; CHECK-LABEL: 'ptr_induction_ult_3_step_6' 36; CHECK-NEXT: Determining loop execution counts for: @ptr_induction_ult_3_step_6 37; CHECK-NEXT: Loop %loop: Unpredictable backedge-taken count. 38; CHECK-NEXT: Loop %loop: Unpredictable constant max backedge-taken count. 39; CHECK-NEXT: Loop %loop: Unpredictable symbolic max backedge-taken count. 40; CHECK-NEXT: Loop %loop: Predicated backedge-taken count is (((3074457345618258603 * (ptrtoint ptr %b to i64)) + (-3074457345618258603 * (ptrtoint ptr %a to i64))) /u 2) 41; CHECK-NEXT: Predicates: 42; CHECK-NEXT: Equal predicate: (zext i1 (trunc i64 ((-1 * (ptrtoint ptr %a to i64)) + (ptrtoint ptr %b to i64)) to i1) to i64) == 0 43; CHECK-NEXT: Loop %loop: Predicated constant max backedge-taken count is i64 9223372036854775807 44; CHECK-NEXT: Predicates: 45; CHECK-NEXT: Equal predicate: (zext i1 (trunc i64 ((-1 * (ptrtoint ptr %a to i64)) + (ptrtoint ptr %b to i64)) to i1) to i64) == 0 46; CHECK-NEXT: Loop %loop: Predicated symbolic max backedge-taken count is (((3074457345618258603 * (ptrtoint ptr %b to i64)) + (-3074457345618258603 * (ptrtoint ptr %a to i64))) /u 2) 47; CHECK-NEXT: Predicates: 48; CHECK-NEXT: Equal predicate: (zext i1 (trunc i64 ((-1 * (ptrtoint ptr %a to i64)) + (ptrtoint ptr %b to i64)) to i1) to i64) == 0 49; 50entry: 51 %cmp.6 = icmp ult ptr %a, %b 52 br i1 %cmp.6, label %loop, label %exit 53 54loop: 55 %ptr.iv = phi ptr [ %ptr.iv.next, %loop ], [ %a, %entry ] 56 %ptr.iv.next = getelementptr i8, ptr %ptr.iv, i64 6 57 %exitcond = icmp eq ptr %ptr.iv, %b 58 br i1 %exitcond, label %exit, label %loop 59 60exit: 61 ret i32 0 62} 63 64define i32 @ptr_induction_ult_3_step_7(ptr %a, ptr %b) { 65; CHECK-LABEL: 'ptr_induction_ult_3_step_7' 66; CHECK-NEXT: Determining loop execution counts for: @ptr_induction_ult_3_step_7 67; CHECK-NEXT: Loop %loop: backedge-taken count is ((7905747460161236407 * (ptrtoint ptr %b to i64)) + (-7905747460161236407 * (ptrtoint ptr %a to i64))) 68; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i64 -1 69; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is ((7905747460161236407 * (ptrtoint ptr %b to i64)) + (-7905747460161236407 * (ptrtoint ptr %a to i64))) 70; CHECK-NEXT: Loop %loop: Trip multiple is 1 71; 72entry: 73 %cmp.6 = icmp ult ptr %a, %b 74 br i1 %cmp.6, label %loop, label %exit 75 76loop: 77 %ptr.iv = phi ptr [ %ptr.iv.next, %loop ], [ %a, %entry ] 78 %ptr.iv.next = getelementptr i8, ptr %ptr.iv, i64 7 79 %exitcond = icmp eq ptr %ptr.iv, %b 80 br i1 %exitcond, label %exit, label %loop 81 82exit: 83 ret i32 0 84} 85 86; %a and %b may not have the same alignment, so the loop may only via the early 87; exit when %ptr.iv > %b. The predicated exit count for the latch can be 88; computed by adding a predicate. 89define void @ptr_induction_early_exit_eq_1(ptr %a, ptr %b, ptr %c) { 90; CHECK-LABEL: 'ptr_induction_early_exit_eq_1' 91; CHECK-NEXT: Determining loop execution counts for: @ptr_induction_early_exit_eq_1 92; CHECK-NEXT: Loop %loop: <multiple exits> Unpredictable backedge-taken count. 93; CHECK-NEXT: exit count for loop: ***COULDNOTCOMPUTE*** 94; CHECK-NEXT: exit count for loop.inc: ***COULDNOTCOMPUTE*** 95; CHECK-NEXT: predicated exit count for loop.inc: ((-8 + (-1 * (ptrtoint ptr %a to i64)) + (ptrtoint ptr %b to i64)) /u 8) 96; CHECK-NEXT: Predicates: 97; CHECK-NEXT: Equal predicate: (zext i3 ((trunc i64 (ptrtoint ptr %b to i64) to i3) + (-1 * (trunc i64 (ptrtoint ptr %a to i64) to i3))) to i64) == 0 98; CHECK-EMPTY: 99; CHECK-NEXT: Loop %loop: Unpredictable constant max backedge-taken count. 100; CHECK-NEXT: Loop %loop: Unpredictable symbolic max backedge-taken count. 101; CHECK-NEXT: symbolic max exit count for loop: ***COULDNOTCOMPUTE*** 102; CHECK-NEXT: symbolic max exit count for loop.inc: ***COULDNOTCOMPUTE*** 103; CHECK-NEXT: predicated symbolic max exit count for loop.inc: ((-8 + (-1 * (ptrtoint ptr %a to i64)) + (ptrtoint ptr %b to i64)) /u 8) 104; CHECK-NEXT: Predicates: 105; CHECK-NEXT: Equal predicate: (zext i3 ((trunc i64 (ptrtoint ptr %b to i64) to i3) + (-1 * (trunc i64 (ptrtoint ptr %a to i64) to i3))) to i64) == 0 106; CHECK-EMPTY: 107; CHECK-NEXT: Loop %loop: Predicated constant max backedge-taken count is i64 2305843009213693951 108; CHECK-NEXT: Predicates: 109; CHECK-NEXT: Equal predicate: (zext i3 ((trunc i64 (ptrtoint ptr %b to i64) to i3) + (-1 * (trunc i64 (ptrtoint ptr %a to i64) to i3))) to i64) == 0 110; CHECK-NEXT: Loop %loop: Predicated symbolic max backedge-taken count is ((-8 + (-1 * (ptrtoint ptr %a to i64)) + (ptrtoint ptr %b to i64)) /u 8) 111; CHECK-NEXT: Predicates: 112; CHECK-NEXT: Equal predicate: (zext i3 ((trunc i64 (ptrtoint ptr %b to i64) to i3) + (-1 * (trunc i64 (ptrtoint ptr %a to i64) to i3))) to i64) == 0 113; 114entry: 115 %cmp = icmp eq ptr %a, %b 116 br i1 %cmp, label %exit, label %loop 117 118loop: 119 %ptr.iv = phi ptr [ %ptr.iv.next, %loop.inc ], [ %a, %entry ] 120 %ld1 = load ptr, ptr %ptr.iv, align 8 121 %earlyexitcond = icmp eq ptr %ld1, %c 122 br i1 %earlyexitcond, label %exit, label %loop.inc 123 124loop.inc: 125 %ptr.iv.next = getelementptr inbounds i8, ptr %ptr.iv, i64 8 126 %exitcond = icmp eq ptr %ptr.iv.next, %b 127 br i1 %exitcond, label %exit, label %loop 128 129exit: 130 ret void 131} 132 133 134