When transforming &A[i] < &A[j]  ->  i < j, make sure to perform the comparison
as a signed compare.  This patch may fix PR597, but is correct in any case.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@22465 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/Transforms/Scalar/InstructionCombining.cpp b/lib/Transforms/Scalar/InstructionCombining.cpp
index e2ef04e..b838289 100644
--- a/lib/Transforms/Scalar/InstructionCombining.cpp
+++ b/lib/Transforms/Scalar/InstructionCombining.cpp
@@ -2367,10 +2367,17 @@
       else if (NumDifferences == 1) {
         Value *LHSV = GEPLHS->getOperand(DiffOperand);
         Value *RHSV = GEPRHS->getOperand(DiffOperand);
-        if (LHSV->getType() != RHSV->getType())
-          LHSV = InsertNewInstBefore(new CastInst(LHSV, RHSV->getType(),
-                                                  LHSV->getName()+".c"), I);
-          return new SetCondInst(Cond, LHSV, RHSV);
+
+        // Convert the operands to signed values to make sure to perform a
+        // signed comparison.
+        const Type *NewTy = LHSV->getType()->getSignedVersion();
+        if (LHSV->getType() != NewTy)
+          LHSV = InsertNewInstBefore(new CastInst(LHSV, NewTy,
+                                                  LHSV->getName()), I);
+        if (RHSV->getType() != NewTy)
+          RHSV = InsertNewInstBefore(new CastInst(RHSV, NewTy,
+                                                  RHSV->getName()), I);
+        return new SetCondInst(Cond, LHSV, RHSV);
       }
     }