IR: Drop uniquing for self-referencing MDNodes

It doesn't make sense to unique self-referencing nodes.  Drop uniquing
for them.

Note that `MDNode::intersect()` occasionally returns self-referencing
nodes.  Previously these would be returned by `MDNode::get()`.  I'm not
convinced this was intended behaviour -- to me it seems it should return
a node whose only operand is the self-reference -- but I don't know much
about alias scopes so I'm preserving it for now.

This is part of PR21532.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@223618 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Duncan P. N. Exon Smith
2014-12-07 19:52:06 +00:00
parent 6bb158dd34
commit 7280d8ccce
2 changed files with 55 additions and 1 deletions

View File

@ -123,6 +123,46 @@ TEST_F(MDNodeTest, Delete) {
delete I;
}
TEST_F(MDNodeTest, SelfReference) {
// !0 = metadata !{metadata !0}
// !1 = metadata !{metadata !0}
{
MDNode *Temp = MDNode::getTemporary(Context, None);
Value *Args[] = {Temp};
MDNode *Self = MDNode::get(Context, Args);
Self->replaceOperandWith(0, Self);
MDNode::deleteTemporary(Temp);
ASSERT_EQ(Self, Self->getOperand(0));
// Self-references should be distinct, so MDNode::get() should grab a
// uniqued node that references Self, not Self.
Args[0] = Self;
MDNode *Ref1 = MDNode::get(Context, Args);
MDNode *Ref2 = MDNode::get(Context, Args);
EXPECT_NE(Self, Ref1);
EXPECT_EQ(Ref1, Ref2);
}
// !0 = metadata !{metadata !0, metadata !{}}
// !1 = metadata !{metadata !0, metadata !{}}
{
MDNode *Temp = MDNode::getTemporary(Context, None);
Value *Args[] = {Temp, MDNode::get(Context, None)};
MDNode *Self = MDNode::get(Context, Args);
Self->replaceOperandWith(0, Self);
MDNode::deleteTemporary(Temp);
ASSERT_EQ(Self, Self->getOperand(0));
// Self-references should be distinct, so MDNode::get() should grab a
// uniqued node that references Self, not Self itself.
Args[0] = Self;
MDNode *Ref1 = MDNode::get(Context, Args);
MDNode *Ref2 = MDNode::get(Context, Args);
EXPECT_NE(Self, Ref1);
EXPECT_EQ(Ref1, Ref2);
}
}
TEST(NamedMDNodeTest, Search) {
LLVMContext Context;
Constant *C = ConstantInt::get(Type::getInt32Ty(Context), 1);