diff --git a/include/llvm/Metadata.h b/include/llvm/Metadata.h
index 2f740a6..8ad7aaf 100644
--- a/include/llvm/Metadata.h
+++ b/include/llvm/Metadata.h
@@ -342,8 +342,8 @@
   /// getMDs - Get the metadata attached with an Instruction.
   const MDMapTy *getMDs(const Instruction *Inst);
 
-  /// setMD - Attach the metadata of given kind with an Instruction.
-  void setMD(unsigned Kind, MDNode *Node, Instruction *Inst);
+  /// addMD - Attach the metadata of given kind with an Instruction.
+  void addMD(unsigned Kind, MDNode *Node, Instruction *Inst);
   
   /// getHandlerNames - Get handler names. This is used by bitcode
   /// writer.
diff --git a/include/llvm/Support/IRBuilder.h b/include/llvm/Support/IRBuilder.h
index b5e1787..1f65978 100644
--- a/include/llvm/Support/IRBuilder.h
+++ b/include/llvm/Support/IRBuilder.h
@@ -148,7 +148,7 @@
   /// SetDebugLocation -  Set location information for the given instruction.
   void SetDebugLocation(Instruction *I) {
     if (CurDbgLocation)
-      Context.getMetadata().setMD(MDKind, CurDbgLocation, I);
+      Context.getMetadata().addMD(MDKind, CurDbgLocation, I);
   }
 
   /// Insert - Insert and return the specified instruction.
@@ -156,7 +156,7 @@
   InstTy *Insert(InstTy *I, const Twine &Name = "") const {
     this->InsertHelper(I, Name, BB, InsertPt);
     if (CurDbgLocation)
-      Context.getMetadata().setMD(MDKind, CurDbgLocation, I);
+      Context.getMetadata().addMD(MDKind, CurDbgLocation, I);
     return I;
   }
 
diff --git a/lib/AsmParser/LLParser.cpp b/lib/AsmParser/LLParser.cpp
index 9e80159..42ce953 100644
--- a/lib/AsmParser/LLParser.cpp
+++ b/lib/AsmParser/LLParser.cpp
@@ -2665,7 +2665,7 @@
     MetadataContext &TheMetadata = M->getContext().getMetadata();
     for (SmallVector<std::pair<unsigned, MDNode *>, 2>::iterator
            MDI = MDsOnInst.begin(), MDE = MDsOnInst.end(); MDI != MDE; ++MDI)
-      TheMetadata.setMD(MDI->first, MDI->second, Inst);
+      TheMetadata.addMD(MDI->first, MDI->second, Inst);
     MDsOnInst.clear();
 
     BB->getInstList().push_back(Inst);
diff --git a/lib/Bitcode/Reader/BitcodeReader.cpp b/lib/Bitcode/Reader/BitcodeReader.cpp
index f5ddd3f..fe0366f 100644
--- a/lib/Bitcode/Reader/BitcodeReader.cpp
+++ b/lib/Bitcode/Reader/BitcodeReader.cpp
@@ -1582,7 +1582,7 @@
       for (unsigned i = 1; i != RecordLength; i = i+2) {
         unsigned Kind = Record[i];
         Value *Node = MDValueList.getValueFwdRef(Record[i+1]);
-        TheMetadata.setMD(Kind, cast<MDNode>(Node), Inst);
+        TheMetadata.addMD(Kind, cast<MDNode>(Node), Inst);
       }
       break;
     }
diff --git a/lib/VMCore/Metadata.cpp b/lib/VMCore/Metadata.cpp
index 0a8e865..6e2fc3f 100644
--- a/lib/VMCore/Metadata.cpp
+++ b/lib/VMCore/Metadata.cpp
@@ -300,18 +300,29 @@
   return I->getValue();
 }
 
-/// setMD - Attach the metadata of given kind with an Instruction.
-void MetadataContext::setMD(unsigned MDKind, MDNode *Node, Instruction *Inst) {
-  MDStoreTy::iterator I = MetadataStore.find(Inst);
+/// addMD - Attach the metadata of given kind with an Instruction.
+void MetadataContext::addMD(unsigned MDKind, MDNode *Node, Instruction *Inst) {
+  assert (Node && "Unable to add custome metadata");
   Inst->HasMetadata = true;
+  MDStoreTy::iterator I = MetadataStore.find(Inst);
   if (I == MetadataStore.end()) {
     MDMapTy Info;
     Info.push_back(std::make_pair(MDKind, Node));
     MetadataStore.insert(std::make_pair(Inst, Info));
     return;
   }
-  
+
   MDMapTy &Info = I->second;
+  // If there is an entry for this MDKind then replace it.
+  for (unsigned i = 0, e = Info.size(); i != e; ++i) {
+    MDPairTy &P = Info[i];
+    if (P.first == MDKind) {
+      Info[i] = std::make_pair(MDKind, Node);
+      return;
+    }
+  }
+
+  // Otherwise add a new entry.
   Info.push_back(std::make_pair(MDKind, Node));
   return;
 }
@@ -319,16 +330,15 @@
 /// getMD - Get the metadata of given kind attached with an Instruction.
 /// If the metadata is not found then return 0.
 MDNode *MetadataContext::getMD(unsigned MDKind, const Instruction *Inst) {
-  MDNode *Node = NULL;
   MDStoreTy::iterator I = MetadataStore.find(Inst);
   if (I == MetadataStore.end())
-    return Node;
+    return NULL;
   
   MDMapTy &Info = I->second;
   for (MDMapTy::iterator I = Info.begin(), E = Info.end(); I != E; ++I)
     if (I->first == MDKind)
-      Node = dyn_cast_or_null<MDNode>(I->second);
-  return Node;
+      return dyn_cast_or_null<MDNode>(I->second);
+  return NULL;
 }
 
 /// getMDs - Get the metadata attached with an Instruction.
@@ -374,5 +384,5 @@
   MDMapTy In2Info;
   for (MDMapTy::iterator I = In1Info.begin(), E = In1Info.end(); I != E; ++I)
     if (MDNode *MD = dyn_cast_or_null<MDNode>(I->second))
-      setMD(I->first, MD, In2);
+      addMD(I->first, MD, In2);
 }
