IR: Don't drop MDNode uniquing on null operands

Now that `LLVMContextImpl` can call `MDNode::dropAllReferences()` to
prevent teardown madness, stop dropping uniquing just because an operand
drops to null.

Part of PR21532.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@225223 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Duncan P. N. Exon Smith 2015-01-05 23:31:54 +00:00
parent 2f7982026d
commit 97d1c07c15
2 changed files with 22 additions and 7 deletions

View File

@ -515,13 +515,8 @@ void GenericMDNode::handleChangedOperand(void *Ref, Metadata *New) {
Metadata *Old = getOperand(Op);
setOperand(Op, New);
// Drop uniquing for self-reference cycles or if an operand drops to null.
//
// FIXME: Stop dropping uniquing when an operand drops to null. The original
// motivation was to prevent madness during teardown of LLVMContextImpl, but
// dropAllReferences() fixes that problem in a better way. (It's just here
// now for better staging of semantic changes.)
if (New == this || !New) {
// Drop uniquing for self-reference cycles.
if (New == this) {
storeDistinctInContext();
setHash(0);
if (!isResolved())

View File

@ -202,6 +202,26 @@ TEST_F(MDNodeTest, Print) {
EXPECT_EQ(Expected, Actual);
}
TEST_F(MDNodeTest, NullOperand) {
// metadata !{}
MDNode *Empty = MDNode::get(Context, None);
// metadata !{metadata !{}}
Metadata *Ops[] = {Empty};
MDNode *N = MDNode::get(Context, Ops);
ASSERT_EQ(Empty, N->getOperand(0));
// metadata !{metadata !{}} => metadata !{null}
N->replaceOperandWith(0, nullptr);
ASSERT_EQ(nullptr, N->getOperand(0));
// metadata !{null}
Ops[0] = nullptr;
MDNode *NullOp = MDNode::get(Context, Ops);
ASSERT_EQ(nullptr, NullOp->getOperand(0));
EXPECT_EQ(N, NullOp);
}
typedef MetadataTest MetadataAsValueTest;
TEST_F(MetadataAsValueTest, MDNode) {