1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-10-20 19:42:54 +02:00

* Use simplified interface to constant propogation stuff.

* Remove dead PHI case (which could not work due to getNumOperands rather than
  getNumIncomingValues.  This really belongs in InstCombine, anyway so we'll
  move it there.

llvm-svn: 2497
This commit is contained in:
Chris Lattner 2002-05-06 17:54:10 +00:00
parent 47fb300c56
commit 910ca80941

View File

@ -179,43 +179,16 @@ bool ConstantFoldTerminator(BasicBlock *BB, BasicBlock::iterator &II,
// //
bool doConstantPropogation(BasicBlock *BB, BasicBlock::iterator &II) { bool doConstantPropogation(BasicBlock *BB, BasicBlock::iterator &II) {
Instruction *Inst = *II; Instruction *Inst = *II;
if (BinaryOperator *BO = dyn_cast<BinaryOperator>(Inst)) { if (TerminatorInst *TInst = dyn_cast<TerminatorInst>(Inst)) {
Constant *D1 = dyn_cast<Constant>(BO->getOperand(0));
Constant *D2 = dyn_cast<Constant>(BO->getOperand(1));
if (D1 && D2)
return ConstantFoldBinaryInst(BB, II, BO, D1, D2);
} else if (CastInst *CI = dyn_cast<CastInst>(Inst)) {
Constant *D = dyn_cast<Constant>(CI->getOperand(0));
if (D) return ConstantFoldCast(BB, II, CI, D);
} else if (UnaryOperator *UInst = dyn_cast<UnaryOperator>(Inst)) {
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(BB, II, TInst); return ConstantFoldTerminator(BB, II, TInst);
} else if (Constant *C = ConstantFoldInstruction(Inst)) {
// Replaces all of the uses of a variable with uses of the constant.
Inst->replaceAllUsesWith(C);
} else if (PHINode *PN = dyn_cast<PHINode>(Inst)) { // Remove the instruction from the basic block...
// If it's a PHI node and only has one operand delete BB->getInstList().remove(II);
// Then replace it directly with that operand.
assert(PN->getNumOperands() && "PHI Node must have at least one operand!");
if (PN->getNumOperands() == 1) { // If the PHI Node has exactly 1 operand
Value *V = PN->getOperand(0);
PN->replaceAllUsesWith(V); // Replace all uses of this PHI
// Unlink from basic block
PN->getParent()->getInstList().remove(II);
if (PN->hasName()) // Inherit PHINode name
V->setName(PN->getName(), BB->getParent()->getSymbolTableSure());
delete PN; // Finally, delete the node...
return true; return true;
}
} else if (ShiftInst *SI = dyn_cast<ShiftInst>(Inst)) {
Constant *D1 = dyn_cast<Constant>(SI->getOperand(0));
Constant *D2 = dyn_cast<Constant>(SI->getOperand(1));
if (D1 && D2)
return ConstantFoldShiftInst(BB, II, SI, D1, D2);
} }
return false; return false;