diff options
author | Andrew Trick <atrick@apple.com> | 2012-07-13 23:33:03 +0000 |
---|---|---|
committer | Andrew Trick <atrick@apple.com> | 2012-07-13 23:33:03 +0000 |
commit | 8b7036b0f4ae3f76ad24a6b9bc2d874620406306 (patch) | |
tree | 1b582de0b7c141c92285e128982aba688a04fece /lib | |
parent | 06a6a300c5f7100e4665667c689369e078d2ad59 (diff) | |
download | external_llvm-8b7036b0f4ae3f76ad24a6b9bc2d874620406306.zip external_llvm-8b7036b0f4ae3f76ad24a6b9bc2d874620406306.tar.gz external_llvm-8b7036b0f4ae3f76ad24a6b9bc2d874620406306.tar.bz2 |
Factor SCEV traversal code so I can use it elsewhere. No functionality.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@160203 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib')
-rw-r--r-- | lib/Analysis/ScalarEvolution.cpp | 70 |
1 files changed, 19 insertions, 51 deletions
diff --git a/lib/Analysis/ScalarEvolution.cpp b/lib/Analysis/ScalarEvolution.cpp index 884ceec..f0f3b1c 100644 --- a/lib/Analysis/ScalarEvolution.cpp +++ b/lib/Analysis/ScalarEvolution.cpp @@ -6894,59 +6894,27 @@ bool ScalarEvolution::properlyDominates(const SCEV *S, const BasicBlock *BB) { return getBlockDisposition(S, BB) == ProperlyDominatesBlock; } -bool ScalarEvolution::hasOperand(const SCEV *S, const SCEV *Op) const { - SmallVector<const SCEV *, 8> Worklist; - Worklist.push_back(S); - do { - S = Worklist.pop_back_val(); +namespace { +// Search for a SCEV expression node within an expression tree. +// Implements SCEVTraversal::Visitor. +struct SCEVSearch { + const SCEV *Node; + bool IsFound; - switch (S->getSCEVType()) { - case scConstant: - break; - case scTruncate: - case scZeroExtend: - case scSignExtend: { - const SCEVCastExpr *Cast = cast<SCEVCastExpr>(S); - const SCEV *CastOp = Cast->getOperand(); - if (Op == CastOp) - return true; - Worklist.push_back(CastOp); - break; - } - case scAddRecExpr: - case scAddExpr: - case scMulExpr: - case scUMaxExpr: - case scSMaxExpr: { - const SCEVNAryExpr *NAry = cast<SCEVNAryExpr>(S); - for (SCEVNAryExpr::op_iterator I = NAry->op_begin(), E = NAry->op_end(); - I != E; ++I) { - const SCEV *NAryOp = *I; - if (NAryOp == Op) - return true; - Worklist.push_back(NAryOp); - } - break; - } - case scUDivExpr: { - const SCEVUDivExpr *UDiv = cast<SCEVUDivExpr>(S); - const SCEV *LHS = UDiv->getLHS(), *RHS = UDiv->getRHS(); - if (LHS == Op || RHS == Op) - return true; - Worklist.push_back(LHS); - Worklist.push_back(RHS); - break; - } - case scUnknown: - break; - case scCouldNotCompute: - llvm_unreachable("Attempt to use a SCEVCouldNotCompute object!"); - default: - llvm_unreachable("Unknown SCEV kind!"); - } - } while (!Worklist.empty()); + SCEVSearch(const SCEV *N): Node(N), IsFound(false) {} - return false; + bool follow(const SCEV *S) { + IsFound |= (S == Node); + return !IsFound; + } + bool isDone() const { return IsFound; } +}; +} + +bool ScalarEvolution::hasOperand(const SCEV *S, const SCEV *Op) const { + SCEVSearch Search(Op); + visitAll(S, Search); + return Search.IsFound; } void ScalarEvolution::forgetMemoizedResults(const SCEV *S) { |