<div dir="ltr"><br><div class="gmail_extra"><br><div class="gmail_quote">On Wed, Jan 7, 2015 at 1:35 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: Wed Jan  7 15:35:38 2015<br>
New Revision: 225401<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=225401&view=rev" target="_blank">http://llvm.org/viewvc/llvm-project?rev=225401&view=rev</a><br>
Log:<br>
IR: Add MDNode::isDistinct()<br>
<br>
Add API to indicate whether an `MDNode` is distinct.  A distinct node is<br>
not stored in the MDNode uniquing tables, and will never be returned by<br>
`MDNode::get()`.<br>
<br>
Although distinct nodes are only currently created by uniquing<br>
collisions (when operands change), </blockquote><div><br>I don't quite understand how changing an operand relates to uniquing collisions - once the operand has changed would we not want the uniquing to happen again? (eg: if changing an operand made this node equal to some other node instead?)<br> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">PR22111 will allow these nodes to be<br>
explicitly created.<br>
<br>
Modified:<br>
    llvm/trunk/include/llvm/IR/Metadata.h<br>
    llvm/trunk/unittests/IR/MetadataTest.cpp<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=225401&r1=225400&r2=225401&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/IR/Metadata.h?rev=225401&r1=225400&r2=225401&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/include/llvm/IR/Metadata.h (original)<br>
+++ llvm/trunk/include/llvm/IR/Metadata.h Wed Jan  7 15:35:38 2015<br>
@@ -642,6 +642,12 @@ public:<br>
   /// \brief Check if node is fully resolved.<br>
   bool isResolved() const;<br>
<br>
+  /// \brief Check if node is distinct.<br>
+  ///<br>
+  /// Distinct nodes are not uniqued, and will not be returned by \a<br>
+  /// MDNode::get().<br>
+  bool isDistinct() const { return IsDistinctInContext; }<br>
+<br>
 protected:<br>
   /// \brief Set an operand.<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=225401&r1=225400&r2=225401&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/unittests/IR/MetadataTest.cpp?rev=225401&r1=225400&r2=225401&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/unittests/IR/MetadataTest.cpp (original)<br>
+++ llvm/trunk/unittests/IR/MetadataTest.cpp Wed Jan  7 15:35:38 2015<br>
@@ -222,6 +222,33 @@ TEST_F(MDNodeTest, NullOperand) {<br>
   EXPECT_EQ(N, NullOp);<br>
 }<br>
<br>
+TEST_F(MDNodeTest, DistinctOnUniquingCollision) {<br>
+  // !{}<br>
+  MDNode *Empty = MDNode::get(Context, None);<br>
+  ASSERT_TRUE(Empty->isResolved());<br>
+  EXPECT_FALSE(Empty->isDistinct());<br>
+<br>
+  // !{!{}}<br>
+  Metadata *Wrapped1Ops[] = {Empty};<br>
+  MDNode *Wrapped1 = MDNode::get(Context, Wrapped1Ops);<br>
+  ASSERT_EQ(Empty, Wrapped1->getOperand(0));<br>
+  ASSERT_TRUE(Wrapped1->isResolved());<br>
+  EXPECT_FALSE(Wrapped1->isDistinct());<br>
+<br>
+  // !{!{!{}}}<br>
+  Metadata *Wrapped2Ops[] = {Wrapped1};<br>
+  MDNode *Wrapped2 = MDNode::get(Context, Wrapped2Ops);<br>
+  ASSERT_EQ(Wrapped1, Wrapped2->getOperand(0));<br>
+  ASSERT_TRUE(Wrapped2->isResolved());<br>
+  EXPECT_FALSE(Wrapped2->isDistinct());<br>
+<br>
+  // !{!{!{}}} => !{!{}}<br>
+  Wrapped2->replaceOperandWith(0, Empty);<br>
+  ASSERT_EQ(Empty, Wrapped2->getOperand(0));<br>
+  EXPECT_TRUE(Wrapped2->isDistinct());<br>
+  EXPECT_FALSE(Wrapped1->isDistinct());<br>
+}<br>
+<br>
 typedef MetadataTest MetadataAsValueTest;<br>
<br>
 TEST_F(MetadataAsValueTest, MDNode) {<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>