<div dir="ltr"><br><div class="gmail_extra"><br><div class="gmail_quote">On Mon, Jan 12, 2015 at 4:10 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 12 18:10:38 2015<br>
New Revision: 225738<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=225738&view=rev" target="_blank">http://llvm.org/viewvc/llvm-project?rev=225738&view=rev</a><br>
Log:<br>
IR: Fix an inverted assertion when replacing resolved operands<br>
<br>
Add a unit test, since this bug was only exposed by clang tests.  Thanks<br>
to Rafael for tracking this down!<br>
<br>
Modified:<br>
    llvm/trunk/lib/IR/Metadata.cpp<br>
    llvm/trunk/unittests/IR/MetadataTest.cpp<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=225738&r1=225737&r2=225738&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/IR/Metadata.cpp?rev=225738&r1=225737&r2=225738&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/IR/Metadata.cpp (original)<br>
+++ llvm/trunk/lib/IR/Metadata.cpp Mon Jan 12 18:10:38 2015<br>
@@ -444,7 +444,7 @@ void UniquableMDNode::resolveAfterOperan<br>
<br>
   // Check if an operand was resolved.<br>
   if (!isOperandUnresolved(Old))<br>
-    assert(isOperandUnresolved(New) && "Operand just became unresolved");<br>
+    assert(!isOperandUnresolved(New) && "Operand just became unresolved");<br></blockquote><div><br>Could the if condition be rolled into the assertion here, or does it have side effects? (tricksy name if it does)<br> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
   else if (!isOperandUnresolved(New))<br>
     decrementUnresolvedOperandCount();<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=225738&r1=225737&r2=225738&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/unittests/IR/MetadataTest.cpp?rev=225738&r1=225737&r2=225738&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/unittests/IR/MetadataTest.cpp (original)<br>
+++ llvm/trunk/unittests/IR/MetadataTest.cpp Mon Jan 12 18:10:38 2015<br>
@@ -7,6 +7,7 @@<br>
 //<br>
 //===----------------------------------------------------------------------===//<br>
<br>
+#include "llvm/ADT/STLExtras.h"<br>
 #include "llvm/IR/Metadata.h"<br>
 #include "llvm/IR/Constants.h"<br>
 #include "llvm/IR/Instructions.h"<br>
@@ -361,6 +362,28 @@ TEST_F(MDNodeTest, handleChangedOperandR<br>
   EXPECT_EQ(N4, N6->getOperand(0));<br>
 }<br>
<br>
+TEST_F(MDNodeTest, replaceResolvedOperand) {<br>
+  // Check code for replacing one resolved operand with another.  If doing this<br>
+  // directly (via replaceOperandWith()) becomes illegal, change the operand to<br>
+  // a global value that gets RAUW'ed.<br>
+  //<br>
+  // Use a temporary node to keep N from being resolved.<br>
+  std::unique_ptr<MDNodeFwdDecl> Temp(MDNodeFwdDecl::get(Context, None));<br>
+  Metadata *Ops[] = {nullptr, Temp.get()};<br>
+<br>
+  MDNode *Empty = MDTuple::get(Context, {});<br>
+  MDNode *N = MDTuple::get(Context, Ops);<br>
+  EXPECT_EQ(nullptr, N->getOperand(0));<br>
+  ASSERT_FALSE(N->isResolved());<br>
+<br>
+  // Check code for replacing resolved nodes.<br>
+  N->replaceOperandWith(0, Empty);<br>
+  EXPECT_EQ(Empty, N->getOperand(0));<br>
+<br>
+  // Remove the reference to Temp; required for teardown.<br>
+  N->replaceOperandWith(1, nullptr);<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>