forked from OSchip/llvm-project
Fix bug: test/Regression/Other/2002-03-11-ConstPropCrash.ll
llvm-svn: 1858
This commit is contained in:
parent
7d1c5b31b6
commit
477fe0845a
|
@ -23,9 +23,11 @@ bool doConstantPropogation(BasicBlock *BB, BasicBlock::iterator &I);
|
|||
|
||||
// ConstantFoldTerminator - If a terminator instruction is predicated on a
|
||||
// constant value, convert it into an unconditional branch to the constant
|
||||
// destination.
|
||||
// destination. This is a nontrivial operation because the successors of this
|
||||
// basic block must have their PHI nodes updated.
|
||||
//
|
||||
bool ConstantFoldTerminator(TerminatorInst *T);
|
||||
bool ConstantFoldTerminator(BasicBlock *BB, BasicBlock::iterator &I,
|
||||
TerminatorInst *T);
|
||||
|
||||
|
||||
//===----------------------------------------------------------------------===//
|
||||
|
|
|
@ -102,7 +102,8 @@ ConstantFoldBinaryInst(BasicBlock *BB, BasicBlock::iterator &II,
|
|||
// constant value, convert it into an unconditional branch to the constant
|
||||
// destination.
|
||||
//
|
||||
bool ConstantFoldTerminator(TerminatorInst *T) {
|
||||
bool ConstantFoldTerminator(BasicBlock *BB, BasicBlock::iterator &II,
|
||||
TerminatorInst *T) {
|
||||
// Branch - See if we are conditional jumping on constant
|
||||
if (BranchInst *BI = dyn_cast<BranchInst>(T)) {
|
||||
if (BI->isUnconditional()) return false; // Can't optimize uncond branch
|
||||
|
@ -127,6 +128,7 @@ bool ConstantFoldTerminator(TerminatorInst *T) {
|
|||
// Set the unconditional destination, and change the insn to be an
|
||||
// unconditional branch.
|
||||
BI->setUnconditionalDest(Destination);
|
||||
II = BB->end()-1; // Update instruction iterator!
|
||||
return true;
|
||||
}
|
||||
#if 0
|
||||
|
@ -171,7 +173,7 @@ bool doConstantPropogation(BasicBlock *BB, BasicBlock::iterator &II) {
|
|||
Constant *D = dyn_cast<Constant>(UInst->getOperand(0));
|
||||
if (D) return ConstantFoldUnaryInst(BB, II, UInst, D);
|
||||
} else if (TerminatorInst *TInst = dyn_cast<TerminatorInst>(Inst)) {
|
||||
return ConstantFoldTerminator(TInst);
|
||||
return ConstantFoldTerminator(BB, II, TInst);
|
||||
|
||||
} else if (PHINode *PN = dyn_cast<PHINode>(Inst)) {
|
||||
// If it's a PHI node and only has one operand
|
||||
|
|
|
@ -270,7 +270,7 @@ bool SCCP::doSCCP() {
|
|||
// Hey, we just changed something!
|
||||
MadeChanges = true;
|
||||
} else if (TerminatorInst *TI = dyn_cast<TerminatorInst>(Inst)) {
|
||||
MadeChanges |= ConstantFoldTerminator(TI);
|
||||
MadeChanges |= ConstantFoldTerminator(BB, BI, TI);
|
||||
}
|
||||
|
||||
++BI;
|
||||
|
|
Loading…
Reference in New Issue