summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--llvm/lib/Analysis/ScalarEvolution.cpp54
1 files changed, 1 insertions, 53 deletions
diff --git a/llvm/lib/Analysis/ScalarEvolution.cpp b/llvm/lib/Analysis/ScalarEvolution.cpp
index 5aea3a4752e..6638ae5ca49 100644
--- a/llvm/lib/Analysis/ScalarEvolution.cpp
+++ b/llvm/lib/Analysis/ScalarEvolution.cpp
@@ -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.
OpenPOWER on IntegriCloud