Handle comparisons of gep instructions that have different typed indices

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
This commit is contained in:
Chris Lattner 2005-01-21 23:06:49 +00:00
parent fb0f53f9c1
commit 45f57b8ee3

View File

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