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.
@@ -112,7 +114,7 @@ inline RemapFlags operator|(RemapFlags LHS, RemapFlags RHS) {
112
114
// /
113
115
// / A shared context used for mapping and remapping of Value and Metadata
114
116
// / instances using \a ValueToValueMapTy, \a RemapFlags, \a
115
- // / ValueMapTypeRemapper, and \a ValueMaterializer .
117
+ // / ValueMapTypeRemapper, \a ValueMaterializer, and \a IdentityMD .
116
118
// /
117
119
// / There are a number of top-level entry points:
118
120
// / - \a mapValue() (and \a mapConstant());
@@ -136,6 +138,9 @@ 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
+ // / If an \a IdentityMD set is optionally provided, \a Metadata inside this set
142
+ // / will be mapped onto itself in \a VM on first use.
143
+ // /
139
144
// / TODO: lib/Linker really doesn't need the \a ValueHandle in the \a
140
145
// / ValueToValueMapTy. We should template \a ValueMapper (and its
141
146
// / implementation classes), and explicitly instantiate on two concrete
@@ -152,7 +157,8 @@ class ValueMapper {
152
157
public:
153
158
ValueMapper (ValueToValueMapTy &VM, RemapFlags Flags = RF_None,
154
159
ValueMapTypeRemapper *TypeMapper = nullptr ,
155
- ValueMaterializer *Materializer = nullptr );
160
+ ValueMaterializer *Materializer = nullptr ,
161
+ const MetadataSetTy *IdentityMD = nullptr );
156
162
ValueMapper (ValueMapper &&) = delete ;
157
163
ValueMapper (const ValueMapper &) = delete ;
158
164
ValueMapper &operator =(ValueMapper &&) = delete ;
@@ -218,8 +224,10 @@ class ValueMapper {
218
224
inline Value *MapValue (const Value *V, ValueToValueMapTy &VM,
219
225
RemapFlags Flags = RF_None,
220
226
ValueMapTypeRemapper *TypeMapper = nullptr ,
221
- ValueMaterializer *Materializer = nullptr ) {
222
- return ValueMapper (VM, Flags, TypeMapper, Materializer).mapValue (*V);
227
+ ValueMaterializer *Materializer = nullptr ,
228
+ const MetadataSetTy *IdentityMD = nullptr ) {
229
+ return ValueMapper (VM, Flags, TypeMapper, Materializer, IdentityMD)
230
+ .mapValue (*V);
223
231
}
224
232
225
233
// / Lookup or compute a mapping for a piece of metadata.
@@ -231,7 +239,9 @@ inline Value *MapValue(const Value *V, ValueToValueMapTy &VM,
231
239
// / \c MD.
232
240
// / 3. Else if \c MD is a \a ConstantAsMetadata, call \a MapValue() and
233
241
// / re-wrap its return (returning nullptr on nullptr).
234
- // / 4. Else, \c MD is an \a MDNode. These are remapped, along with their
242
+ // / 4. Else if \c MD is in \c IdentityMD then add an identity mapping for it
243
+ // / and return it.
244
+ // / 5. Else, \c MD is an \a MDNode. These are remapped, along with their
235
245
// / transitive operands. Distinct nodes are duplicated or moved depending
236
246
// / on \a RF_MoveDistinctNodes. Uniqued nodes are remapped like constants.
237
247
// /
@@ -240,16 +250,20 @@ inline Value *MapValue(const Value *V, ValueToValueMapTy &VM,
240
250
inline Metadata *MapMetadata (const Metadata *MD, ValueToValueMapTy &VM,
241
251
RemapFlags Flags = RF_None,
242
252
ValueMapTypeRemapper *TypeMapper = nullptr ,
243
- ValueMaterializer *Materializer = nullptr ) {
244
- return ValueMapper (VM, Flags, TypeMapper, Materializer).mapMetadata (*MD);
253
+ ValueMaterializer *Materializer = nullptr ,
254
+ const MetadataSetTy *IdentityMD = nullptr ) {
255
+ return ValueMapper (VM, Flags, TypeMapper, Materializer, IdentityMD)
256
+ .mapMetadata (*MD);
245
257
}
246
258
247
259
// / Version of MapMetadata with type safety for MDNode.
248
260
inline MDNode *MapMetadata (const MDNode *MD, ValueToValueMapTy &VM,
249
261
RemapFlags Flags = RF_None,
250
262
ValueMapTypeRemapper *TypeMapper = nullptr ,
251
- ValueMaterializer *Materializer = nullptr ) {
252
- return ValueMapper (VM, Flags, TypeMapper, Materializer).mapMDNode (*MD);
263
+ ValueMaterializer *Materializer = nullptr ,
264
+ const MetadataSetTy *IdentityMD = nullptr ) {
265
+ return ValueMapper (VM, Flags, TypeMapper, Materializer, IdentityMD)
266
+ .mapMDNode (*MD);
253
267
}
254
268
255
269
// / Convert the instruction operands from referencing the current values into
@@ -263,17 +277,21 @@ inline MDNode *MapMetadata(const MDNode *MD, ValueToValueMapTy &VM,
263
277
inline void RemapInstruction (Instruction *I, ValueToValueMapTy &VM,
264
278
RemapFlags Flags = RF_None,
265
279
ValueMapTypeRemapper *TypeMapper = nullptr ,
266
- ValueMaterializer *Materializer = nullptr ) {
267
- ValueMapper (VM, Flags, TypeMapper, Materializer).remapInstruction (*I);
280
+ ValueMaterializer *Materializer = nullptr ,
281
+ const MetadataSetTy *IdentityMD = nullptr ) {
282
+ ValueMapper (VM, Flags, TypeMapper, Materializer, IdentityMD)
283
+ .remapInstruction (*I);
268
284
}
269
285
270
286
// / Remap the Values used in the DbgRecord \a DR using the value map \a
271
287
// / VM.
272
288
inline void RemapDbgRecord (Module *M, DbgRecord *DR, ValueToValueMapTy &VM,
273
289
RemapFlags Flags = RF_None,
274
290
ValueMapTypeRemapper *TypeMapper = nullptr ,
275
- ValueMaterializer *Materializer = nullptr ) {
276
- ValueMapper (VM, Flags, TypeMapper, Materializer).remapDbgRecord (M, *DR);
291
+ ValueMaterializer *Materializer = nullptr ,
292
+ const MetadataSetTy *IdentityMD = nullptr ) {
293
+ ValueMapper (VM, Flags, TypeMapper, Materializer, IdentityMD)
294
+ .remapDbgRecord (M, *DR);
277
295
}
278
296
279
297
// / Remap the Values used in the DbgRecords \a Range using the value map \a
@@ -283,8 +301,9 @@ inline void RemapDbgRecordRange(Module *M,
283
301
ValueToValueMapTy &VM,
284
302
RemapFlags Flags = RF_None,
285
303
ValueMapTypeRemapper *TypeMapper = nullptr ,
286
- ValueMaterializer *Materializer = nullptr ) {
287
- ValueMapper (VM, Flags, TypeMapper, Materializer)
304
+ ValueMaterializer *Materializer = nullptr ,
305
+ const MetadataSetTy *IdentityMD = nullptr ) {
306
+ ValueMapper (VM, Flags, TypeMapper, Materializer, IdentityMD)
288
307
.remapDbgRecordRange (M, Range);
289
308
}
290
309
@@ -297,16 +316,19 @@ inline void RemapDbgRecordRange(Module *M,
297
316
inline void RemapFunction (Function &F, ValueToValueMapTy &VM,
298
317
RemapFlags Flags = RF_None,
299
318
ValueMapTypeRemapper *TypeMapper = nullptr ,
300
- ValueMaterializer *Materializer = nullptr ) {
301
- ValueMapper (VM, Flags, TypeMapper, Materializer).remapFunction (F);
319
+ ValueMaterializer *Materializer = nullptr ,
320
+ const MetadataSetTy *IdentityMD = nullptr ) {
321
+ ValueMapper (VM, Flags, TypeMapper, Materializer, IdentityMD).remapFunction (F);
302
322
}
303
323
304
324
// / Version of MapValue with type safety for Constant.
305
325
inline Constant *MapValue (const Constant *V, ValueToValueMapTy &VM,
306
326
RemapFlags Flags = RF_None,
307
327
ValueMapTypeRemapper *TypeMapper = nullptr ,
308
- ValueMaterializer *Materializer = nullptr ) {
309
- return ValueMapper (VM, Flags, TypeMapper, Materializer).mapConstant (*V);
328
+ ValueMaterializer *Materializer = nullptr ,
329
+ const MetadataSetTy *IdentityMD = nullptr ) {
330
+ return ValueMapper (VM, Flags, TypeMapper, Materializer, IdentityMD)
331
+ .mapConstant (*V);
310
332
}
311
333
312
334
} // end namespace llvm
0 commit comments