From cc1ea9cb4dea5b39b50faad5b4e1d4dde6e98d63 Mon Sep 17 00:00:00 2001 From: "Duncan P. N. Exon Smith" Date: Wed, 14 Jan 2015 01:08:47 +0000 Subject: [PATCH] Utils: Extract shouldRemapUniquedNode(), NFC git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@225911 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/Transforms/Utils/ValueMapper.cpp | 49 ++++++++++++++++++---------- 1 file changed, 31 insertions(+), 18 deletions(-) diff --git a/lib/Transforms/Utils/ValueMapper.cpp b/lib/Transforms/Utils/ValueMapper.cpp index de9db8fed70..d203220675c 100644 --- a/lib/Transforms/Utils/ValueMapper.cpp +++ b/lib/Transforms/Utils/ValueMapper.cpp @@ -202,6 +202,23 @@ static Metadata *mapDistinctNode(const UniquableMDNode *Node, return NewMD; } +/// \brief Check whether a uniqued node needs to be remapped. +/// +/// Check whether a uniqued node needs to be remapped (due to any operands +/// changing). +static bool shouldRemapUniquedNode(const UniquableMDNode *Node, + ValueToValueMapTy &VM, RemapFlags Flags, + ValueMapTypeRemapper *TypeMapper, + ValueMaterializer *Materializer) { + // Check all operands to see if any need to be remapped. + for (unsigned I = 0, E = Node->getNumOperands(); I != E; ++I) { + Metadata *Op = Node->getOperand(I); + if (Op != mapMetadataOp(Op, VM, Flags, TypeMapper, Materializer)) + return true; + } + return false; +} + /// \brief Map a uniqued MDNode. /// /// Uniqued nodes may not need to be recreated (they may map to themselves). @@ -216,28 +233,24 @@ static Metadata *mapUniquedNode(const UniquableMDNode *Node, mapToMetadata(VM, Node, Dummy); // Check all operands to see if any need to be remapped. - for (unsigned I = 0, E = Node->getNumOperands(); I != E; ++I) { - Metadata *Op = Node->getOperand(I); - if (Op == mapMetadataOp(Op, VM, Flags, TypeMapper, Materializer)) - continue; - - // Ok, at least one operand needs remapping. - SmallVector Elts; - Elts.reserve(Node->getNumOperands()); - for (I = 0; I != E; ++I) - Elts.push_back(mapMetadataOp(Node->getOperand(I), VM, Flags, TypeMapper, - Materializer)); - - MDNode *NewMD = MDTuple::get(Node->getContext(), Elts); - Dummy->replaceAllUsesWith(NewMD); + if (!shouldRemapUniquedNode(Node, VM, Flags, TypeMapper, Materializer)) { + // Use an identity mapping. + mapToSelf(VM, Node); MDNode::deleteTemporary(Dummy); - return mapToMetadata(VM, Node, NewMD); + return const_cast(static_cast(Node)); } - // No operands needed remapping. Use an identity mapping. - mapToSelf(VM, Node); + // At least one operand needs remapping. + SmallVector Elts; + Elts.reserve(Node->getNumOperands()); + for (unsigned I = 0, E = Node->getNumOperands(); I != E; ++I) + Elts.push_back(mapMetadataOp(Node->getOperand(I), VM, Flags, TypeMapper, + Materializer)); + + MDNode *NewMD = MDTuple::get(Node->getContext(), Elts); + Dummy->replaceAllUsesWith(NewMD); MDNode::deleteTemporary(Dummy); - return const_cast(static_cast(Node)); + return mapToMetadata(VM, Node, NewMD); } static Metadata *MapMetadataImpl(const Metadata *MD, ValueToValueMapTy &VM,