From 8bcb768a9c2bd2a39c066b61b843611920ade3b3 Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Tue, 8 Oct 2002 21:34:58 +0000 Subject: [PATCH] - Change PHINode::removeIncomingValue to delete the phi node if the last incoming value is removed! git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@4078 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/VMCore/InstrTypes.cpp | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/lib/VMCore/InstrTypes.cpp b/lib/VMCore/InstrTypes.cpp index b53f480b148..ff9d4059d24 100644 --- a/lib/VMCore/InstrTypes.cpp +++ b/lib/VMCore/InstrTypes.cpp @@ -8,6 +8,7 @@ #include "llvm/iPHINode.h" #include "llvm/Function.h" #include "llvm/SymbolTable.h" +#include "llvm/Constant.h" #include "llvm/Type.h" #include // find @@ -41,11 +42,19 @@ void PHINode::addIncoming(Value *D, BasicBlock *BB) { // removeIncomingValue - Remove an incoming value. This is useful if a // predecessor basic block is deleted. -Value *PHINode::removeIncomingValue(const BasicBlock *BB) { +Value *PHINode::removeIncomingValue(const BasicBlock *BB, + bool DeletePHIIfEmpty) { 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 + + // 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); + } return Removed; }