diff options
author | Owen Anderson <resistor@mac.com> | 2010-09-16 17:42:36 +0000 |
---|---|---|
committer | Owen Anderson <resistor@mac.com> | 2010-09-16 17:42:36 +0000 |
commit | 94532cb297f9ddbef0390b3047e6b9cbec592382 (patch) | |
tree | f8c26a279ea548efc77924a59b83b1c7bc81c761 /llvm/lib/Analysis | |
parent | ee1934a2da25d427a5c5e5b8937ae002b8546235 (diff) | |
download | bcm5719-llvm-94532cb297f9ddbef0390b3047e6b9cbec592382.tar.gz bcm5719-llvm-94532cb297f9ddbef0390b3047e6b9cbec592382.zip |
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.
llvm-svn: 114097
Diffstat (limited to 'llvm/lib/Analysis')
-rw-r--r-- | llvm/lib/Analysis/InstructionSimplify.cpp | 35 |
1 files changed, 24 insertions, 11 deletions
diff --git a/llvm/lib/Analysis/InstructionSimplify.cpp b/llvm/lib/Analysis/InstructionSimplify.cpp index b49b4d0c6ab..5bc117d8a05 100644 --- a/llvm/lib/Analysis/InstructionSimplify.cpp +++ b/llvm/lib/Analysis/InstructionSimplify.cpp @@ -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 |