15
15
#define LLVM_TRANSFORMS_UTILS_VALUEMAPPER_H
16
16
17
17
#include " llvm/ADT/ArrayRef.h"
18
+ #include " llvm/ADT/SmallPtrSet.h"
18
19
#include " llvm/ADT/simple_ilist.h"
19
20
#include " llvm/IR/ValueHandle.h"
20
21
#include " llvm/IR/ValueMap.h"
@@ -35,6 +36,7 @@ class Value;
35
36
36
37
using ValueToValueMapTy = ValueMap<const Value *, WeakTrackingVH>;
37
38
using DbgRecordIterator = simple_ilist<DbgRecord>::iterator;
39
+ using MetadataSetTy = SmallPtrSet<const Metadata *, 16 >;
38
40
39
41
// / This is a class that can be implemented by clients to remap types when
40
42
// / cloning constants and instructions.
@@ -136,6 +138,18 @@ inline RemapFlags operator|(RemapFlags LHS, RemapFlags RHS) {
136
138
// / alternate \a ValueToValueMapTy and \a ValueMaterializer and returns a ID to
137
139
// / pass into the schedule*() functions.
138
140
// /
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
+ // /
139
153
// / TODO: lib/Linker really doesn't need the \a ValueHandle in the \a
140
154
// / ValueToValueMapTy. We should template \a ValueMapper (and its
141
155
// / implementation classes), and explicitly instantiate on two concrete
@@ -152,7 +166,8 @@ class ValueMapper {
152
166
public:
153
167
ValueMapper (ValueToValueMapTy &VM, RemapFlags Flags = RF_None,
154
168
ValueMapTypeRemapper *TypeMapper = nullptr ,
155
- ValueMaterializer *Materializer = nullptr );
169
+ ValueMaterializer *Materializer = nullptr ,
170
+ const MetadataSetTy *IdentityMD = nullptr );
156
171
ValueMapper (ValueMapper &&) = delete ;
157
172
ValueMapper (const ValueMapper &) = delete ;
158
173
ValueMapper &operator =(ValueMapper &&) = delete ;
@@ -218,8 +233,10 @@ class ValueMapper {
218
233
inline Value *MapValue (const Value *V, ValueToValueMapTy &VM,
219
234
RemapFlags Flags = RF_None,
220
235
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);
223
240
}
224
241
225
242
// / Lookup or compute a mapping for a piece of metadata.
@@ -231,7 +248,9 @@ inline Value *MapValue(const Value *V, ValueToValueMapTy &VM,
231
248
// / \c MD.
232
249
// / 3. Else if \c MD is a \a ConstantAsMetadata, call \a MapValue() and
233
250
// / 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
235
254
// / transitive operands. Distinct nodes are duplicated or moved depending
236
255
// / on \a RF_MoveDistinctNodes. Uniqued nodes are remapped like constants.
237
256
// /
@@ -240,16 +259,20 @@ inline Value *MapValue(const Value *V, ValueToValueMapTy &VM,
240
259
inline Metadata *MapMetadata (const Metadata *MD, ValueToValueMapTy &VM,
241
260
RemapFlags Flags = RF_None,
242
261
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);
245
266
}
246
267
247
268
// / Version of MapMetadata with type safety for MDNode.
248
269
inline MDNode *MapMetadata (const MDNode *MD, ValueToValueMapTy &VM,
249
270
RemapFlags Flags = RF_None,
250
271
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);
253
276
}
254
277
255
278
// / Convert the instruction operands from referencing the current values into
@@ -263,17 +286,21 @@ inline MDNode *MapMetadata(const MDNode *MD, ValueToValueMapTy &VM,
263
286
inline void RemapInstruction (Instruction *I, ValueToValueMapTy &VM,
264
287
RemapFlags Flags = RF_None,
265
288
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);
268
293
}
269
294
270
295
// / Remap the Values used in the DbgRecord \a DR using the value map \a
271
296
// / VM.
272
297
inline void RemapDbgRecord (Module *M, DbgRecord *DR, ValueToValueMapTy &VM,
273
298
RemapFlags Flags = RF_None,
274
299
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);
277
304
}
278
305
279
306
// / Remap the Values used in the DbgRecords \a Range using the value map \a
@@ -283,8 +310,9 @@ inline void RemapDbgRecordRange(Module *M,
283
310
ValueToValueMapTy &VM,
284
311
RemapFlags Flags = RF_None,
285
312
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)
288
316
.remapDbgRecordRange (M, Range);
289
317
}
290
318
@@ -297,16 +325,19 @@ inline void RemapDbgRecordRange(Module *M,
297
325
inline void RemapFunction (Function &F, ValueToValueMapTy &VM,
298
326
RemapFlags Flags = RF_None,
299
327
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);
302
331
}
303
332
304
333
// / Version of MapValue with type safety for Constant.
305
334
inline Constant *MapValue (const Constant *V, ValueToValueMapTy &VM,
306
335
RemapFlags Flags = RF_None,
307
336
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);
310
341
}
311
342
312
343
} // end namespace llvm
0 commit comments