mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-23 19:23:23 +01:00
[SCEV] Cache results during GetMinTrailingZeros query
Differential Revision: https://reviews.llvm.org/D29759 llvm-svn: 295060
This commit is contained in:
parent
83c421dbdc
commit
cf821eac6c
@ -543,6 +543,12 @@ private:
|
||||
/// predicate by splitting it into a set of independent predicates.
|
||||
bool ProvingSplitPredicate;
|
||||
|
||||
/// Memoized values for the GetMinTrailingZeros
|
||||
DenseMap<const SCEV *, uint32_t> MinTrailingZerosCache;
|
||||
|
||||
/// Private helper method for the GetMinTrailingZeros method
|
||||
uint32_t GetMinTrailingZerosImpl(const SCEV *S);
|
||||
|
||||
/// Information about the number of loop iterations for which a loop exit's
|
||||
/// branch condition evaluates to the not-taken path. This is a temporary
|
||||
/// pair of exact and max expressions that are eventually summarized in
|
||||
|
@ -4437,8 +4437,7 @@ const SCEV *ScalarEvolution::createNodeForGEP(GEPOperator *GEP) {
|
||||
return getGEPExpr(GEP, IndexExprs);
|
||||
}
|
||||
|
||||
uint32_t
|
||||
ScalarEvolution::GetMinTrailingZeros(const SCEV *S) {
|
||||
uint32_t ScalarEvolution::GetMinTrailingZerosImpl(const SCEV *S) {
|
||||
if (const SCEVConstant *C = dyn_cast<SCEVConstant>(S))
|
||||
return C->getAPInt().countTrailingZeros();
|
||||
|
||||
@ -4448,14 +4447,16 @@ ScalarEvolution::GetMinTrailingZeros(const SCEV *S) {
|
||||
|
||||
if (const SCEVZeroExtendExpr *E = dyn_cast<SCEVZeroExtendExpr>(S)) {
|
||||
uint32_t OpRes = GetMinTrailingZeros(E->getOperand());
|
||||
return OpRes == getTypeSizeInBits(E->getOperand()->getType()) ?
|
||||
getTypeSizeInBits(E->getType()) : OpRes;
|
||||
return OpRes == getTypeSizeInBits(E->getOperand()->getType())
|
||||
? getTypeSizeInBits(E->getType())
|
||||
: OpRes;
|
||||
}
|
||||
|
||||
if (const SCEVSignExtendExpr *E = dyn_cast<SCEVSignExtendExpr>(S)) {
|
||||
uint32_t OpRes = GetMinTrailingZeros(E->getOperand());
|
||||
return OpRes == getTypeSizeInBits(E->getOperand()->getType()) ?
|
||||
getTypeSizeInBits(E->getType()) : OpRes;
|
||||
return OpRes == getTypeSizeInBits(E->getOperand()->getType())
|
||||
? getTypeSizeInBits(E->getType())
|
||||
: OpRes;
|
||||
}
|
||||
|
||||
if (const SCEVAddExpr *A = dyn_cast<SCEVAddExpr>(S)) {
|
||||
@ -4472,8 +4473,8 @@ ScalarEvolution::GetMinTrailingZeros(const SCEV *S) {
|
||||
uint32_t BitWidth = getTypeSizeInBits(M->getType());
|
||||
for (unsigned i = 1, e = M->getNumOperands();
|
||||
SumOpRes != BitWidth && i != e; ++i)
|
||||
SumOpRes = std::min(SumOpRes + GetMinTrailingZeros(M->getOperand(i)),
|
||||
BitWidth);
|
||||
SumOpRes =
|
||||
std::min(SumOpRes + GetMinTrailingZeros(M->getOperand(i)), BitWidth);
|
||||
return SumOpRes;
|
||||
}
|
||||
|
||||
@ -4514,6 +4515,17 @@ ScalarEvolution::GetMinTrailingZeros(const SCEV *S) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
uint32_t ScalarEvolution::GetMinTrailingZeros(const SCEV *S) {
|
||||
auto I = MinTrailingZerosCache.find(S);
|
||||
if (I != MinTrailingZerosCache.end())
|
||||
return I->second;
|
||||
|
||||
uint32_t Result = GetMinTrailingZerosImpl(S);
|
||||
auto InsertPair = MinTrailingZerosCache.insert({S, Result});
|
||||
assert(InsertPair.second && "Should insert a new key");
|
||||
return InsertPair.first->second;
|
||||
}
|
||||
|
||||
/// Helper method to assign a range to V from metadata present in the IR.
|
||||
static Optional<ConstantRange> GetRangeFromMetadata(Value *V) {
|
||||
if (Instruction *I = dyn_cast<Instruction>(V))
|
||||
@ -9510,6 +9522,7 @@ ScalarEvolution::ScalarEvolution(ScalarEvolution &&Arg)
|
||||
ValueExprMap(std::move(Arg.ValueExprMap)),
|
||||
PendingLoopPredicates(std::move(Arg.PendingLoopPredicates)),
|
||||
WalkingBEDominatingConds(false), ProvingSplitPredicate(false),
|
||||
MinTrailingZerosCache(std::move(Arg.MinTrailingZerosCache)),
|
||||
BackedgeTakenCounts(std::move(Arg.BackedgeTakenCounts)),
|
||||
PredicatedBackedgeTakenCounts(
|
||||
std::move(Arg.PredicatedBackedgeTakenCounts)),
|
||||
@ -9915,6 +9928,7 @@ void ScalarEvolution::forgetMemoizedResults(const SCEV *S) {
|
||||
SignedRanges.erase(S);
|
||||
ExprValueMap.erase(S);
|
||||
HasRecMap.erase(S);
|
||||
MinTrailingZerosCache.erase(S);
|
||||
|
||||
auto RemoveSCEVFromBackedgeMap =
|
||||
[S, this](DenseMap<const Loop *, BackedgeTakenInfo> &Map) {
|
||||
|
63
test/Analysis/ScalarEvolution/pr18606-min-zeros.ll
Normal file
63
test/Analysis/ScalarEvolution/pr18606-min-zeros.ll
Normal file
@ -0,0 +1,63 @@
|
||||
; RUN: opt -S -indvars < %s | FileCheck %s
|
||||
|
||||
; CHECK: @test
|
||||
; CHECK: %5 = add i32 %local_6_, %local_0_
|
||||
; CEHCK: %37 = mul i32 %36, %36
|
||||
|
||||
define i32 @test(i32, i32) {
|
||||
bci_0:
|
||||
br label %bci_30
|
||||
|
||||
bci_68: ; preds = %bci_45
|
||||
%local_6_.lcssa = phi i32 [ %local_6_, %bci_45 ]
|
||||
%.lcssa1.lcssa = phi i32 [ %37, %bci_45 ]
|
||||
%.lcssa.lcssa = phi i32 [ 34, %bci_45 ]
|
||||
%2 = add i32 %local_6_.lcssa, 262
|
||||
%3 = add i32 %2, %.lcssa1.lcssa
|
||||
%4 = add i32 %3, %.lcssa.lcssa
|
||||
ret i32 %4
|
||||
|
||||
bci_30: ; preds = %bci_45, %bci_0
|
||||
%local_0_ = phi i32 [ %0, %bci_0 ], [ %38, %bci_45 ]
|
||||
%local_6_ = phi i32 [ 2, %bci_0 ], [ %39, %bci_45 ]
|
||||
%5 = add i32 %local_6_, %local_0_
|
||||
br label %bci_45
|
||||
|
||||
bci_45: ; preds = %bci_30
|
||||
%6 = mul i32 %5, %5
|
||||
%7 = mul i32 %6, %6
|
||||
%8 = mul i32 %7, %7
|
||||
%9 = mul i32 %8, %8
|
||||
%10 = mul i32 %9, %9
|
||||
%11 = mul i32 %10, %10
|
||||
%12 = mul i32 %11, %11
|
||||
%13 = mul i32 %12, %12
|
||||
%14 = mul i32 %13, %13
|
||||
%15 = mul i32 %14, %14
|
||||
%16 = mul i32 %15, %15
|
||||
%17 = mul i32 %16, %16
|
||||
%18 = mul i32 %17, %17
|
||||
%19 = mul i32 %18, %18
|
||||
%20 = mul i32 %19, %19
|
||||
%21 = mul i32 %20, %20
|
||||
%22 = mul i32 %21, %21
|
||||
%23 = mul i32 %22, %22
|
||||
%24 = mul i32 %23, %23
|
||||
%25 = mul i32 %24, %24
|
||||
%26 = mul i32 %25, %25
|
||||
%27 = mul i32 %26, %26
|
||||
%28 = mul i32 %27, %27
|
||||
%29 = mul i32 %28, %28
|
||||
%30 = mul i32 %29, %29
|
||||
%31 = mul i32 %30, %30
|
||||
%32 = mul i32 %31, %31
|
||||
%33 = mul i32 %32, %32
|
||||
%34 = mul i32 %33, %33
|
||||
%35 = mul i32 %34, %34
|
||||
%36 = mul i32 %35, %35
|
||||
%37 = mul i32 %36, %36
|
||||
%38 = add i32 %37, -11
|
||||
%39 = add i32 %local_6_, 1
|
||||
%40 = icmp sgt i32 %39, 76
|
||||
br i1 %40, label %bci_68, label %bci_30
|
||||
}
|
Loading…
Reference in New Issue
Block a user