summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorOwen Anderson <resistor@mac.com>2010-09-16 20:51:41 +0000
committerOwen Anderson <resistor@mac.com>2010-09-16 20:51:41 +0000
commitc33cdcfd80e6f60a9429a7cd6f88ace5ce8f0bb7 (patch)
treeeb8e60e48aa39a1f717e2b40400f5b09f760b010
parent74d320db9719be8ea594c875df0e4b11030d9fbe (diff)
downloadbcm5719-llvm-c33cdcfd80e6f60a9429a7cd6f88ace5ce8f0bb7.tar.gz
bcm5719-llvm-c33cdcfd80e6f60a9429a7cd6f88ace5ce8f0bb7.zip
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. llvm-svn: 114117
-rw-r--r--llvm/include/llvm/Analysis/InstructionSimplify.h2
-rw-r--r--llvm/include/llvm/Transforms/Utils/Local.h4
-rw-r--r--llvm/lib/Analysis/InstructionSimplify.cpp35
3 files changed, 17 insertions, 24 deletions
diff --git a/llvm/include/llvm/Analysis/InstructionSimplify.h b/llvm/include/llvm/Analysis/InstructionSimplify.h
index f47e740a741..913fd77da3c 100644
--- a/llvm/include/llvm/Analysis/InstructionSimplify.h
+++ b/llvm/include/llvm/Analysis/InstructionSimplify.h
@@ -71,6 +71,8 @@ namespace llvm {
/// SimplifyInstruction - See if we can compute a simplified version of this
/// 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);
diff --git a/llvm/include/llvm/Transforms/Utils/Local.h b/llvm/include/llvm/Transforms/Utils/Local.h
index caae27f47a4..dc18f3c4c7c 100644
--- a/llvm/include/llvm/Transforms/Utils/Local.h
+++ b/llvm/include/llvm/Transforms/Utils/Local.h
@@ -69,6 +69,10 @@ bool RecursivelyDeleteDeadPHINode(PHINode *PN);
///
/// This returns true if it changed the code, note that it can delete
/// 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);
//===----------------------------------------------------------------------===//
diff --git a/llvm/lib/Analysis/InstructionSimplify.cpp b/llvm/lib/Analysis/InstructionSimplify.cpp
index 5bc117d8a05..b49b4d0c6ab 100644
--- a/llvm/lib/Analysis/InstructionSimplify.cpp
+++ b/llvm/lib/Analysis/InstructionSimplify.cpp
@@ -423,44 +423,31 @@ 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:
- Ret = SimplifyAddInst(I->getOperand(0), I->getOperand(1),
- cast<BinaryOperator>(I)->hasNoSignedWrap(),
- cast<BinaryOperator>(I)->hasNoUnsignedWrap(), TD);
- break;
+ return SimplifyAddInst(I->getOperand(0), I->getOperand(1),
+ cast<BinaryOperator>(I)->hasNoSignedWrap(),
+ cast<BinaryOperator>(I)->hasNoUnsignedWrap(), TD);
case Instruction::And:
- Ret = SimplifyAndInst(I->getOperand(0), I->getOperand(1), TD);
- break;
+ return SimplifyAndInst(I->getOperand(0), I->getOperand(1), TD);
case Instruction::Or:
- Ret = SimplifyOrInst(I->getOperand(0), I->getOperand(1), TD);
- break;
+ return SimplifyOrInst(I->getOperand(0), I->getOperand(1), TD);
case Instruction::ICmp:
- Ret = SimplifyICmpInst(cast<ICmpInst>(I)->getPredicate(),
- I->getOperand(0), I->getOperand(1), TD);
- break;
+ return SimplifyICmpInst(cast<ICmpInst>(I)->getPredicate(),
+ I->getOperand(0), I->getOperand(1), TD);
case Instruction::FCmp:
- Ret = SimplifyFCmpInst(cast<FCmpInst>(I)->getPredicate(),
- I->getOperand(0), I->getOperand(1), TD);
- break;
+ return SimplifyFCmpInst(cast<FCmpInst>(I)->getPredicate(),
+ I->getOperand(0), I->getOperand(1), TD);
case Instruction::Select:
- Ret = SimplifySelectInst(I->getOperand(0), I->getOperand(1),
+ return 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());
- Ret = SimplifyGEPInst(&Ops[0], Ops.size(), TD);
- break;
+ return SimplifyGEPInst(&Ops[0], Ops.size(), TD);
}
}
-
- // 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
OpenPOWER on IntegriCloud