diff options
-rw-r--r-- | llvm/lib/Transforms/Utils/ValueMapper.cpp | 13 |
1 files changed, 11 insertions, 2 deletions
diff --git a/llvm/lib/Transforms/Utils/ValueMapper.cpp b/llvm/lib/Transforms/Utils/ValueMapper.cpp index e22922b9fbb..9f50ad18ff0 100644 --- a/llvm/lib/Transforms/Utils/ValueMapper.cpp +++ b/llvm/lib/Transforms/Utils/ValueMapper.cpp @@ -686,10 +686,19 @@ void MDNodeMapper::mapUniquedNodes() { continue; } + // Remember whether this node had a placeholder. + bool HadPlaceholder(D.Placeholder); + + // Clone the uniqued node and remap the operands. TempMDNode ClonedN = D.Placeholder ? std::move(D.Placeholder) : N->clone(); remapOperands(D, *ClonedN); - CyclicNodes.push_back(MDNode::replaceWithUniqued(std::move(ClonedN))); - M.mapToMetadata(N, CyclicNodes.back()); + auto *NewN = MDNode::replaceWithUniqued(std::move(ClonedN)); + M.mapToMetadata(N, NewN); + + // Nodes that were referenced out of order in the POT are involved in a + // uniquing cycle. + if (HadPlaceholder) + CyclicNodes.push_back(NewN); } // Resolve cycles. |