mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-12-12 14:06:36 +00:00
[SCEV][NFC] Smarter implementation of isAvailableAtLoopEntry
isAvailableAtLoopEntry duplicates logic of `properlyDominates` after checking invariance. This patch replaces this logic with invocation of this method which is more profitable because it supports caching. Differential Revision: https://reviews.llvm.org/D43997 llvm-svn: 327373
This commit is contained in:
parent
fd88b5baef
commit
faa28fa05f
@ -2234,59 +2234,7 @@ StrengthenNoWrapFlags(ScalarEvolution *SE, SCEVTypes Type,
|
||||
}
|
||||
|
||||
bool ScalarEvolution::isAvailableAtLoopEntry(const SCEV *S, const Loop *L) {
|
||||
if (!isLoopInvariant(S, L))
|
||||
return false;
|
||||
// If a value depends on a SCEVUnknown which is defined after the loop, we
|
||||
// conservatively assume that we cannot calculate it at the loop's entry.
|
||||
struct FindDominatedSCEVUnknown {
|
||||
bool Found = false;
|
||||
const Loop *L;
|
||||
DominatorTree &DT;
|
||||
LoopInfo &LI;
|
||||
|
||||
FindDominatedSCEVUnknown(const Loop *L, DominatorTree &DT, LoopInfo &LI)
|
||||
: L(L), DT(DT), LI(LI) {}
|
||||
|
||||
bool checkSCEVUnknown(const SCEVUnknown *SU) {
|
||||
if (auto *I = dyn_cast<Instruction>(SU->getValue())) {
|
||||
if (DT.dominates(L->getHeader(), I->getParent()))
|
||||
Found = true;
|
||||
else
|
||||
assert(DT.dominates(I->getParent(), L->getHeader()) &&
|
||||
"No dominance relationship between SCEV and loop?");
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
bool follow(const SCEV *S) {
|
||||
switch (static_cast<SCEVTypes>(S->getSCEVType())) {
|
||||
case scConstant:
|
||||
return false;
|
||||
case scAddRecExpr:
|
||||
case scTruncate:
|
||||
case scZeroExtend:
|
||||
case scSignExtend:
|
||||
case scAddExpr:
|
||||
case scMulExpr:
|
||||
case scUMaxExpr:
|
||||
case scSMaxExpr:
|
||||
case scUDivExpr:
|
||||
return true;
|
||||
case scUnknown:
|
||||
return checkSCEVUnknown(cast<SCEVUnknown>(S));
|
||||
case scCouldNotCompute:
|
||||
llvm_unreachable("Attempt to use a SCEVCouldNotCompute object!");
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
bool isDone() { return Found; }
|
||||
};
|
||||
|
||||
FindDominatedSCEVUnknown FSU(L, DT, LI);
|
||||
SCEVTraversal<FindDominatedSCEVUnknown> ST(FSU);
|
||||
ST.visitAll(S);
|
||||
return !FSU.Found;
|
||||
return isLoopInvariant(S, L) && properlyDominates(S, L->getHeader());
|
||||
}
|
||||
|
||||
/// Get a canonical add expression, or something simpler if possible.
|
||||
|
Loading…
Reference in New Issue
Block a user