I noticed in passing that the Metadata getIfExists method was creating a new
authorDuncan Sands <baldrick@free.fr>
Sat, 31 Mar 2012 08:20:11 +0000 (08:20 +0000)
committerDuncan Sands <baldrick@free.fr>
Sat, 31 Mar 2012 08:20:11 +0000 (08:20 +0000)
node and returning it if one didn't exist.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@153798 91177308-0d34-0410-b5e6-96231b3b80d8

lib/VMCore/Metadata.cpp
unittests/VMCore/MetadataTest.cpp

index 0fc2a2534d207fedc578d90faca07e70ad0a6ecf..e3a08d4949ce1eb548b2c4c1f7fd52b9615bb21d 100644 (file)
@@ -205,11 +205,11 @@ MDNode *MDNode::getMDNode(LLVMContext &Context, ArrayRef<Value*> Vals,
     ID.AddPointer(Vals[i]);
 
   void *InsertPoint;
-  MDNode *N = NULL;
-  
-  if ((N = pImpl->MDNodeSet.FindNodeOrInsertPos(ID, InsertPoint)))
+  MDNode *N = pImpl->MDNodeSet.FindNodeOrInsertPos(ID, InsertPoint);
+
+  if (N || !Insert)
     return N;
-    
+
   bool isFunctionLocal = false;
   switch (FL) {
   case FL_Unknown:
index 12ac2e704c8e8793c1c02242f504d1ed29f6204e..08927a2ff526bca6778acd69280e09de701d1f14 100644 (file)
@@ -90,13 +90,20 @@ TEST_F(MDNodeTest, Simple) {
   MDNode *n1 = MDNode::get(Context, V);
   Value *const c1 = n1;
   MDNode *n2 = MDNode::get(Context, c1);
+  Value *const c2 = n2;
   MDNode *n3 = MDNode::get(Context, V);
+  MDNode *n4 = MDNode::getIfExists(Context, V);
+  MDNode *n5 = MDNode::getIfExists(Context, c1);
+  MDNode *n6 = MDNode::getIfExists(Context, c2);
   EXPECT_NE(n1, n2);
 #ifdef ENABLE_MDNODE_UNIQUING
   EXPECT_EQ(n1, n3);
 #else
   (void) n3;
 #endif
+  EXPECT_EQ(n4, n1);
+  EXPECT_EQ(n5, n2);
+  EXPECT_EQ(n6, (Value*)0);
 
   EXPECT_EQ(3u, n1->getNumOperands());
   EXPECT_EQ(s1, n1->getOperand(0));