Fix PR8161, in which an unreachable loop causes recursive instruction simplification to try

to replace an instruction with itself.  Add a predicate to the simplifier to prevent this case.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@114097 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Owen Anderson
2010-09-16 17:42:36 +00:00
parent 1d51c41a45
commit 4b91c3ac96
2 changed files with 44 additions and 11 deletions

View File

@ -423,31 +423,44 @@ Value *llvm::SimplifyCmpInst(unsigned Predicate, Value *LHS, Value *RHS,
/// SimplifyInstruction - See if we can compute a simplified version of this
/// instruction. If not, this returns null.
Value *llvm::SimplifyInstruction(Instruction *I, const TargetData *TD) {
Value *Ret = 0;
switch (I->getOpcode()) {
default:
return ConstantFoldInstruction(I, TD);
case Instruction::Add:
return SimplifyAddInst(I->getOperand(0), I->getOperand(1),
cast<BinaryOperator>(I)->hasNoSignedWrap(),
cast<BinaryOperator>(I)->hasNoUnsignedWrap(), TD);
Ret = SimplifyAddInst(I->getOperand(0), I->getOperand(1),
cast<BinaryOperator>(I)->hasNoSignedWrap(),
cast<BinaryOperator>(I)->hasNoUnsignedWrap(), TD);
break;
case Instruction::And:
return SimplifyAndInst(I->getOperand(0), I->getOperand(1), TD);
Ret = SimplifyAndInst(I->getOperand(0), I->getOperand(1), TD);
break;
case Instruction::Or:
return SimplifyOrInst(I->getOperand(0), I->getOperand(1), TD);
Ret = SimplifyOrInst(I->getOperand(0), I->getOperand(1), TD);
break;
case Instruction::ICmp:
return SimplifyICmpInst(cast<ICmpInst>(I)->getPredicate(),
I->getOperand(0), I->getOperand(1), TD);
Ret = SimplifyICmpInst(cast<ICmpInst>(I)->getPredicate(),
I->getOperand(0), I->getOperand(1), TD);
break;
case Instruction::FCmp:
return SimplifyFCmpInst(cast<FCmpInst>(I)->getPredicate(),
I->getOperand(0), I->getOperand(1), TD);
Ret = SimplifyFCmpInst(cast<FCmpInst>(I)->getPredicate(),
I->getOperand(0), I->getOperand(1), TD);
break;
case Instruction::Select:
return SimplifySelectInst(I->getOperand(0), I->getOperand(1),
Ret = SimplifySelectInst(I->getOperand(0), I->getOperand(1),
I->getOperand(2), TD);
break;
case Instruction::GetElementPtr: {
SmallVector<Value*, 8> Ops(I->op_begin(), I->op_end());
return SimplifyGEPInst(&Ops[0], Ops.size(), TD);
Ret = SimplifyGEPInst(&Ops[0], Ops.size(), TD);
break;
}
}
// It is possible, in situations involving unreachable loops, to
// have a replacement that, through recursive simplification, ends up
// simplifying to itself.
return Ret != I ? Ret : 0;
}
/// ReplaceAndSimplifyAllUses - Perform From->replaceAllUsesWith(To) and then