do not collect undef terms

llvm-svn: 208237
This commit is contained in:
Sebastian Pop 2014-05-07 19:00:32 +00:00
parent 5f2fd4b22a
commit a7d3d6ab9f
1 changed files with 36 additions and 1 deletions

View File

@ -6815,6 +6815,40 @@ const SCEV *SCEVAddRecExpr::getNumIterationsInRange(ConstantRange Range,
return SE.getCouldNotCompute();
}
namespace {
struct FindUndefs {
bool Found;
FindUndefs() : Found(false) {}
bool follow(const SCEV *S) {
if (const SCEVUnknown *C = dyn_cast<SCEVUnknown>(S)) {
if (isa<UndefValue>(C->getValue()))
Found = true;
} else if (const SCEVConstant *C = dyn_cast<SCEVConstant>(S)) {
if (isa<UndefValue>(C->getValue()))
Found = true;
}
// Keep looking if we haven't found it yet.
return !Found;
}
bool isDone() const {
// Stop recursion if we have found an undef.
return Found;
}
};
}
// Return true when S contains at least an undef value.
static inline bool
containsUndefs(const SCEV *S) {
FindUndefs F;
SCEVTraversal<FindUndefs> ST(F);
ST.visitAll(S);
return F.Found;
}
namespace {
// Collect all steps of SCEV expressions.
struct SCEVCollectStrides {
@ -6841,6 +6875,7 @@ struct SCEVCollectTerms {
bool follow(const SCEV *S) {
if (isa<SCEVUnknown>(S) || isa<SCEVConstant>(S) || isa<SCEVMulExpr>(S)) {
if (!containsUndefs(S))
Terms.push_back(S);
// Stop recursion: once we collected a term, do not walk its operands.