From 05ddff9b98e331202682eefc09520138cbd4c83a Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Wed, 5 Mar 2003 21:15:12 +0000 Subject: [PATCH] Simplify some of the PHI node interfaces git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@5700 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/iPHINode.h | 16 +++++++++++++--- lib/VMCore/InstrTypes.cpp | 19 +++++-------------- 2 files changed, 18 insertions(+), 17 deletions(-) diff --git a/include/llvm/iPHINode.h b/include/llvm/iPHINode.h index 4e217e971e8..c9d2a71ecbd 100644 --- a/include/llvm/iPHINode.h +++ b/include/llvm/iPHINode.h @@ -61,7 +61,12 @@ public: } /// addIncoming - Add an incoming value to the end of the PHI list - void addIncoming(Value *D, BasicBlock *BB); + void addIncoming(Value *D, BasicBlock *BB) { + assert(getType() == D->getType() && + "All operands to PHI node must be the same type as the PHI node!"); + Operands.push_back(Use(D, this)); + Operands.push_back(Use((Value*)BB, this)); + } /// removeIncomingValue - Remove an incoming value. This is useful if a /// predecessor basic block is deleted. The value removed is returned. @@ -71,8 +76,13 @@ public: /// dummy values. The only time there should be zero incoming values to a PHI /// node is when the block is dead, so this strategy is sound. /// - Value *removeIncomingValue(const BasicBlock *BB, - bool DeletePHIIfEmpty = true); + Value *removeIncomingValue(unsigned Idx, bool DeletePHIIfEmpty = true); + + Value *removeIncomingValue(const BasicBlock *BB, bool DeletePHIIfEmpty =true){ + int Idx = getBasicBlockIndex(BB); + assert(Idx >= 0 && "Invalid basic block argument to remove!"); + return removeIncomingValue(Idx, DeletePHIIfEmpty); + } /// getBasicBlockIndex - Return the first index of the specified basic /// block in the value list for this PHI. Returns -1 if no instance. diff --git a/lib/VMCore/InstrTypes.cpp b/lib/VMCore/InstrTypes.cpp index ff9d4059d24..f1b5c4f1005 100644 --- a/lib/VMCore/InstrTypes.cpp +++ b/lib/VMCore/InstrTypes.cpp @@ -33,22 +33,13 @@ PHINode::PHINode(const PHINode &PN) } } -void PHINode::addIncoming(Value *D, BasicBlock *BB) { - assert(getType() == D->getType() && - "All operands to PHI node must be the same type as the PHI node!"); - Operands.push_back(Use(D, this)); - Operands.push_back(Use(BB, this)); -} - // removeIncomingValue - Remove an incoming value. This is useful if a // predecessor basic block is deleted. -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 +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) {