-Value *PHINode::removeIncomingValue(const BasicBlock *BB) {
- op_iterator Idx = find(Operands.begin(), Operands.end(), (const Value*)BB);
- assert(Idx != Operands.end() && "BB not in PHI node!");
- --Idx; // Back up to value prior to Basic block
- Value *Removed = *Idx;
- Operands.erase(Idx, Idx+2); // Erase Value and BasicBlock
+Value *PHINode::removeIncomingValue(unsigned Idx, bool DeletePHIIfEmpty) {
+ assert(Idx*2 < Operands.size() && "BB not in PHI node!");
+ Value *Removed = Operands[Idx*2];
+ Operands.erase(Operands.begin()+Idx*2, // Erase Value and BasicBlock
+ Operands.begin()+Idx*2+2);
+
+ // If the PHI node is dead, because it has zero entries, nuke it now.
+ if (getNumOperands() == 0 && DeletePHIIfEmpty) {
+ // If anyone is using this PHI, make them use a dummy value instead...
+ replaceAllUsesWith(Constant::getNullValue(getType()));
+ getParent()->getInstList().erase(this);
+ }