When transforming &A[i] < &A[j] -> i < j, make sure to perform the comparison
authorChris Lattner <sabre@nondot.org>
Mon, 18 Jul 2005 23:07:33 +0000 (23:07 +0000)
committerChris Lattner <sabre@nondot.org>
Mon, 18 Jul 2005 23:07:33 +0000 (23:07 +0000)
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

lib/Transforms/Scalar/InstructionCombining.cpp

index e2ef04ea1df6e750b8f8858056ff87dfdd28fa46..b838289e59c73b81d1e1da9dc6cc6a837bc46d89 100644 (file)
@@ -2367,10 +2367,17 @@ Instruction *InstCombiner::FoldGEPSetCC(User *GEPLHS, Value *RHS,
       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);
       }
     }