aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/VMCore/InstrTypes.cpp11
1 files changed, 10 insertions, 1 deletions
diff --git a/lib/VMCore/InstrTypes.cpp b/lib/VMCore/InstrTypes.cpp
index b53f480b14..ff9d4059d2 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 <algorithm> // 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;
}