diff --git a/llvm/lib/Transforms/Utils/ValueMapper.cpp b/llvm/lib/Transforms/Utils/ValueMapper.cpp --- a/llvm/lib/Transforms/Utils/ValueMapper.cpp +++ b/llvm/lib/Transforms/Utils/ValueMapper.cpp @@ -26,8 +26,8 @@ #include "llvm/IR/DebugInfoMetadata.h" #include "llvm/IR/DerivedTypes.h" #include "llvm/IR/Function.h" -#include "llvm/IR/GlobalObject.h" #include "llvm/IR/GlobalIndirectSymbol.h" +#include "llvm/IR/GlobalObject.h" #include "llvm/IR/GlobalVariable.h" #include "llvm/IR/InlineAsm.h" #include "llvm/IR/Instruction.h" @@ -37,6 +37,7 @@ #include "llvm/IR/Type.h" #include "llvm/IR/Value.h" #include "llvm/Support/Casting.h" +#include "llvm/Support/Debug.h" #include #include #include @@ -44,6 +45,8 @@ using namespace llvm; +#define DEBUG_TYPE "value-mapper" + // Out of line method to get vtable etc for class. void ValueMapTypeRemapper::anchor() {} void ValueMaterializer::anchor() {} @@ -546,10 +549,16 @@ MDNode *MDNodeMapper::mapDistinctNode(const MDNode &N) { assert(N.isDistinct() && "Expected a distinct node"); assert(!M.getVM().getMappedMD(&N) && "Expected an unmapped node"); - DistinctWorklist.push_back( - cast((M.Flags & RF_MoveDistinctMDs) - ? M.mapToSelf(&N) - : M.mapToMetadata(&N, cloneOrBuildODR(N)))); + Metadata *NewM = nullptr; + if (M.Flags & RF_MoveDistinctMDs) { + NewM = M.mapToSelf(&N); + } else { + NewM = cloneOrBuildODR(N); + LLVM_DEBUG(dbgs() << "\nMap " << N << "\n" + << "To " << *NewM << "\n\n"); + M.mapToMetadata(&N, NewM); + } + DistinctWorklist.push_back(cast(NewM)); return DistinctWorklist.back(); } @@ -597,6 +606,9 @@ for (unsigned I = 0, E = N.getNumOperands(); I != E; ++I) { Metadata *Old = N.getOperand(I); Metadata *New = mapOperand(Old); + if (Old != New) + LLVM_DEBUG(dbgs() << "Replacing Op " << Old << " with " << New << " in " + << N << "\n"); if (Old != New) N.replaceOperandWith(I, New); @@ -716,6 +728,11 @@ }); auto *NewN = MDNode::replaceWithUniqued(std::move(ClonedN)); + if (N && NewN && N != NewN) { + LLVM_DEBUG(dbgs() << "\nMap " << *N << "\n" + << "To " << *NewN << "\n\n"); + } + M.mapToMetadata(N, NewN); // Nodes that were referenced out of order in the POT are involved in a