Check sign to detect overflow before changing compare stride.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@54710 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/Transforms/Scalar/LoopStrengthReduce.cpp b/lib/Transforms/Scalar/LoopStrengthReduce.cpp
index 3d82fd2..f47a5af 100644
--- a/lib/Transforms/Scalar/LoopStrengthReduce.cpp
+++ b/lib/Transforms/Scalar/LoopStrengthReduce.cpp
@@ -1542,6 +1542,12 @@
   Value *NewIncV = NULL;
   int64_t Scale = 1;
 
+  // Check stride constant and the comparision constant signs to detect
+  // overflow.
+  if (ICmpInst::isSignedPredicate(Predicate) &&
+      (CmpVal & SignBit) != (CmpSSInt & SignBit))
+    return Cond;
+
   // Look for a suitable stride / iv as replacement.
   std::stable_sort(StrideOrder.begin(), StrideOrder.end(), StrideCompare());
   for (unsigned i = 0, e = StrideOrder.size(); i != e; ++i) {
@@ -1640,11 +1646,12 @@
   // before the branch. See
   // test/Transforms/LoopStrengthReduce/change-compare-stride-trickiness-*.ll
   // for an example of this situation.
-  if (!Cond->hasOneUse())
+  if (!Cond->hasOneUse()) {
     for (BasicBlock::iterator I = Cond, E = Cond->getParent()->end();
          I != E; ++I)
       if (I == NewIncV)
         return Cond;
+  }
 
   if (NewCmpVal != CmpVal) {
     // Create a new compare instruction using new stride / iv.