diff options
author | Duncan P. N. Exon Smith <dexonsmith@apple.com> | 2015-01-08 22:42:30 +0000 |
---|---|---|
committer | Duncan P. N. Exon Smith <dexonsmith@apple.com> | 2015-01-08 22:42:30 +0000 |
commit | 953e1a48f02031be36094d5bfaf2685cf130bd02 (patch) | |
tree | 6cc3fb579f362928718a30208bbd81e93c7b9332 /llvm/lib/Transforms/Utils/ValueMapper.cpp | |
parent | 4bbe428cc5d734ac53af9821e6dc0c280d1eeac4 (diff) | |
download | bcm5719-llvm-953e1a48f02031be36094d5bfaf2685cf130bd02.tar.gz bcm5719-llvm-953e1a48f02031be36094d5bfaf2685cf130bd02.zip |
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
Diffstat (limited to 'llvm/lib/Transforms/Utils/ValueMapper.cpp')
-rw-r--r-- | llvm/lib/Transforms/Utils/ValueMapper.cpp | 14 |
1 files changed, 14 insertions, 0 deletions
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<Metadata *, 4> 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); |