<div dir="ltr"><br><div class="gmail_extra"><br><div class="gmail_quote">On Mon, Jan 19, 2015 at 1:30 PM, Duncan P. N. Exon Smith <span dir="ltr"><<a href="mailto:dexonsmith@apple.com" target="_blank">dexonsmith@apple.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: dexonsmith<br>
Date: Mon Jan 19 15:30:18 2015<br>
New Revision: 226504<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=226504&view=rev" target="_blank">http://llvm.org/viewvc/llvm-project?rev=226504&view=rev</a><br>
Log:<br>
IR: Return unique_ptr from MDNode::getTemporary()<br>
<br>
Change `MDTuple::getTemporary()` and `MDLocation::getTemporary()` to<br>
return (effectively) `std::unique_ptr<T, MDNode::deleteTemporary>`, and<br>
clean up call sites.  (For now, `DIBuilder` call sites just call<br>
`release()` immediately.)<br>
<br>
There's an accompanying change in each of clang and polly to use the new<br>
API.<br>
<br>
Modified:<br>
    llvm/trunk/bindings/go/llvm/IRBindings.cpp<br>
    llvm/trunk/include/llvm/IR/Metadata.h<br>
    llvm/trunk/lib/AsmParser/LLParser.cpp<br>
    llvm/trunk/lib/AsmParser/LLParser.h<br>
    llvm/trunk/lib/Bitcode/Reader/BitcodeReader.cpp<br>
    llvm/trunk/lib/IR/DIBuilder.cpp<br>
    llvm/trunk/lib/IR/MDBuilder.cpp<br>
    llvm/trunk/lib/Transforms/Utils/InlineFunction.cpp<br>
    llvm/trunk/lib/Transforms/Utils/ValueMapper.cpp<br>
    llvm/trunk/unittests/IR/MetadataTest.cpp<br>
<br>
Modified: llvm/trunk/bindings/go/llvm/IRBindings.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/bindings/go/llvm/IRBindings.cpp?rev=226504&r1=226503&r2=226504&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/bindings/go/llvm/IRBindings.cpp?rev=226504&r1=226503&r2=226504&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/bindings/go/llvm/IRBindings.cpp (original)<br>
+++ llvm/trunk/bindings/go/llvm/IRBindings.cpp Mon Jan 19 15:30:18 2015<br>
@@ -66,8 +66,9 @@ LLVMMetadataRef LLVMMDNode2(LLVMContextR<br>
<br>
 LLVMMetadataRef LLVMTemporaryMDNode(LLVMContextRef C, LLVMMetadataRef *MDs,<br>
                                     unsigned Count) {<br>
-  return wrap(MDNode::getTemporary(*unwrap(C),<br>
-                                   ArrayRef<Metadata *>(unwrap(MDs), Count)));<br>
+  return wrap(MDTuple::getTemporary(*unwrap(C),<br>
+                                    ArrayRef<Metadata *>(unwrap(MDs), Count))<br>
+                  .release());<br>
 }<br>
<br>
 void LLVMAddNamedMetadataOperand2(LLVMModuleRef M, const char *name,<br>
<br>
Modified: llvm/trunk/include/llvm/IR/Metadata.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/IR/Metadata.h?rev=226504&r1=226503&r2=226504&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/IR/Metadata.h?rev=226504&r1=226503&r2=226504&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/include/llvm/IR/Metadata.h (original)<br>
+++ llvm/trunk/include/llvm/IR/Metadata.h Mon Jan 19 15:30:18 2015<br>
@@ -651,6 +651,15 @@ public:<br>
   }<br>
 };<br>
<br>
+template <class T><br>
+struct TempMDNodeDeleter {<br>
+  inline void operator()(T *Node) const;<br>
+};<br>
+<br>
+#define HANDLE_UNIQUABLE_LEAF(CLASS)                                           \<br>
+  typedef std::unique_ptr<CLASS, TempMDNodeDeleter<CLASS>> Temp##CLASS;<br></blockquote><div><br>I thought temporary MDNodes could just be "delete"d now? Why the custom deleter, then? (we discussed making getTemporary return unique_ptr a week or two ago)<br><br>(I guess there's some more recent changes that have/will necessitate this?)<br> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
+#include "llvm/IR/Metadata.def"<br>
+<br>
 //===----------------------------------------------------------------------===//<br>
 /// \brief Tuple of metadata.<br>
 class MDNode : public Metadata {<br>
@@ -697,8 +706,8 @@ public:<br>
                                      ArrayRef<Metadata *> MDs);<br>
   static inline MDTuple *getDistinct(LLVMContext &Context,<br>
                                      ArrayRef<Metadata *> MDs);<br>
-  static inline MDTuple *getTemporary(LLVMContext &Context,<br>
-                                      ArrayRef<Metadata *> MDs);<br>
+  static inline TempMDTuple getTemporary(LLVMContext &Context,<br>
+                                         ArrayRef<Metadata *> MDs);<br>
<br>
   /// \brief Deallocate a node created by getTemporary.<br>
   ///<br>
@@ -884,8 +893,9 @@ public:<br>
   /// For use in constructing cyclic MDNode structures. A temporary MDNode is<br>
   /// not uniqued, may be RAUW'd, and must be manually deleted with<br>
   /// deleteTemporary.<br>
-  static MDTuple *getTemporary(LLVMContext &Context, ArrayRef<Metadata *> MDs) {<br>
-    return getImpl(Context, MDs, Temporary);<br>
+  static TempMDTuple getTemporary(LLVMContext &Context,<br>
+                                  ArrayRef<Metadata *> MDs) {<br>
+    return TempMDTuple(getImpl(Context, MDs, Temporary));<br>
   }<br>
<br>
   static bool classof(const Metadata *MD) {<br>
@@ -906,9 +916,14 @@ MDTuple *MDNode::getIfExists(LLVMContext<br>
 MDTuple *MDNode::getDistinct(LLVMContext &Context, ArrayRef<Metadata *> MDs) {<br>
   return MDTuple::getDistinct(Context, MDs);<br>
 }<br>
-MDTuple *MDNode::getTemporary(LLVMContext &Context, ArrayRef<Metadata *> MDs) {<br>
+TempMDTuple MDNode::getTemporary(LLVMContext &Context,<br>
+                                 ArrayRef<Metadata *> MDs) {<br>
   return MDTuple::getTemporary(Context, MDs);<br>
 }<br>
+template <class T><br>
+void TempMDNodeDeleter<T>::operator()(T *Node) const {<br>
+  MDNode::deleteTemporary(Node);<br>
+}<br>
<br>
 /// \brief Debug location.<br>
 ///<br>
@@ -945,10 +960,11 @@ public:<br>
                                  Metadata *InlinedAt = nullptr) {<br>
     return getImpl(Context, Line, Column, Scope, InlinedAt, Distinct);<br>
   }<br>
-  static MDLocation *getTemporary(LLVMContext &Context, unsigned Line,<br>
-                                  unsigned Column, Metadata *Scope,<br>
-                                  Metadata *InlinedAt = nullptr) {<br>
-    return getImpl(Context, Line, Column, Scope, InlinedAt, Temporary);<br>
+  static TempMDLocation getTemporary(LLVMContext &Context, unsigned Line,<br>
+                                     unsigned Column, Metadata *Scope,<br>
+                                     Metadata *InlinedAt = nullptr) {<br>
+    return TempMDLocation(<br>
+        getImpl(Context, Line, Column, Scope, InlinedAt, Temporary));<br>
   }<br>
<br>
   unsigned getLine() const { return MDNodeSubclassData; }<br>
<br>
Modified: llvm/trunk/lib/AsmParser/LLParser.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/AsmParser/LLParser.cpp?rev=226504&r1=226503&r2=226504&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/AsmParser/LLParser.cpp?rev=226504&r1=226503&r2=226504&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/AsmParser/LLParser.cpp (original)<br>
+++ llvm/trunk/lib/AsmParser/LLParser.cpp Mon Jan 19 15:30:18 2015<br>
@@ -531,13 +531,13 @@ bool LLParser::ParseMDNodeID(MDNode *&Re<br>
   }<br>
<br>
   // Otherwise, create MDNode forward reference.<br>
-  MDTuple *FwdNode = MDTuple::getTemporary(Context, None);<br>
-  ForwardRefMDNodes[MID] = std::make_pair(FwdNode, Lex.getLoc());<br>
+  auto &FwdRef = ForwardRefMDNodes[MID];<br>
+  FwdRef = std::make_pair(MDTuple::getTemporary(Context, None), Lex.getLoc());<br>
<br>
   if (NumberedMetadata.size() <= MID)<br>
     NumberedMetadata.resize(MID+1);<br>
-  NumberedMetadata[MID].reset(FwdNode);<br>
-  Result = FwdNode;<br>
+  Result = FwdRef.first.get();<br>
+  NumberedMetadata[MID].reset(Result);<br>
   return false;<br>
 }<br>
<br>
@@ -597,9 +597,7 @@ bool LLParser::ParseStandaloneMetadata()<br>
   // See if this was forward referenced, if so, handle it.<br>
   auto FI = ForwardRefMDNodes.find(MetadataID);<br>
   if (FI != ForwardRefMDNodes.end()) {<br>
-    MDTuple *Temp = FI->second.first;<br>
-    Temp->replaceAllUsesWith(Init);<br>
-    MDNode::deleteTemporary(Temp);<br>
+    FI->second.first->replaceAllUsesWith(Init);<br>
     ForwardRefMDNodes.erase(FI);<br>
<br>
     assert(NumberedMetadata[MetadataID] == Init && "Tracking VH didn't work");<br>
<br>
Modified: llvm/trunk/lib/AsmParser/LLParser.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/AsmParser/LLParser.h?rev=226504&r1=226503&r2=226504&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/AsmParser/LLParser.h?rev=226504&r1=226503&r2=226504&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/AsmParser/LLParser.h (original)<br>
+++ llvm/trunk/lib/AsmParser/LLParser.h Mon Jan 19 15:30:18 2015<br>
@@ -136,7 +136,7 @@ namespace llvm {<br>
     std::vector<std::pair<Type*, LocTy> > NumberedTypes;<br>
<br>
     std::vector<TrackingMDNodeRef> NumberedMetadata;<br>
-    std::map<unsigned, std::pair<MDTuple *, LocTy>> ForwardRefMDNodes;<br>
+    std::map<unsigned, std::pair<TempMDTuple, LocTy>> ForwardRefMDNodes;<br>
<br>
     // Global Value reference information.<br>
     std::map<std::string, std::pair<GlobalValue*, LocTy> > ForwardRefVals;<br>
<br>
Modified: llvm/trunk/lib/Bitcode/Reader/BitcodeReader.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Bitcode/Reader/BitcodeReader.cpp?rev=226504&r1=226503&r2=226504&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Bitcode/Reader/BitcodeReader.cpp?rev=226504&r1=226503&r2=226504&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/Bitcode/Reader/BitcodeReader.cpp (original)<br>
+++ llvm/trunk/lib/Bitcode/Reader/BitcodeReader.cpp Mon Jan 19 15:30:18 2015<br>
@@ -541,9 +541,8 @@ void BitcodeReaderMDValueList::AssignVal<br>
   }<br>
<br>
   // If there was a forward reference to this value, replace it.<br>
-  MDTuple *PrevMD = cast<MDTuple>(OldMD.get());<br>
+  TempMDTuple PrevMD(cast<MDTuple>(OldMD.get()));<br>
   PrevMD->replaceAllUsesWith(MD);<br>
-  MDNode::deleteTemporary(PrevMD);<br>
   --NumFwdRefs;<br>
 }<br>
<br>
@@ -557,7 +556,7 @@ Metadata *BitcodeReaderMDValueList::getV<br>
   // Create and return a placeholder, which will later be RAUW'd.<br>
   AnyFwdRefs = true;<br>
   ++NumFwdRefs;<br>
-  Metadata *MD = MDNode::getTemporary(Context, None);<br>
+  Metadata *MD = MDNode::getTemporary(Context, None).release();<br>
   MDValuePtrs[Idx].reset(MD);<br>
   return MD;<br>
 }<br>
<br>
Modified: llvm/trunk/lib/IR/DIBuilder.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/IR/DIBuilder.cpp?rev=226504&r1=226503&r2=226504&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/IR/DIBuilder.cpp?rev=226504&r1=226503&r2=226504&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/IR/DIBuilder.cpp (original)<br>
+++ llvm/trunk/lib/IR/DIBuilder.cpp Mon Jan 19 15:30:18 2015<br>
@@ -142,15 +142,15 @@ DICompileUnit DIBuilder::createCompileUn<br>
   assert(!Filename.empty() &&<br>
          "Unable to create compile unit without filename");<br>
   Metadata *TElts[] = {HeaderBuilder::get(DW_TAG_base_type).get(VMContext)};<br>
-  TempEnumTypes = MDNode::getTemporary(VMContext, TElts);<br>
+  TempEnumTypes = MDNode::getTemporary(VMContext, TElts).release();<br>
<br>
-  TempRetainTypes = MDNode::getTemporary(VMContext, TElts);<br>
+  TempRetainTypes = MDNode::getTemporary(VMContext, TElts).release();<br>
<br>
-  TempSubprograms = MDNode::getTemporary(VMContext, TElts);<br>
+  TempSubprograms = MDNode::getTemporary(VMContext, TElts).release();<br>
<br>
-  TempGVs = MDNode::getTemporary(VMContext, TElts);<br>
+  TempGVs = MDNode::getTemporary(VMContext, TElts).release();<br>
<br>
-  TempImportedModules = MDNode::getTemporary(VMContext, TElts);<br>
+  TempImportedModules = MDNode::getTemporary(VMContext, TElts).release();<br>
<br>
   Metadata *Elts[] = {HeaderBuilder::get(dwarf::DW_TAG_compile_unit)<br>
                           .concat(Lang)<br>
@@ -825,7 +825,7 @@ DICompositeType DIBuilder::createReplace<br>
       nullptr, // TemplateParams<br>
       UniqueIdentifier.empty() ? nullptr<br>
                                : MDString::get(VMContext, UniqueIdentifier)};<br>
-  DICompositeType RetTy(MDNode::getTemporary(VMContext, Elts));<br>
+  DICompositeType RetTy(MDNode::getTemporary(VMContext, Elts).release());<br>
   assert(RetTy.isCompositeType() &&<br>
          "createReplaceableForwardDecl result should be a DIType");<br>
   if (!UniqueIdentifier.empty())<br>
@@ -903,7 +903,7 @@ DIGlobalVariable DIBuilder::createTempGl<br>
   return createGlobalVariableHelper(VMContext, Context, Name, LinkageName, F,<br>
                                     LineNumber, Ty, isLocalToUnit, Val, Decl,<br>
                                     false, [&](ArrayRef<Metadata *> Elts) {<br>
-    return MDNode::getTemporary(VMContext, Elts);<br>
+    return MDNode::getTemporary(VMContext, Elts).release();<br>
   });<br>
 }<br>
<br>
@@ -1007,7 +1007,7 @@ DISubprogram DIBuilder::createFunction(D<br>
   return createFunctionHelper(VMContext, Context, Name, LinkageName, File,<br>
                               LineNo, Ty, isLocalToUnit, isDefinition,<br>
                               ScopeLine, Flags, isOptimized, Fn, TParams, Decl,<br>
-                              MDNode::getTemporary(VMContext, None),<br>
+                              MDNode::getTemporary(VMContext, None).release(),<br>
                               [&](ArrayRef<Metadata *> Elts) -> MDNode *{<br>
     MDNode *Node = MDNode::get(VMContext, Elts);<br>
     // Create a named metadata so that we<br>
@@ -1030,7 +1030,7 @@ DIBuilder::createTempFunctionFwdDecl(DID<br>
                               LineNo, Ty, isLocalToUnit, isDefinition,<br>
                               ScopeLine, Flags, isOptimized, Fn, TParams, Decl,<br>
                               nullptr, [&](ArrayRef<Metadata *> Elts) {<br>
-    return MDNode::getTemporary(VMContext, Elts);<br>
+    return MDNode::getTemporary(VMContext, Elts).release();<br>
   });<br>
 }<br>
<br>
<br>
Modified: llvm/trunk/lib/IR/MDBuilder.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/IR/MDBuilder.cpp?rev=226504&r1=226503&r2=226504&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/IR/MDBuilder.cpp?rev=226504&r1=226503&r2=226504&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/IR/MDBuilder.cpp (original)<br>
+++ llvm/trunk/lib/IR/MDBuilder.cpp Mon Jan 19 15:30:18 2015<br>
@@ -68,9 +68,9 @@ MDNode *MDBuilder::createRange(const API<br>
<br>
 MDNode *MDBuilder::createAnonymousAARoot(StringRef Name, MDNode *Extra) {<br>
   // To ensure uniqueness the root node is self-referential.<br>
-  MDNode *Dummy = MDNode::getTemporary(Context, None);<br>
+  auto Dummy = MDNode::getTemporary(Context, None);<br>
<br>
-  SmallVector<Metadata *, 3> Args(1, Dummy);<br>
+  SmallVector<Metadata *, 3> Args(1, Dummy.get());<br>
   if (Extra)<br>
     Args.push_back(Extra);<br>
   if (!Name.empty())<br>
@@ -82,7 +82,7 @@ MDNode *MDBuilder::createAnonymousAARoot<br>
   //   !1 = metadata !{metadata !0} <- root<br>
   // Replace the dummy operand with the root node itself and delete the dummy.<br>
   Root->replaceOperandWith(0, Root);<br>
-  MDNode::deleteTemporary(Dummy);<br>
+<br>
   // We now have<br>
   //   !1 = metadata !{metadata !1} <- self-referential root<br>
   return Root;<br>
<br>
Modified: llvm/trunk/lib/Transforms/Utils/InlineFunction.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Utils/InlineFunction.cpp?rev=226504&r1=226503&r2=226504&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Utils/InlineFunction.cpp?rev=226504&r1=226503&r2=226504&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/Transforms/Utils/InlineFunction.cpp (original)<br>
+++ llvm/trunk/lib/Transforms/Utils/InlineFunction.cpp Mon Jan 19 15:30:18 2015<br>
@@ -319,13 +319,12 @@ static void CloneAliasScopeMetadata(Call<br>
<br>
   // Now we have a complete set of all metadata in the chains used to specify<br>
   // the noalias scopes and the lists of those scopes.<br>
-  SmallVector<MDTuple *, 16> DummyNodes;<br>
+  SmallVector<TempMDTuple, 16> DummyNodes;<br>
   DenseMap<const MDNode *, TrackingMDNodeRef> MDMap;<br>
   for (SetVector<const MDNode *>::iterator I = MD.begin(), IE = MD.end();<br>
        I != IE; ++I) {<br>
-    MDTuple *Dummy = MDTuple::getTemporary(CalledFunc->getContext(), None);<br>
-    DummyNodes.push_back(Dummy);<br>
-    MDMap[*I].reset(Dummy);<br>
+    DummyNodes.push_back(MDTuple::getTemporary(CalledFunc->getContext(), None));<br>
+    MDMap[*I].reset(DummyNodes.back().get());<br>
   }<br>
<br>
   // Create new metadata nodes to replace the dummy nodes, replacing old<br>
@@ -389,10 +388,6 @@ static void CloneAliasScopeMetadata(Call<br>
         NI->setMetadata(LLVMContext::MD_noalias, M);<br>
     }<br>
   }<br>
-<br>
-  // Now that everything has been replaced, delete the dummy nodes.<br>
-  for (unsigned i = 0, ie = DummyNodes.size(); i != ie; ++i)<br>
-    MDNode::deleteTemporary(DummyNodes[i]);<br>
 }<br>
<br>
 /// AddAliasScopeMetadata - If the inlined function has noalias arguments, then<br>
<br>
Modified: llvm/trunk/lib/Transforms/Utils/ValueMapper.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Utils/ValueMapper.cpp?rev=226504&r1=226503&r2=226504&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Utils/ValueMapper.cpp?rev=226504&r1=226503&r2=226504&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/Transforms/Utils/ValueMapper.cpp (original)<br>
+++ llvm/trunk/lib/Transforms/Utils/ValueMapper.cpp Mon Jan 19 15:30:18 2015<br>
@@ -249,12 +249,11 @@ static Metadata *mapDistinctNode(const U<br>
<br>
   // In general we need a dummy node, since whether the operands are null can<br>
   // affect the size of the node.<br>
-  MDTuple *Dummy = MDTuple::getTemporary(Node->getContext(), None);<br>
-  mapToMetadata(VM, Node, Dummy);<br>
+  auto Dummy = MDTuple::getTemporary(Node->getContext(), None);<br>
+  mapToMetadata(VM, Node, Dummy.get());<br>
   Metadata *NewMD = cloneMDNode(Node, VM, Flags, TypeMapper, Materializer,<br>
                                 /* IsDistinct */ true);<br>
   Dummy->replaceAllUsesWith(NewMD);<br>
-  MDNode::deleteTemporary(Dummy);<br>
   return mapToMetadata(VM, Node, NewMD);<br>
 }<br>
<br>
@@ -285,14 +284,13 @@ static Metadata *mapUniquedNode(const Un<br>
   assert(Node->isUniqued() && "Expected uniqued node");<br>
<br>
   // Create a dummy node in case we have a metadata cycle.<br>
-  MDTuple *Dummy = MDTuple::getTemporary(Node->getContext(), None);<br>
-  mapToMetadata(VM, Node, Dummy);<br>
+  auto Dummy = MDTuple::getTemporary(Node->getContext(), None);<br>
+  mapToMetadata(VM, Node, Dummy.get());<br>
<br>
   // Check all operands to see if any need to be remapped.<br>
   if (!shouldRemapUniquedNode(Node, VM, Flags, TypeMapper, Materializer)) {<br>
     // Use an identity mapping.<br>
     mapToSelf(VM, Node);<br>
-    MDNode::deleteTemporary(Dummy);<br>
     return const_cast<Metadata *>(static_cast<const Metadata *>(Node));<br>
   }<br>
<br>
@@ -300,7 +298,6 @@ static Metadata *mapUniquedNode(const Un<br>
   Metadata *NewMD = cloneMDNode(Node, VM, Flags, TypeMapper, Materializer,<br>
                                 /* IsDistinct */ false);<br>
   Dummy->replaceAllUsesWith(NewMD);<br>
-  MDNode::deleteTemporary(Dummy);<br>
   return mapToMetadata(VM, Node, NewMD);<br>
 }<br>
<br>
<br>
Modified: llvm/trunk/unittests/IR/MetadataTest.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/unittests/IR/MetadataTest.cpp?rev=226504&r1=226503&r2=226504&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/unittests/IR/MetadataTest.cpp?rev=226504&r1=226503&r2=226504&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/unittests/IR/MetadataTest.cpp (original)<br>
+++ llvm/trunk/unittests/IR/MetadataTest.cpp Mon Jan 19 15:30:18 2015<br>
@@ -171,11 +171,10 @@ TEST_F(MDNodeTest, SelfReference) {<br>
   // !0 = !{!0}<br>
   // !1 = !{!0}<br>
   {<br>
-    MDNode *Temp = MDNode::getTemporary(Context, None);<br>
-    Metadata *Args[] = {Temp};<br>
+    auto Temp = MDNode::getTemporary(Context, None);<br>
+    Metadata *Args[] = {Temp.get()};<br>
     MDNode *Self = MDNode::get(Context, Args);<br>
     Self->replaceOperandWith(0, Self);<br>
-    MDNode::deleteTemporary(Temp);<br>
     ASSERT_EQ(Self, Self->getOperand(0));<br>
<br>
     // Self-references should be distinct, so MDNode::get() should grab a<br>
@@ -190,11 +189,10 @@ TEST_F(MDNodeTest, SelfReference) {<br>
   // !0 = !{!0, !{}}<br>
   // !1 = !{!0, !{}}<br>
   {<br>
-    MDNode *Temp = MDNode::getTemporary(Context, None);<br>
-    Metadata *Args[] = {Temp, MDNode::get(Context, None)};<br>
+    auto Temp = MDNode::getTemporary(Context, None);<br>
+    Metadata *Args[] = {Temp.get(), MDNode::get(Context, None)};<br>
     MDNode *Self = MDNode::get(Context, Args);<br>
     Self->replaceOperandWith(0, Self);<br>
-    MDNode::deleteTemporary(Temp);<br>
     ASSERT_EQ(Self, Self->getOperand(0));<br>
<br>
     // Self-references should be distinct, so MDNode::get() should grab a<br>
@@ -310,48 +308,44 @@ TEST_F(MDNodeTest, getDistinct) {<br>
 TEST_F(MDNodeTest, isUniqued) {<br>
   MDNode *U = MDTuple::get(Context, None);<br>
   MDNode *D = MDTuple::getDistinct(Context, None);<br>
-  MDNode *T = MDTuple::getTemporary(Context, None);<br>
+  auto T = MDTuple::getTemporary(Context, None);<br>
   EXPECT_TRUE(U->isUniqued());<br>
   EXPECT_FALSE(D->isUniqued());<br>
   EXPECT_FALSE(T->isUniqued());<br>
-  MDNode::deleteTemporary(T);<br>
 }<br>
<br>
 TEST_F(MDNodeTest, isDistinct) {<br>
   MDNode *U = MDTuple::get(Context, None);<br>
   MDNode *D = MDTuple::getDistinct(Context, None);<br>
-  MDNode *T = MDTuple::getTemporary(Context, None);<br>
+  auto T = MDTuple::getTemporary(Context, None);<br>
   EXPECT_FALSE(U->isDistinct());<br>
   EXPECT_TRUE(D->isDistinct());<br>
   EXPECT_FALSE(T->isDistinct());<br>
-  MDNode::deleteTemporary(T);<br>
 }<br>
<br>
 TEST_F(MDNodeTest, isTemporary) {<br>
   MDNode *U = MDTuple::get(Context, None);<br>
   MDNode *D = MDTuple::getDistinct(Context, None);<br>
-  MDNode *T = MDTuple::getTemporary(Context, None);<br>
+  auto T = MDTuple::getTemporary(Context, None);<br>
   EXPECT_FALSE(U->isTemporary());<br>
   EXPECT_FALSE(D->isTemporary());<br>
   EXPECT_TRUE(T->isTemporary());<br>
-  MDNode::deleteTemporary(T);<br>
 }<br>
<br>
 TEST_F(MDNodeTest, getDistinctWithUnresolvedOperands) {<br>
   // temporary !{}<br>
-  MDTuple *Temp = MDTuple::getTemporary(Context, None);<br>
+  auto Temp = MDTuple::getTemporary(Context, None);<br>
   ASSERT_FALSE(Temp->isResolved());<br>
<br>
   // distinct !{temporary !{}}<br>
-  Metadata *Ops[] = {Temp};<br>
+  Metadata *Ops[] = {Temp.get()};<br>
   MDNode *Distinct = MDNode::getDistinct(Context, Ops);<br>
   EXPECT_TRUE(Distinct->isResolved());<br>
-  EXPECT_EQ(Temp, Distinct->getOperand(0));<br>
+  EXPECT_EQ(Temp.get(), Distinct->getOperand(0));<br>
<br>
   // temporary !{} => !{}<br>
   MDNode *Empty = MDNode::get(Context, None);<br>
   Temp->replaceAllUsesWith(Empty);<br>
-  MDNode::deleteTemporary(Temp);<br>
   EXPECT_EQ(Empty, Distinct->getOperand(0));<br>
 }<br>
<br>
@@ -360,19 +354,18 @@ TEST_F(MDNodeTest, handleChangedOperandR<br>
   MDNode *N0 = MDNode::get(Context, None);<br>
<br>
   // !1 = !{!3, null}<br>
-  MDTuple *Temp3 = MDTuple::getTemporary(Context, None);<br>
-  Metadata *Ops1[] = {Temp3, nullptr};<br>
+  auto Temp3 = MDTuple::getTemporary(Context, None);<br>
+  Metadata *Ops1[] = {Temp3.get(), nullptr};<br>
   MDNode *N1 = MDNode::get(Context, Ops1);<br>
<br>
   // !2 = !{!3, !0}<br>
-  Metadata *Ops2[] = {Temp3, N0};<br>
+  Metadata *Ops2[] = {Temp3.get(), N0};<br>
   MDNode *N2 = MDNode::get(Context, Ops2);<br>
<br>
   // !3 = !{!2}<br>
   Metadata *Ops3[] = {N2};<br>
   MDNode *N3 = MDNode::get(Context, Ops3);<br>
   Temp3->replaceAllUsesWith(N3);<br>
-  MDNode::deleteTemporary(Temp3);<br>
<br>
   // !4 = !{!1}<br>
   Metadata *Ops4[] = {N1};<br>
@@ -425,8 +418,8 @@ TEST_F(MDNodeTest, replaceResolvedOperan<br>
   // a global value that gets RAUW'ed.<br>
   //<br>
   // Use a temporary node to keep N from being resolved.<br>
-  MDTuple *Temp = MDTuple::getTemporary(Context, None);<br>
-  Metadata *Ops[] = {nullptr, Temp};<br>
+  auto Temp = MDTuple::getTemporary(Context, None);<br>
+  Metadata *Ops[] = {nullptr, Temp.get()};<br>
<br>
   MDNode *Empty = MDTuple::get(Context, ArrayRef<Metadata *>());<br>
   MDNode *N = MDTuple::get(Context, Ops);<br>
@@ -438,12 +431,11 @@ TEST_F(MDNodeTest, replaceResolvedOperan<br>
   EXPECT_EQ(Empty, N->getOperand(0));<br>
<br>
   // Check code for adding another unresolved operand.<br>
-  N->replaceOperandWith(0, Temp);<br>
-  EXPECT_EQ(Temp, N->getOperand(0));<br>
+  N->replaceOperandWith(0, Temp.get());<br>
+  EXPECT_EQ(Temp.get(), N->getOperand(0));<br>
<br>
   // Remove the references to Temp; required for teardown.<br>
   Temp->replaceAllUsesWith(nullptr);<br>
-  MDNode::deleteTemporary(Temp);<br>
 }<br>
<br>
 typedef MetadataTest MDLocationTest;<br>
@@ -485,10 +477,9 @@ TEST_F(MDLocationTest, getDistinct) {<br>
<br>
 TEST_F(MDLocationTest, getTemporary) {<br>
   MDNode *N = MDNode::get(Context, None);<br>
-  MDLocation *L = MDLocation::getTemporary(Context, 2, 7, N);<br>
+  auto L = MDLocation::getTemporary(Context, 2, 7, N);<br>
   EXPECT_TRUE(L->isTemporary());<br>
   EXPECT_FALSE(L->isResolved());<br>
-  MDNode::deleteTemporary(L);<br>
 }<br>
<br>
 typedef MetadataTest MetadataAsValueTest;<br>
@@ -557,11 +548,11 @@ TEST_F(ValueAsMetadataTest, CollidingDou<br>
       ConstantInt::get(getGlobalContext(), APInt(8, 0)));<br>
<br>
   // Create a temporary to prevent nodes from resolving.<br>
-  MDTuple *Temp = MDTuple::getTemporary(Context, None);<br>
+  auto Temp = MDTuple::getTemporary(Context, None);<br>
<br>
   // When the first operand of N1 gets reset to nullptr, it'll collide with N2.<br>
-  Metadata *Ops1[] = {CI, CI, Temp};<br>
-  Metadata *Ops2[] = {nullptr, CI, Temp};<br>
+  Metadata *Ops1[] = {CI, CI, Temp.get()};<br>
+  Metadata *Ops2[] = {nullptr, CI, Temp.get()};<br>
<br>
   auto *N1 = MDTuple::get(Context, Ops1);<br>
   auto *N2 = MDTuple::get(Context, Ops2);<br>
@@ -573,11 +564,10 @@ TEST_F(ValueAsMetadataTest, CollidingDou<br>
   ValueAsMetadata::handleDeletion(CI->getValue());<br>
   EXPECT_EQ(nullptr, N2->getOperand(0));<br>
   EXPECT_EQ(nullptr, N2->getOperand(1));<br>
-  EXPECT_EQ(Temp, N2->getOperand(2));<br>
+  EXPECT_EQ(Temp.get(), N2->getOperand(2));<br>
<br>
   // Clean up Temp for teardown.<br>
   Temp->replaceAllUsesWith(nullptr);<br>
-  MDNode::deleteTemporary(Temp);<br>
 }<br>
<br>
 typedef MetadataTest TrackingMDRefTest;<br>
<br>
<br>
_______________________________________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@cs.uiuc.edu">llvm-commits@cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits</a><br>
</blockquote></div><br></div></div>