1515#define LLVM_TRANSFORMS_UTILS_VALUEMAPPER_H
1616
1717#include " llvm/ADT/ArrayRef.h"
18+ #include " llvm/ADT/SmallPtrSet.h"
1819#include " llvm/ADT/simple_ilist.h"
1920#include " llvm/IR/ValueHandle.h"
2021#include " llvm/IR/ValueMap.h"
@@ -35,6 +36,7 @@ class Value;
3536
3637using ValueToValueMapTy = ValueMap<const Value *, WeakTrackingVH>;
3738using DbgRecordIterator = simple_ilist<DbgRecord>::iterator;
39+ using MetadataSetTy = SmallPtrSet<const Metadata *, 16 >;
3840
3941// / This is a class that can be implemented by clients to remap types when
4042// / cloning constants and instructions.
@@ -136,6 +138,18 @@ inline RemapFlags operator|(RemapFlags LHS, RemapFlags RHS) {
136138// / alternate \a ValueToValueMapTy and \a ValueMaterializer and returns a ID to
137139// / pass into the schedule*() functions.
138140// /
141+ // / NOTE: \c IdentityMD is used by CloneFunction* to directly specify metadata
142+ // / that should be identity mapped (and hence not cloned). The metadata will be
143+ // / identity mapped in \c VM on first use. There are several reasons for doing
144+ // / it this way rather than eagerly identity mapping metadata nodes in \c VM:
145+ // / 1. Mapping metadata is not cheap, particularly because of tracking.
146+ // / 2. When cloning a Function we identity map lots of global module-level
147+ // / metadata to avoid cloning it, while only a fraction of it is actually
148+ // / used by the function. Mapping on first use is a lot faster for modules
149+ // / with meaningful amount of debug info.
150+ // / 3. Eagerly identity mapping metadata makes it harder to cache module-level
151+ // / data (e.g. a set of metadata nodes in a \a DICompileUnit).
152+ // /
139153// / TODO: lib/Linker really doesn't need the \a ValueHandle in the \a
140154// / ValueToValueMapTy. We should template \a ValueMapper (and its
141155// / implementation classes), and explicitly instantiate on two concrete
@@ -152,7 +166,8 @@ class ValueMapper {
152166public:
153167 ValueMapper (ValueToValueMapTy &VM, RemapFlags Flags = RF_None,
154168 ValueMapTypeRemapper *TypeMapper = nullptr ,
155- ValueMaterializer *Materializer = nullptr );
169+ ValueMaterializer *Materializer = nullptr ,
170+ const MetadataSetTy *IdentityMD = nullptr );
156171 ValueMapper (ValueMapper &&) = delete ;
157172 ValueMapper (const ValueMapper &) = delete ;
158173 ValueMapper &operator =(ValueMapper &&) = delete ;
@@ -218,8 +233,10 @@ class ValueMapper {
218233inline Value *MapValue (const Value *V, ValueToValueMapTy &VM,
219234 RemapFlags Flags = RF_None,
220235 ValueMapTypeRemapper *TypeMapper = nullptr ,
221- ValueMaterializer *Materializer = nullptr ) {
222- return ValueMapper (VM, Flags, TypeMapper, Materializer).mapValue (*V);
236+ ValueMaterializer *Materializer = nullptr ,
237+ const MetadataSetTy *IdentityMD = nullptr ) {
238+ return ValueMapper (VM, Flags, TypeMapper, Materializer, IdentityMD)
239+ .mapValue (*V);
223240}
224241
225242// / Lookup or compute a mapping for a piece of metadata.
@@ -231,7 +248,9 @@ inline Value *MapValue(const Value *V, ValueToValueMapTy &VM,
231248// / \c MD.
232249// / 3. Else if \c MD is a \a ConstantAsMetadata, call \a MapValue() and
233250// / re-wrap its return (returning nullptr on nullptr).
234- // / 4. Else, \c MD is an \a MDNode. These are remapped, along with their
251+ // / 4. Else if \c MD is in \c IdentityMD then add an identity mapping for it
252+ // / and return it.
253+ // / 5. Else, \c MD is an \a MDNode. These are remapped, along with their
235254// / transitive operands. Distinct nodes are duplicated or moved depending
236255// / on \a RF_MoveDistinctNodes. Uniqued nodes are remapped like constants.
237256// /
@@ -240,16 +259,20 @@ inline Value *MapValue(const Value *V, ValueToValueMapTy &VM,
240259inline Metadata *MapMetadata (const Metadata *MD, ValueToValueMapTy &VM,
241260 RemapFlags Flags = RF_None,
242261 ValueMapTypeRemapper *TypeMapper = nullptr ,
243- ValueMaterializer *Materializer = nullptr ) {
244- return ValueMapper (VM, Flags, TypeMapper, Materializer).mapMetadata (*MD);
262+ ValueMaterializer *Materializer = nullptr ,
263+ const MetadataSetTy *IdentityMD = nullptr ) {
264+ return ValueMapper (VM, Flags, TypeMapper, Materializer, IdentityMD)
265+ .mapMetadata (*MD);
245266}
246267
247268// / Version of MapMetadata with type safety for MDNode.
248269inline MDNode *MapMetadata (const MDNode *MD, ValueToValueMapTy &VM,
249270 RemapFlags Flags = RF_None,
250271 ValueMapTypeRemapper *TypeMapper = nullptr ,
251- ValueMaterializer *Materializer = nullptr ) {
252- return ValueMapper (VM, Flags, TypeMapper, Materializer).mapMDNode (*MD);
272+ ValueMaterializer *Materializer = nullptr ,
273+ const MetadataSetTy *IdentityMD = nullptr ) {
274+ return ValueMapper (VM, Flags, TypeMapper, Materializer, IdentityMD)
275+ .mapMDNode (*MD);
253276}
254277
255278// / Convert the instruction operands from referencing the current values into
@@ -263,17 +286,21 @@ inline MDNode *MapMetadata(const MDNode *MD, ValueToValueMapTy &VM,
263286inline void RemapInstruction (Instruction *I, ValueToValueMapTy &VM,
264287 RemapFlags Flags = RF_None,
265288 ValueMapTypeRemapper *TypeMapper = nullptr ,
266- ValueMaterializer *Materializer = nullptr ) {
267- ValueMapper (VM, Flags, TypeMapper, Materializer).remapInstruction (*I);
289+ ValueMaterializer *Materializer = nullptr ,
290+ const MetadataSetTy *IdentityMD = nullptr ) {
291+ ValueMapper (VM, Flags, TypeMapper, Materializer, IdentityMD)
292+ .remapInstruction (*I);
268293}
269294
270295// / Remap the Values used in the DbgRecord \a DR using the value map \a
271296// / VM.
272297inline void RemapDbgRecord (Module *M, DbgRecord *DR, ValueToValueMapTy &VM,
273298 RemapFlags Flags = RF_None,
274299 ValueMapTypeRemapper *TypeMapper = nullptr ,
275- ValueMaterializer *Materializer = nullptr ) {
276- ValueMapper (VM, Flags, TypeMapper, Materializer).remapDbgRecord (M, *DR);
300+ ValueMaterializer *Materializer = nullptr ,
301+ const MetadataSetTy *IdentityMD = nullptr ) {
302+ ValueMapper (VM, Flags, TypeMapper, Materializer, IdentityMD)
303+ .remapDbgRecord (M, *DR);
277304}
278305
279306// / Remap the Values used in the DbgRecords \a Range using the value map \a
@@ -283,8 +310,9 @@ inline void RemapDbgRecordRange(Module *M,
283310 ValueToValueMapTy &VM,
284311 RemapFlags Flags = RF_None,
285312 ValueMapTypeRemapper *TypeMapper = nullptr ,
286- ValueMaterializer *Materializer = nullptr ) {
287- ValueMapper (VM, Flags, TypeMapper, Materializer)
313+ ValueMaterializer *Materializer = nullptr ,
314+ const MetadataSetTy *IdentityMD = nullptr ) {
315+ ValueMapper (VM, Flags, TypeMapper, Materializer, IdentityMD)
288316 .remapDbgRecordRange (M, Range);
289317}
290318
@@ -297,16 +325,19 @@ inline void RemapDbgRecordRange(Module *M,
297325inline void RemapFunction (Function &F, ValueToValueMapTy &VM,
298326 RemapFlags Flags = RF_None,
299327 ValueMapTypeRemapper *TypeMapper = nullptr ,
300- ValueMaterializer *Materializer = nullptr ) {
301- ValueMapper (VM, Flags, TypeMapper, Materializer).remapFunction (F);
328+ ValueMaterializer *Materializer = nullptr ,
329+ const MetadataSetTy *IdentityMD = nullptr ) {
330+ ValueMapper (VM, Flags, TypeMapper, Materializer, IdentityMD).remapFunction (F);
302331}
303332
304333// / Version of MapValue with type safety for Constant.
305334inline Constant *MapValue (const Constant *V, ValueToValueMapTy &VM,
306335 RemapFlags Flags = RF_None,
307336 ValueMapTypeRemapper *TypeMapper = nullptr ,
308- ValueMaterializer *Materializer = nullptr ) {
309- return ValueMapper (VM, Flags, TypeMapper, Materializer).mapConstant (*V);
337+ ValueMaterializer *Materializer = nullptr ,
338+ const MetadataSetTy *IdentityMD = nullptr ) {
339+ return ValueMapper (VM, Flags, TypeMapper, Materializer, IdentityMD)
340+ .mapConstant (*V);
310341}
311342
312343} // end namespace llvm
0 commit comments