[llvm] r225401 - IR: Add MDNode::isDistinct()

Duncan P. N. Exon Smith dexonsmith at apple.com
Mon Jan 12 11:16:22 PST 2015


> On 2015-Jan-12, at 11:07, David Blaikie <dblaikie at gmail.com> wrote:
> 
> 
> 
> On Wed, Jan 7, 2015 at 1:35 PM, Duncan P. N. Exon Smith <dexonsmith at apple.com> wrote:
> Author: dexonsmith
> Date: Wed Jan  7 15:35:38 2015
> New Revision: 225401
> 
> URL: http://llvm.org/viewvc/llvm-project?rev=225401&view=rev
> Log:
> IR: Add MDNode::isDistinct()
> 
> Add API to indicate whether an `MDNode` is distinct.  A distinct node is
> not stored in the MDNode uniquing tables, and will never be returned by
> `MDNode::get()`.
> 
> Although distinct nodes are only currently created by uniquing
> collisions (when operands change),
> 
> I don't quite understand how changing an operand relates to uniquing collisions - once the operand has changed would we not want the uniquing to happen again? (eg: if changing an operand made this node equal to some other node instead?)
>  

It's impossible without RAUW.

> PR22111 will allow these nodes to be
> explicitly created.
> 
> Modified:
>     llvm/trunk/include/llvm/IR/Metadata.h
>     llvm/trunk/unittests/IR/MetadataTest.cpp
> 
> Modified: llvm/trunk/include/llvm/IR/Metadata.h
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/IR/Metadata.h?rev=225401&r1=225400&r2=225401&view=diff
> ==============================================================================
> --- llvm/trunk/include/llvm/IR/Metadata.h (original)
> +++ llvm/trunk/include/llvm/IR/Metadata.h Wed Jan  7 15:35:38 2015
> @@ -642,6 +642,12 @@ 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 IsDistinctInContext; }
> +
>  protected:
>    /// \brief Set an operand.
>    ///
> 
> Modified: llvm/trunk/unittests/IR/MetadataTest.cpp
> URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/unittests/IR/MetadataTest.cpp?rev=225401&r1=225400&r2=225401&view=diff
> ==============================================================================
> --- llvm/trunk/unittests/IR/MetadataTest.cpp (original)
> +++ llvm/trunk/unittests/IR/MetadataTest.cpp Wed Jan  7 15:35:38 2015
> @@ -222,6 +222,33 @@ TEST_F(MDNodeTest, NullOperand) {
>    EXPECT_EQ(N, NullOp);
>  }
> 
> +TEST_F(MDNodeTest, DistinctOnUniquingCollision) {
> +  // !{}
> +  MDNode *Empty = MDNode::get(Context, None);
> +  ASSERT_TRUE(Empty->isResolved());
> +  EXPECT_FALSE(Empty->isDistinct());
> +
> +  // !{!{}}
> +  Metadata *Wrapped1Ops[] = {Empty};
> +  MDNode *Wrapped1 = MDNode::get(Context, Wrapped1Ops);
> +  ASSERT_EQ(Empty, Wrapped1->getOperand(0));
> +  ASSERT_TRUE(Wrapped1->isResolved());
> +  EXPECT_FALSE(Wrapped1->isDistinct());
> +
> +  // !{!{!{}}}
> +  Metadata *Wrapped2Ops[] = {Wrapped1};
> +  MDNode *Wrapped2 = MDNode::get(Context, Wrapped2Ops);
> +  ASSERT_EQ(Wrapped1, Wrapped2->getOperand(0));
> +  ASSERT_TRUE(Wrapped2->isResolved());
> +  EXPECT_FALSE(Wrapped2->isDistinct());
> +
> +  // !{!{!{}}} => !{!{}}
> +  Wrapped2->replaceOperandWith(0, Empty);
> +  ASSERT_EQ(Empty, Wrapped2->getOperand(0));
> +  EXPECT_TRUE(Wrapped2->isDistinct());
> +  EXPECT_FALSE(Wrapped1->isDistinct());
> +}
> +
>  typedef MetadataTest MetadataAsValueTest;
> 
>  TEST_F(MetadataAsValueTest, MDNode) {
> 
> 
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
> 





More information about the llvm-commits mailing list