- for (unsigned i = 0, e = MD->getNumOperands(); i != e; ++i)
- Elts.push_back(MD->getOperand(i) ? MapValue(MD->getOperand(i), VM) : 0);
- return VM[V] = MDNode::get(V->getContext(), Elts.data(), Elts.size());
+ // If metadata element is mapped to a new value then seed metadata
+ // in the map.
+ for (unsigned i = 0, e = MD->getNumOperands(); i != e; ++i) {
+ if (!MD->getOperand(i))
+ Elts.push_back(0);
+ else {
+ Value *MappedOp = MapValue(MD->getOperand(i), VM);
+ if (MappedOp != MD->getOperand(i))
+ ReuseMD = false;
+ Elts.push_back(MappedOp);
+ }
+ }
+ if (ReuseMD) {
+ VM.insert(std::make_pair(V, const_cast<Value*>(V)));
+ return const_cast<Value*>(V);
+ }
+ MDNode *NewMD = MDNode::get(V->getContext(), Elts.data(), Elts.size());
+ VM.insert(std::make_pair(V, NewMD));
+ return NewMD;