In SimplifyICmpOperands, avoid needlessly swapping the operands in the
authorDan Gohman <gohman@apple.com>
Mon, 3 May 2010 17:00:11 +0000 (17:00 +0000)
committerDan Gohman <gohman@apple.com>
Mon, 3 May 2010 17:00:11 +0000 (17:00 +0000)
case where both are addrecs in unrelated loops.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@102924 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Analysis/ScalarEvolution.cpp

index fea0a7a320e899129e70c08ba3ceaccc9f9c429b..2a502cd22c9ad5ac81be20e44eec5206a711f2f6 100644 (file)
@@ -4783,13 +4783,16 @@ bool ScalarEvolution::SimplifyICmpOperands(ICmpInst::Predicate &Pred,
   }
 
   // If we're comparing an addrec with a value which is loop-invariant in the
-  // addrec's loop, put the addrec on the left.
-  if (const SCEVAddRecExpr *AR = dyn_cast<SCEVAddRecExpr>(RHS))
-    if (LHS->isLoopInvariant(AR->getLoop())) {
+  // addrec's loop, put the addrec on the left. Also make a dominance check,
+  // as both operands could be addrecs loop-invariant in each other's loop.
+  if (const SCEVAddRecExpr *AR = dyn_cast<SCEVAddRecExpr>(RHS)) {
+    const Loop *L = AR->getLoop();
+    if (LHS->isLoopInvariant(L) && LHS->properlyDominates(L->getHeader(), DT)) {
       std::swap(LHS, RHS);
       Pred = ICmpInst::getSwappedPredicate(Pred);
       Changed = true;
     }
+  }
 
   // If there's a constant operand, canonicalize comparisons with boundary
   // cases, and canonicalize *-or-equal comparisons to regular comparisons.