OSDN Git Service

Handle comparisons of gep instructions that have different typed indices
authorChris Lattner <sabre@nondot.org>
Fri, 21 Jan 2005 23:06:49 +0000 (23:06 +0000)
committerChris Lattner <sabre@nondot.org>
Fri, 21 Jan 2005 23:06:49 +0000 (23:06 +0000)
as long as they are the same size.

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

lib/Transforms/Scalar/InstructionCombining.cpp

index 6312f42..080bc78 100644 (file)
@@ -2244,9 +2244,9 @@ Instruction *InstCombiner::FoldGEPSetCC(User *GEPLHS, Value *RHS,
       unsigned DiffOperand = 0;     // The operand that differs.
       for (unsigned i = 1, e = GEPRHS->getNumOperands(); i != e; ++i)
         if (GEPLHS->getOperand(i) != GEPRHS->getOperand(i)) {
-          if (GEPLHS->getOperand(i)->getType() != 
-                     GEPRHS->getOperand(i)->getType()) {
-            // Irreconsilable differences.
+          if (GEPLHS->getOperand(i)->getType()->getPrimitiveSize() != 
+                     GEPRHS->getOperand(i)->getType()->getPrimitiveSize()) {
+            // Irreconcilable differences.
             NumDifferences = 2;
             break;
           } else {
@@ -2259,8 +2259,12 @@ Instruction *InstCombiner::FoldGEPSetCC(User *GEPLHS, Value *RHS,
         return ReplaceInstUsesWith(I, // No comparison is needed here.
                                  ConstantBool::get(Cond == Instruction::SetEQ));
       else if (NumDifferences == 1) {
-        return new SetCondInst(Cond, GEPLHS->getOperand(DiffOperand),
-                               GEPRHS->getOperand(DiffOperand));
+        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);
       }
     }