Revert r114097, adding back in the assertion against replacing an Instruction by itself. Now that CorrelatedValuePropagation is

more careful not to call SimplifyInstructionsInBlock() on an unreachable block, the issue has been fixed at a higher level.  Add
a big warning to SimplifyInstructionsInBlock() to hopefully prevent this in the future.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@114117 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Owen Anderson 2010-09-16 20:51:41 +00:00
parent 35aa94b229
commit 4e282decf3
3 changed files with 17 additions and 24 deletions

View File

@ -71,6 +71,8 @@ namespace llvm {
/// SimplifyInstruction - See if we can compute a simplified version of this /// SimplifyInstruction - See if we can compute a simplified version of this
/// instruction. If not, this returns null. /// instruction. If not, this returns null.
/// WARNING: If called on unreachable code, an instruction may be reported
/// to simplify to itself.
Value *SimplifyInstruction(Instruction *I, const TargetData *TD = 0); Value *SimplifyInstruction(Instruction *I, const TargetData *TD = 0);

View File

@ -69,6 +69,10 @@ bool RecursivelyDeleteDeadPHINode(PHINode *PN);
/// ///
/// This returns true if it changed the code, note that it can delete /// This returns true if it changed the code, note that it can delete
/// instructions in other blocks as well in this block. /// instructions in other blocks as well in this block.
///
/// WARNING: Do not use this function on unreachable blocks, as recursive
/// simplification is not able to handle corner-case scenarios that can
/// arise in them.
bool SimplifyInstructionsInBlock(BasicBlock *BB, const TargetData *TD = 0); bool SimplifyInstructionsInBlock(BasicBlock *BB, const TargetData *TD = 0);
//===----------------------------------------------------------------------===// //===----------------------------------------------------------------------===//

View File

@ -423,44 +423,31 @@ Value *llvm::SimplifyCmpInst(unsigned Predicate, Value *LHS, Value *RHS,
/// SimplifyInstruction - See if we can compute a simplified version of this /// SimplifyInstruction - See if we can compute a simplified version of this
/// instruction. If not, this returns null. /// instruction. If not, this returns null.
Value *llvm::SimplifyInstruction(Instruction *I, const TargetData *TD) { Value *llvm::SimplifyInstruction(Instruction *I, const TargetData *TD) {
Value *Ret = 0;
switch (I->getOpcode()) { switch (I->getOpcode()) {
default: default:
return ConstantFoldInstruction(I, TD); return ConstantFoldInstruction(I, TD);
case Instruction::Add: case Instruction::Add:
Ret = SimplifyAddInst(I->getOperand(0), I->getOperand(1), return SimplifyAddInst(I->getOperand(0), I->getOperand(1),
cast<BinaryOperator>(I)->hasNoSignedWrap(), cast<BinaryOperator>(I)->hasNoSignedWrap(),
cast<BinaryOperator>(I)->hasNoUnsignedWrap(), TD); cast<BinaryOperator>(I)->hasNoUnsignedWrap(), TD);
break;
case Instruction::And: case Instruction::And:
Ret = SimplifyAndInst(I->getOperand(0), I->getOperand(1), TD); return SimplifyAndInst(I->getOperand(0), I->getOperand(1), TD);
break;
case Instruction::Or: case Instruction::Or:
Ret = SimplifyOrInst(I->getOperand(0), I->getOperand(1), TD); return SimplifyOrInst(I->getOperand(0), I->getOperand(1), TD);
break;
case Instruction::ICmp: case Instruction::ICmp:
Ret = SimplifyICmpInst(cast<ICmpInst>(I)->getPredicate(), return SimplifyICmpInst(cast<ICmpInst>(I)->getPredicate(),
I->getOperand(0), I->getOperand(1), TD); I->getOperand(0), I->getOperand(1), TD);
break;
case Instruction::FCmp: case Instruction::FCmp:
Ret = SimplifyFCmpInst(cast<FCmpInst>(I)->getPredicate(), return SimplifyFCmpInst(cast<FCmpInst>(I)->getPredicate(),
I->getOperand(0), I->getOperand(1), TD); I->getOperand(0), I->getOperand(1), TD);
break;
case Instruction::Select: case Instruction::Select:
Ret = SimplifySelectInst(I->getOperand(0), I->getOperand(1), return SimplifySelectInst(I->getOperand(0), I->getOperand(1),
I->getOperand(2), TD); I->getOperand(2), TD);
break;
case Instruction::GetElementPtr: { case Instruction::GetElementPtr: {
SmallVector<Value*, 8> Ops(I->op_begin(), I->op_end()); SmallVector<Value*, 8> Ops(I->op_begin(), I->op_end());
Ret = SimplifyGEPInst(&Ops[0], Ops.size(), TD); return 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 /// ReplaceAndSimplifyAllUses - Perform From->replaceAllUsesWith(To) and then