avoid a completely unneeded linear walk.
authorChris Lattner <sabre@nondot.org>
Mon, 28 Dec 2009 09:32:10 +0000 (09:32 +0000)
committerChris Lattner <sabre@nondot.org>
Mon, 28 Dec 2009 09:32:10 +0000 (09:32 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@92221 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/Metadata.h
lib/VMCore/Metadata.cpp

index 7cfaeafa8f1d7777e36424ed3a582dabb5d4f0b5..1ece55935f94eb0197bb387d88ce99d9123c433e 100644 (file)
@@ -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,
index eddd8b070a6e9b69beb7dd72bd00dd4d85d2b99f..0a3ddcbbe1b6361cde546a7baa7ac77c57660d5e 100644 (file)
@@ -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