IR: Add isUniqued() and isTemporary()

Change `MDNode::isDistinct()` to only apply to 'distinct' nodes (not
temporaries), and introduce `MDNode::isUniqued()` and
`MDNode::isTemporary()` for the other two possibilities.

llvm-svn: 226482
This commit is contained in:
Duncan P. N. Exon Smith 2015-01-19 18:45:35 +00:00
parent f134045365
commit de03a8b38d
4 changed files with 32 additions and 12 deletions

View File

@ -646,13 +646,9 @@ public:
/// \brief Check if node is fully resolved.
bool isResolved() const;
/// \brief Check if node is distinct.
///
/// Distinct nodes are not uniqued, and will not be returned by \a
/// MDNode::get().
bool isDistinct() const {
return isStoredDistinctInContext() || isa<MDNodeFwdDecl>(this);
}
bool isUniqued() const { return Storage == Uniqued; }
bool isDistinct() const { return Storage == Distinct; }
bool isTemporary() const { return Storage == Temporary; }
protected:
/// \brief Set an operand.

View File

@ -750,7 +750,7 @@ void MDNode::replaceOperandWith(unsigned I, Metadata *New) {
if (getOperand(I) == New)
return;
if (isDistinct()) {
if (!isUniqued()) {
setOperand(I, New);
return;
}

View File

@ -282,7 +282,7 @@ static Metadata *mapUniquedNode(const UniquableMDNode *Node,
ValueToValueMapTy &VM, RemapFlags Flags,
ValueMapTypeRemapper *TypeMapper,
ValueMaterializer *Materializer) {
assert(!Node->isDistinct() && "Expected uniqued node");
assert(Node->isUniqued() && "Expected uniqued node");
// Create a dummy node in case we have a metadata cycle.
MDNodeFwdDecl *Dummy = MDNode::getTemporary(Node->getContext(), None);

View File

@ -274,9 +274,33 @@ TEST_F(MDNodeTest, getDistinct) {
ASSERT_EQ(Empty, MDNode::get(Context, None));
}
TEST_F(MDNodeTest, TempIsDistinct) {
MDNode *T = MDNode::getTemporary(Context, None);
EXPECT_TRUE(T->isDistinct());
TEST_F(MDNodeTest, isUniqued) {
MDNode *U = MDTuple::get(Context, None);
MDNode *D = MDTuple::getDistinct(Context, None);
MDNode *T = MDTuple::getTemporary(Context, None);
EXPECT_TRUE(U->isUniqued());
EXPECT_FALSE(D->isUniqued());
EXPECT_FALSE(T->isUniqued());
MDNode::deleteTemporary(T);
}
TEST_F(MDNodeTest, isDistinct) {
MDNode *U = MDTuple::get(Context, None);
MDNode *D = MDTuple::getDistinct(Context, None);
MDNode *T = MDTuple::getTemporary(Context, None);
EXPECT_FALSE(U->isDistinct());
EXPECT_TRUE(D->isDistinct());
EXPECT_FALSE(T->isDistinct());
MDNode::deleteTemporary(T);
}
TEST_F(MDNodeTest, isTemporary) {
MDNode *U = MDTuple::get(Context, None);
MDNode *D = MDTuple::getDistinct(Context, None);
MDNode *T = MDTuple::getTemporary(Context, None);
EXPECT_FALSE(U->isTemporary());
EXPECT_FALSE(D->isTemporary());
EXPECT_TRUE(T->isTemporary());
MDNode::deleteTemporary(T);
}