mirror of
https://github.com/RPCSX/llvm.git
synced 2025-01-18 18:32:32 +00:00
[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:
parent
5c54a093a2
commit
b4b9bfafe7
@ -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
|
||||
|
26
test/Analysis/ScalarEvolution/exhaustive-trip-counts.ll
Normal file
26
test/Analysis/ScalarEvolution/exhaustive-trip-counts.ll
Normal 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()
|
Loading…
x
Reference in New Issue
Block a user