diff options
-rw-r--r-- | include/llvm/Metadata.h | 2 | ||||
-rw-r--r-- | lib/VMCore/Metadata.cpp | 21 |
2 files changed, 10 insertions, 13 deletions
diff --git a/include/llvm/Metadata.h b/include/llvm/Metadata.h index 7cfaeafa8f..1ece55935f 100644 --- a/include/llvm/Metadata.h +++ b/include/llvm/Metadata.h @@ -102,7 +102,7 @@ class MDNode : public MetadataBase, public FoldingSetNode { }; // Replace each instance of F from the element list of this node with T. - void replaceElement(Value *F, Value *T); + void replaceElement(MDNodeElement *Op, Value *NewVal); protected: explicit MDNode(LLVMContext &C, Value *const *Vals, unsigned NumVals, diff --git a/lib/VMCore/Metadata.cpp b/lib/VMCore/Metadata.cpp index eddd8b070a..0a3ddcbbe1 100644 --- a/lib/VMCore/Metadata.cpp +++ b/lib/VMCore/Metadata.cpp @@ -76,11 +76,11 @@ public: void MDNodeElement::deleted() { - Parent->replaceElement(this->operator Value*(), 0); + Parent->replaceElement(this, 0); } void MDNodeElement::allUsesReplacedWith(Value *NV) { - Parent->replaceElement(this->operator Value*(), NV); + Parent->replaceElement(this, NV); } @@ -142,8 +142,10 @@ Value *MDNode::getElement(unsigned i) const { // Replace value from this node's element list. -void MDNode::replaceElement(Value *From, Value *To) { - if (From == To || !getType()) +void MDNode::replaceElement(MDNodeElement *Op, Value *To) { + Value *From = *Op; + + if (From == To) return; LLVMContextImpl *pImpl = getType()->getContext().pImpl; @@ -151,14 +153,9 @@ void MDNode::replaceElement(Value *From, Value *To) { // Remove "this" from the context map. FoldingSet doesn't have to reprofile // this node to remove it, so we don't care what state the operands are in. pImpl->MDNodeSet.RemoveNode(this); - - // Find value. This is a linear search, do something if it consumes - // lot of time. It is possible that to have multiple instances of - // From in this MDNode's element list. - for (unsigned i = 0, e = getNumElements(); i != e; ++i) { - if (Operands[i] == From) - Operands[i].set(To, this); - } + + // Update the operand. + Op->set(To, this); // Insert updated "this" into the context's folding node set. // If a node with same element list already exist then before inserting |