mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-07-01 12:24:24 +00:00
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:
@ -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);
|
||||
|
Reference in New Issue
Block a user