summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Transforms/Utils/ValueMapper.cpp
diff options
context:
space:
mode:
authorDuncan P. N. Exon Smith <dexonsmith@apple.com>2015-01-08 22:42:30 +0000
committerDuncan P. N. Exon Smith <dexonsmith@apple.com>2015-01-08 22:42:30 +0000
commit953e1a48f02031be36094d5bfaf2685cf130bd02 (patch)
tree6cc3fb579f362928718a30208bbd81e93c7b9332 /llvm/lib/Transforms/Utils/ValueMapper.cpp
parent4bbe428cc5d734ac53af9821e6dc0c280d1eeac4 (diff)
downloadbcm5719-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.cpp14
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);
OpenPOWER on IntegriCloud