<div dir="ltr"><br><div class="gmail_extra"><br><div class="gmail_quote">On Mon, Nov 3, 2014 at 10:13 AM, 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 Nov  3 12:13:57 2014<br>
New Revision: 221167<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=221167&view=rev" target="_blank">http://llvm.org/viewvc/llvm-project?rev=221167&view=rev</a><br>
Log:<br>
IR: MDNode => Value: Instruction::getAllMetadataOtherThanDebugLoc()<br>
<br>
Change `Instruction::getAllMetadataOtherThanDebugLoc()` from a vector of<br>
`MDNode` to one of `Value`.  Part of PR21433.<br></blockquote><div><br></div><div>This does seem like a rather unfortunate loss in type safety - is there no common type here other than Value*? Should we introduce one.<br><br>(more broadly, I do wonder if there's some common API we could expose via MDNode so as not to end up with two kinds of metadata... but I've not really been able to wrap my head around this enough to have a well informed perspective)</div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<br>
Modified:<br>
    llvm/trunk/include/llvm/IR/Instruction.h<br>
    llvm/trunk/lib/Bitcode/Writer/BitcodeWriter.cpp<br>
    llvm/trunk/lib/Bitcode/Writer/ValueEnumerator.cpp<br>
    llvm/trunk/lib/IR/Instruction.cpp<br>
    llvm/trunk/lib/IR/Metadata.cpp<br>
    llvm/trunk/lib/IR/TypeFinder.cpp<br>
    llvm/trunk/lib/Target/R600/SITypeRewriter.cpp<br>
    llvm/trunk/lib/Transforms/Scalar/Scalarizer.cpp<br>
    llvm/trunk/lib/Transforms/Utils/Local.cpp<br>
    llvm/trunk/lib/Transforms/Vectorize/LoopVectorize.cpp<br>
    llvm/trunk/lib/Transforms/Vectorize/SLPVectorizer.cpp<br>
<br>
Modified: llvm/trunk/include/llvm/IR/Instruction.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/IR/Instruction.h?rev=221167&r1=221166&r2=221167&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/IR/Instruction.h?rev=221167&r1=221166&r2=221167&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/include/llvm/IR/Instruction.h (original)<br>
+++ llvm/trunk/include/llvm/IR/Instruction.h Mon Nov  3 12:13:57 2014<br>
@@ -182,8 +182,8 @@ public:<br>
<br>
   /// getAllMetadataOtherThanDebugLoc - This does the same thing as<br>
   /// getAllMetadata, except that it filters out the debug location.<br>
-  void getAllMetadataOtherThanDebugLoc(SmallVectorImpl<std::pair<unsigned,<br>
-                                       MDNode*> > &MDs) const {<br>
+  void getAllMetadataOtherThanDebugLoc(<br>
+      SmallVectorImpl<std::pair<unsigned, Value *>> &MDs) const {<br>
     if (hasMetadataOtherThanDebugLoc())<br>
       getAllMetadataOtherThanDebugLocImpl(MDs);<br>
   }<br>
@@ -296,8 +296,8 @@ private:<br>
   MDNode *getMDNodeImpl(StringRef Kind) const;<br>
   void<br>
   getAllMetadataImpl(SmallVectorImpl<std::pair<unsigned, Value *>> &) const;<br>
-  void getAllMetadataOtherThanDebugLocImpl(SmallVectorImpl<std::pair<unsigned,<br>
-                                           MDNode*> > &) const;<br>
+  void getAllMetadataOtherThanDebugLocImpl(<br>
+      SmallVectorImpl<std::pair<unsigned, Value *>> &) const;<br>
   void clearMetadataHashEntries();<br>
 public:<br>
   //===--------------------------------------------------------------------===//<br>
<br>
Modified: llvm/trunk/lib/Bitcode/Writer/BitcodeWriter.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Bitcode/Writer/BitcodeWriter.cpp?rev=221167&r1=221166&r2=221167&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Bitcode/Writer/BitcodeWriter.cpp?rev=221167&r1=221166&r2=221167&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/Bitcode/Writer/BitcodeWriter.cpp (original)<br>
+++ llvm/trunk/lib/Bitcode/Writer/BitcodeWriter.cpp Mon Nov  3 12:13:57 2014<br>
@@ -848,7 +848,7 @@ static void WriteMetadataAttachment(cons<br>
<br>
   // Write metadata attachments<br>
   // METADATA_ATTACHMENT - [m x [value, [n x [id, mdnode]]]<br>
-  SmallVector<std::pair<unsigned, MDNode*>, 4> MDs;<br>
+  SmallVector<std::pair<unsigned, Value *>, 4> MDs;<br>
<br>
   for (Function::const_iterator BB = F.begin(), E = F.end(); BB != E; ++BB)<br>
     for (BasicBlock::const_iterator I = BB->begin(), E = BB->end();<br>
<br>
Modified: llvm/trunk/lib/Bitcode/Writer/ValueEnumerator.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Bitcode/Writer/ValueEnumerator.cpp?rev=221167&r1=221166&r2=221167&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Bitcode/Writer/ValueEnumerator.cpp?rev=221167&r1=221166&r2=221167&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/Bitcode/Writer/ValueEnumerator.cpp (original)<br>
+++ llvm/trunk/lib/Bitcode/Writer/ValueEnumerator.cpp Mon Nov  3 12:13:57 2014<br>
@@ -321,7 +321,7 @@ ValueEnumerator::ValueEnumerator(const M<br>
   EnumerateValueSymbolTable(M->getValueSymbolTable());<br>
   EnumerateNamedMetadata(M);<br>
<br>
-  SmallVector<std::pair<unsigned, MDNode*>, 8> MDs;<br>
+  SmallVector<std::pair<unsigned, Value *>, 8> MDs;<br>
<br>
   // Enumerate types used by function bodies and argument lists.<br>
   for (const Function &F : *M) {<br>
@@ -347,7 +347,7 @@ ValueEnumerator::ValueEnumerator(const M<br>
         MDs.clear();<br>
         I.getAllMetadataOtherThanDebugLoc(MDs);<br>
         for (unsigned i = 0, e = MDs.size(); i != e; ++i)<br>
-          EnumerateMetadata(MDs[i].second);<br>
+          EnumerateMetadata(cast<MDNode>(MDs[i].second));<br>
<br>
         if (!I.getDebugLoc().isUnknown()) {<br>
           MDNode *Scope, *IA;<br>
@@ -741,10 +741,10 @@ void ValueEnumerator::incorporateFunctio<br>
             FnLocalMDVector.push_back(MD);<br>
       }<br>
<br>
-      SmallVector<std::pair<unsigned, MDNode*>, 8> MDs;<br>
+      SmallVector<std::pair<unsigned, Value *>, 8> MDs;<br>
       I->getAllMetadataOtherThanDebugLoc(MDs);<br>
       for (unsigned i = 0, e = MDs.size(); i != e; ++i) {<br>
-        MDNode *N = MDs[i].second;<br>
+        auto *N = cast<MDNode>(MDs[i].second);<br>
         if (N->isFunctionLocal() && N->getFunction())<br>
           FnLocalMDVector.push_back(N);<br>
       }<br>
<br>
Modified: llvm/trunk/lib/IR/Instruction.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/IR/Instruction.cpp?rev=221167&r1=221166&r2=221167&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/IR/Instruction.cpp?rev=221167&r1=221166&r2=221167&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/IR/Instruction.cpp (original)<br>
+++ llvm/trunk/lib/IR/Instruction.cpp Mon Nov  3 12:13:57 2014<br>
@@ -548,7 +548,7 @@ Instruction *Instruction::clone() const<br>
<br>
   // Otherwise, enumerate and copy over metadata from the old instruction to the<br>
   // new one.<br>
-  SmallVector<std::pair<unsigned, MDNode*>, 4> TheMDs;<br>
+  SmallVector<std::pair<unsigned, Value *>, 4> TheMDs;<br>
   getAllMetadataOtherThanDebugLoc(TheMDs);<br>
   for (const auto &MD : TheMDs)<br>
     New->setMetadata(MD.first, MD.second);<br>
<br>
Modified: llvm/trunk/lib/IR/Metadata.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/IR/Metadata.cpp?rev=221167&r1=221166&r2=221167&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/IR/Metadata.cpp?rev=221167&r1=221166&r2=221167&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/IR/Metadata.cpp (original)<br>
+++ llvm/trunk/lib/IR/Metadata.cpp Mon Nov  3 12:13:57 2014<br>
@@ -770,9 +770,8 @@ void Instruction::getAllMetadataImpl(<br>
     array_pod_sort(Result.begin(), Result.end());<br>
 }<br>
<br>
-void Instruction::<br>
-getAllMetadataOtherThanDebugLocImpl(SmallVectorImpl<std::pair<unsigned,<br>
-                                    MDNode*> > &Result) const {<br>
+void Instruction::getAllMetadataOtherThanDebugLocImpl(<br>
+    SmallVectorImpl<std::pair<unsigned, Value *>> &Result) const {<br>
   Result.clear();<br>
   assert(hasMetadataHashEntry() &&<br>
          getContext().pImpl->MetadataStore.count(this) &&<br>
<br>
Modified: llvm/trunk/lib/IR/TypeFinder.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/IR/TypeFinder.cpp?rev=221167&r1=221166&r2=221167&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/IR/TypeFinder.cpp?rev=221167&r1=221166&r2=221167&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/IR/TypeFinder.cpp (original)<br>
+++ llvm/trunk/lib/IR/TypeFinder.cpp Mon Nov  3 12:13:57 2014<br>
@@ -40,7 +40,7 @@ void TypeFinder::run(const Module &M, bo<br>
   }<br>
<br>
   // Get types from functions.<br>
-  SmallVector<std::pair<unsigned, MDNode*>, 4> MDForInst;<br>
+  SmallVector<std::pair<unsigned, Value *>, 4> MDForInst;<br>
   for (Module::const_iterator FI = M.begin(), E = M.end(); FI != E; ++FI) {<br>
     incorporateType(FI->getType());<br>
<br>
@@ -71,7 +71,7 @@ void TypeFinder::run(const Module &M, bo<br>
         // Incorporate types hiding in metadata.<br>
         I.getAllMetadataOtherThanDebugLoc(MDForInst);<br>
         for (unsigned i = 0, e = MDForInst.size(); i != e; ++i)<br>
-          incorporateMDNode(MDForInst[i].second);<br>
+          incorporateMDNode(cast<MDNode>(MDForInst[i].second));<br>
<br>
         MDForInst.clear();<br>
       }<br>
<br>
Modified: llvm/trunk/lib/Target/R600/SITypeRewriter.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/R600/SITypeRewriter.cpp?rev=221167&r1=221166&r2=221167&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/R600/SITypeRewriter.cpp?rev=221167&r1=221166&r2=221167&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/Target/R600/SITypeRewriter.cpp (original)<br>
+++ llvm/trunk/lib/Target/R600/SITypeRewriter.cpp Mon Nov  3 12:13:57 2014<br>
@@ -87,7 +87,8 @@ void SITypeRewriter::visitLoadInst(LoadI<br>
     Value *BitCast = Builder.CreateBitCast(Ptr,<br>
         PointerType::get(v4i32,PtrTy->getPointerAddressSpace()));<br>
     LoadInst *Load = Builder.CreateLoad(BitCast);<br>
-    SmallVector <std::pair<unsigned, MDNode*>, 8> MD;<br>
+    // FIXME: Should the DebugLoc really get dropped here?<br>
+    SmallVector<std::pair<unsigned, Value *>, 8> MD;<br>
     I.getAllMetadataOtherThanDebugLoc(MD);<br>
     for (unsigned i = 0, e = MD.size(); i != e; ++i) {<br>
       Load->setMetadata(MD[i].first, MD[i].second);<br>
<br>
Modified: llvm/trunk/lib/Transforms/Scalar/Scalarizer.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/Scalarizer.cpp?rev=221167&r1=221166&r2=221167&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Scalar/Scalarizer.cpp?rev=221167&r1=221166&r2=221167&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/Transforms/Scalar/Scalarizer.cpp (original)<br>
+++ llvm/trunk/lib/Transforms/Scalar/Scalarizer.cpp Mon Nov  3 12:13:57 2014<br>
@@ -327,12 +327,11 @@ bool Scalarizer::canTransferMetadata(uns<br>
 // Transfer metadata from Op to the instructions in CV if it is known<br>
 // to be safe to do so.<br>
 void Scalarizer::transferMetadata(Instruction *Op, const ValueVector &CV) {<br>
-  SmallVector<std::pair<unsigned, MDNode *>, 4> MDs;<br>
+  SmallVector<std::pair<unsigned, Value *>, 4> MDs;<br>
   Op->getAllMetadataOtherThanDebugLoc(MDs);<br>
   for (unsigned I = 0, E = CV.size(); I != E; ++I) {<br>
     if (Instruction *New = dyn_cast<Instruction>(CV[I])) {<br>
-      for (SmallVectorImpl<std::pair<unsigned, MDNode *> >::iterator<br>
-             MI = MDs.begin(), ME = MDs.end(); MI != ME; ++MI)<br>
+      for (auto MI = MDs.begin(), ME = MDs.end(); MI != ME; ++MI)<br>
         if (canTransferMetadata(MI->first))<br>
           New->setMetadata(MI->first, MI->second);<br>
       New->setDebugLoc(Op->getDebugLoc());<br>
<br>
Modified: llvm/trunk/lib/Transforms/Utils/Local.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Utils/Local.cpp?rev=221167&r1=221166&r2=221167&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Utils/Local.cpp?rev=221167&r1=221166&r2=221167&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/Transforms/Utils/Local.cpp (original)<br>
+++ llvm/trunk/lib/Transforms/Utils/Local.cpp Mon Nov  3 12:13:57 2014<br>
@@ -1308,13 +1308,13 @@ bool llvm::removeUnreachableBlocks(Funct<br>
 }<br>
<br>
 void llvm::combineMetadata(Instruction *K, const Instruction *J, ArrayRef<unsigned> KnownIDs) {<br>
-  SmallVector<std::pair<unsigned, MDNode*>, 4> Metadata;<br>
+  SmallVector<std::pair<unsigned, Value *>, 4> Metadata;<br>
   K->dropUnknownMetadata(KnownIDs);<br>
   K->getAllMetadataOtherThanDebugLoc(Metadata);<br>
   for (unsigned i = 0, n = Metadata.size(); i < n; ++i) {<br>
     unsigned Kind = Metadata[i].first;<br>
     MDNode *JMD = J->getMDNode(Kind);<br>
-    MDNode *KMD = Metadata[i].second;<br>
+    MDNode *KMD = cast<MDNode>(Metadata[i].second);<br>
<br>
     switch (Kind) {<br>
       default:<br>
<br>
Modified: llvm/trunk/lib/Transforms/Vectorize/LoopVectorize.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Vectorize/LoopVectorize.cpp?rev=221167&r1=221166&r2=221167&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Vectorize/LoopVectorize.cpp?rev=221167&r1=221166&r2=221167&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/Transforms/Vectorize/LoopVectorize.cpp (original)<br>
+++ llvm/trunk/lib/Transforms/Vectorize/LoopVectorize.cpp Mon Nov  3 12:13:57 2014<br>
@@ -531,7 +531,7 @@ static std::string getDebugLocString(con<br>
<br>
 /// \brief Propagate known metadata from one instruction to another.<br>
 static void propagateMetadata(Instruction *To, const Instruction *From) {<br>
-  SmallVector<std::pair<unsigned, MDNode *>, 4> Metadata;<br>
+  SmallVector<std::pair<unsigned, Value *>, 4> Metadata;<br>
   From->getAllMetadataOtherThanDebugLoc(Metadata);<br>
<br>
   for (auto M : Metadata) {<br>
<br>
Modified: llvm/trunk/lib/Transforms/Vectorize/SLPVectorizer.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Vectorize/SLPVectorizer.cpp?rev=221167&r1=221166&r2=221167&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Vectorize/SLPVectorizer.cpp?rev=221167&r1=221166&r2=221167&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/Transforms/Vectorize/SLPVectorizer.cpp (original)<br>
+++ llvm/trunk/lib/Transforms/Vectorize/SLPVectorizer.cpp Mon Nov  3 12:13:57 2014<br>
@@ -188,12 +188,12 @@ static void propagateIRFlags(Value *I, A<br>
 /// \returns \p I after propagating metadata from \p VL.<br>
 static Instruction *propagateMetadata(Instruction *I, ArrayRef<Value *> VL) {<br>
   Instruction *I0 = cast<Instruction>(VL[0]);<br>
-  SmallVector<std::pair<unsigned, MDNode *>, 4> Metadata;<br>
+  SmallVector<std::pair<unsigned, Value *>, 4> Metadata;<br>
   I0->getAllMetadataOtherThanDebugLoc(Metadata);<br>
<br>
   for (unsigned i = 0, n = Metadata.size(); i != n; ++i) {<br>
     unsigned Kind = Metadata[i].first;<br>
-    MDNode *MD = Metadata[i].second;<br>
+    MDNode *MD = cast_or_null<MDNode>(Metadata[i].second);<br>
<br>
     for (int i = 1, e = VL.size(); MD && i != e; i++) {<br>
       Instruction *I = cast<Instruction>(VL[i]);<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>