diff options
author | Dan Gohman <gohman@apple.com> | 2009-06-14 22:51:25 +0000 |
---|---|---|
committer | Dan Gohman <gohman@apple.com> | 2009-06-14 22:51:25 +0000 |
commit | 56fc8f13b432829c594579e76592ab5d8c7ab6cf (patch) | |
tree | 75db9f9b0b30d3083f13bc080371c5d0327c7fcd | |
parent | 02ff939f61fd1f18361a9aa5b96175aafdb82a39 (diff) | |
download | external_llvm-56fc8f13b432829c594579e76592ab5d8c7ab6cf.zip external_llvm-56fc8f13b432829c594579e76592ab5d8c7ab6cf.tar.gz external_llvm-56fc8f13b432829c594579e76592ab5d8c7ab6cf.tar.bz2 |
Do compare constant SCEV values in SCEVComplexityCompare, because
even though the order doesn't matter at the top level of an expression,
it does matter when the constant is a subexpression of an n-ary
expression, because n-ary expressions are sorted lexicographically.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@73358 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | lib/Analysis/ScalarEvolution.cpp | 15 |
1 files changed, 12 insertions, 3 deletions
diff --git a/lib/Analysis/ScalarEvolution.cpp b/lib/Analysis/ScalarEvolution.cpp index 8357ddb..ee077d5 100644 --- a/lib/Analysis/ScalarEvolution.cpp +++ b/lib/Analysis/ScalarEvolution.cpp @@ -504,9 +504,18 @@ namespace { return false; } - // Constant sorting doesn't matter since they'll be folded. - if (isa<SCEVConstant>(LHS)) - return false; + // Compare constant values. + if (const SCEVConstant *LC = dyn_cast<SCEVConstant>(LHS)) { + const SCEVConstant *RC = cast<SCEVConstant>(RHS); + return LC->getValue()->getValue().ult(RC->getValue()->getValue()); + } + + // Compare addrec loop depths. + if (const SCEVAddRecExpr *LA = dyn_cast<SCEVAddRecExpr>(LHS)) { + const SCEVAddRecExpr *RA = cast<SCEVAddRecExpr>(RHS); + if (LA->getLoop()->getLoopDepth() != RA->getLoop()->getLoopDepth()) + return LA->getLoop()->getLoopDepth() < RA->getLoop()->getLoopDepth(); + } // Lexicographically compare n-ary expressions. if (const SCEVNAryExpr *LC = dyn_cast<SCEVNAryExpr>(LHS)) { |