/// Remap the operands of an MDNode. /// /// If \c Node is temporary, uniquing cycles are ignored. If \c Node is /// distinct, uniquing cycles are resolved as they're found. /// /// \pre \c Node.isDistinct() or \c Node.isTemporary(). static bool remapOperands(MDNode &Node, SmallVectorImpl<MDNode *> &DistinctWorklist, ValueToValueMapTy &VM, RemapFlags Flags, ValueMapTypeRemapper *TypeMapper, ValueMaterializer *Materializer) { assert(!Node.isUniqued() && "Expected temporary or distinct node"); const bool IsDistinct = Node.isDistinct(); bool AnyChanged = false; for (unsigned I = 0, E = Node.getNumOperands(); I != E; ++I) { Metadata *Old = Node.getOperand(I); Metadata *New = mapMetadataOp(Old, DistinctWorklist, VM, Flags, TypeMapper, Materializer); if (Old != New) { AnyChanged = true; Node.replaceOperandWith(I, New); // Resolve uniquing cycles underneath distinct nodes on the fly so they // don't infect later operands. if (IsDistinct) resolveCycles(New); } } return AnyChanged; }
void MDNodeMapper::remapOperands(const Data &D, MDNode &N) { for (unsigned I = 0, E = N.getNumOperands(); I != E; ++I) { Metadata *Old = N.getOperand(I); Metadata *New; if (Optional<Metadata *> MappedOp = getMappedOp(Old)){ New = *MappedOp; } else { assert(!N.isDistinct() && "Expected all nodes to be pre-mapped for distinct operands"); MDNode &OldN = *cast<MDNode>(Old); assert(!OldN.isDistinct() && "Expected distinct nodes to be pre-mapped"); New = &getFwdReference(D, OldN); } if (Old != New) N.replaceOperandWith(I, New); } }