From 953e1a48f02031be36094d5bfaf2685cf130bd02 Mon Sep 17 00:00:00 2001 From: "Duncan P. N. Exon Smith" Date: Thu, 8 Jan 2015 22:42:30 +0000 Subject: Utils: Keep distinct MDNodes distinct in MapMetadata() Create new copies of distinct `MDNode`s instead of following the uniquing `MDNode` logic. Just like self-references (or other cycles), `MapMetadata()` creates a new node. In practice most calls use `RF_NoModuleLevelChanges`, in which case nothing is duplicated anyway. Part of PR22111. llvm-svn: 225476 --- llvm/lib/Transforms/Utils/ValueMapper.cpp | 14 ++++++++++++++ 1 file changed, 14 insertions(+) (limited to 'llvm/lib/Transforms/Utils/ValueMapper.cpp') diff --git a/llvm/lib/Transforms/Utils/ValueMapper.cpp b/llvm/lib/Transforms/Utils/ValueMapper.cpp index a2eb1a07253..064cc575548 100644 --- a/llvm/lib/Transforms/Utils/ValueMapper.cpp +++ b/llvm/lib/Transforms/Utils/ValueMapper.cpp @@ -212,6 +212,20 @@ static Metadata *MapMetadataImpl(const Metadata *MD, ValueToValueMapTy &VM, if (Flags & RF_NoModuleLevelChanges) return mapToSelf(VM, MD); + // Distinct nodes are always recreated. + if (Node->isDistinct()) { + // Create the node first so it's available for cyclical references. + SmallVector EmptyOps(Node->getNumOperands()); + MDNode *NewMD = MDNode::getDistinct(Node->getContext(), EmptyOps); + mapToMetadata(VM, Node, NewMD); + + // Fix the operands. + for (unsigned I = 0, E = Node->getNumOperands(); I != E; ++I) + NewMD->replaceOperandWith(I, getMappedOp(Node->getOperand(I))); + + return NewMD; + } + // Create a dummy node in case we have a metadata cycle. MDNodeFwdDecl *Dummy = MDNode::getTemporary(Node->getContext(), None); mapToMetadata(VM, Node, Dummy); -- cgit v1.2.3