[SCEV] Compute max be count from shift operator only if all else fails

In particular, check to see if we can compute a precise trip count by
exhaustively simulating the loop first.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@274199 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Sanjoy Das 2016-06-30 02:47:28 +00:00
parent 5c54a093a2
commit b4b9bfafe7
2 changed files with 35 additions and 6 deletions

View File

@ -5948,11 +5948,6 @@ ScalarEvolution::computeExitLimitFromICmp(const Loop *L,
return ItCnt;
}
ExitLimit ShiftEL = computeShiftCompareExitLimit(
ExitCond->getOperand(0), ExitCond->getOperand(1), L, Cond);
if (ShiftEL.hasAnyInfo())
return ShiftEL;
const SCEV *LHS = getSCEV(ExitCond->getOperand(0));
const SCEV *RHS = getSCEV(ExitCond->getOperand(1));
@ -6018,7 +6013,15 @@ ScalarEvolution::computeExitLimitFromICmp(const Loop *L,
default:
break;
}
return computeExitCountExhaustively(L, ExitCond, !L->contains(TBB));
auto *ExhaustiveCount =
computeExitCountExhaustively(L, ExitCond, !L->contains(TBB));
if (!isa<SCEVCouldNotCompute>(ExhaustiveCount))
return ExhaustiveCount;
return computeShiftCompareExitLimit(ExitCond->getOperand(0),
ExitCond->getOperand(1), L, Cond);
}
ScalarEvolution::ExitLimit

View File

@ -0,0 +1,26 @@
; RUN: opt -analyze -scalar-evolution < %s | FileCheck %s
target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
target triple = "x86_64-unknown-linux-gnu"
define void @f_0() {
; CHECK-LABEL: Printing analysis 'Scalar Evolution Analysis' for function 'f_0':
; CHECK: Loop %for.body: backedge-taken count is 5
; CHECK: Loop %for.body: max backedge-taken count is 5
; CHECK: Loop %for.body: Predicated backedge-taken count is 5
entry:
br label %for.body
for.body:
%i.05 = phi i32 [ 32, %entry ], [ %div4, %for.body ]
tail call void @dummy()
%div4 = lshr i32 %i.05, 1
%cmp = icmp eq i32 %div4, 0
br i1 %cmp, label %for.cond.cleanup, label %for.body
for.cond.cleanup:
ret void
}
declare void @dummy()