Index: llvm/test/Analysis/ScalarEvolution/trip-count-from-loop-guard.ll =================================================================== --- /dev/null +++ llvm/test/Analysis/ScalarEvolution/trip-count-from-loop-guard.ll @@ -0,0 +1,41 @@ +; NOTE: Assertions have been autogenerated by utils/update_analyze_test_checks.py UTC_ARGS: --version 2 +; RUN: opt -disable-output "-passes=print" < %s 2>&1 | FileCheck %s + +; if (const > 0) +; for (i8 i = 126; const - i > 0; i++) {} +; +; TODO: Use loop guard's info 'const > 0' to figure out that max backedge-taken count is 1 +define i32 @range_from_loop_guard(i8 %const) { +; CHECK-LABEL: 'range_from_loop_guard' +; CHECK-NEXT: Classifying expressions for: @range_from_loop_guard +; CHECK-NEXT: %iv = phi i8 [ %iv.next, %loop ], [ 126, %entry ] +; CHECK-NEXT: --> {126,+,1}<%loop> U: [126,-2) S: [126,-2) Exits: ((-1 * (0 smin (-126 + %const))) + %const) LoopDispositions: { %loop: Computable } +; CHECK-NEXT: %iv.next = add nuw i8 %iv, 1 +; CHECK-NEXT: --> {127,+,1}<%loop> U: [127,-1) S: [127,-1) Exits: (1 + (-1 * (0 smin (-126 + %const))) + %const) LoopDispositions: { %loop: Computable } +; CHECK-NEXT: %sub = sub i8 %const, %iv +; CHECK-NEXT: --> {(-126 + %const),+,-1}<%loop> U: full-set S: full-set Exits: (0 smin (-126 + %const)) LoopDispositions: { %loop: Computable } +; CHECK-NEXT: Determining loop execution counts for: @range_from_loop_guard +; CHECK-NEXT: Loop %loop: backedge-taken count is (-126 + (-1 * (0 smin (-126 + %const))) + %const) +; CHECK-NEXT: Loop %loop: constant max backedge-taken count is 127 +; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is (-126 + (-1 * (0 smin (-126 + %const))) + %const) +; CHECK-NEXT: Loop %loop: Predicated backedge-taken count is (-126 + (-1 * (0 smin (-126 + %const))) + %const) +; CHECK-NEXT: Predicates: +; CHECK: Loop %loop: Trip multiple is 1 +; +entry: + %cmp0 = icmp sgt i8 %const, 0 + br i1 %cmp0, label %loop, label %fail + +loop: + %iv = phi i8 [ %iv.next, %loop ], [ 126, %entry ] + %iv.next = add nuw i8 %iv, 1 + %sub = sub i8 %const, %iv + %cmp1 = icmp sgt i8 %sub, 0 + br i1 %cmp1, label %loop, label %exit + +fail: + ret i32 -1 + +exit: + ret i32 0 +}