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.
@@ -112,7 +114,7 @@ inline RemapFlags operator|(RemapFlags LHS, RemapFlags RHS) {
112114// /
113115// / A shared context used for mapping and remapping of Value and Metadata
114116// / instances using \a ValueToValueMapTy, \a RemapFlags, \a
115- // / ValueMapTypeRemapper, and \a ValueMaterializer .
117+ // / ValueMapTypeRemapper, \a ValueMaterializer, and \a IdentityMD .
116118// /
117119// / There are a number of top-level entry points:
118120// / - \a mapValue() (and \a mapConstant());
@@ -136,6 +138,9 @@ 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+ // / 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+ // /
139144// / TODO: lib/Linker really doesn't need the \a ValueHandle in the \a
140145// / ValueToValueMapTy. We should template \a ValueMapper (and its
141146// / implementation classes), and explicitly instantiate on two concrete
@@ -152,7 +157,8 @@ class ValueMapper {
152157public:
153158 ValueMapper (ValueToValueMapTy &VM, RemapFlags Flags = RF_None,
154159 ValueMapTypeRemapper *TypeMapper = nullptr ,
155- ValueMaterializer *Materializer = nullptr );
160+ ValueMaterializer *Materializer = nullptr ,
161+ const MetadataSetTy *IdentityMD = nullptr );
156162 ValueMapper (ValueMapper &&) = delete ;
157163 ValueMapper (const ValueMapper &) = delete ;
158164 ValueMapper &operator =(ValueMapper &&) = delete ;
@@ -218,8 +224,10 @@ class ValueMapper {
218224inline Value *MapValue (const Value *V, ValueToValueMapTy &VM,
219225 RemapFlags Flags = RF_None,
220226 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);
223231}
224232
225233// / Lookup or compute a mapping for a piece of metadata.
@@ -231,7 +239,9 @@ inline Value *MapValue(const Value *V, ValueToValueMapTy &VM,
231239// / \c MD.
232240// / 3. Else if \c MD is a \a ConstantAsMetadata, call \a MapValue() and
233241// / 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
235245// / transitive operands. Distinct nodes are duplicated or moved depending
236246// / on \a RF_MoveDistinctNodes. Uniqued nodes are remapped like constants.
237247// /
@@ -240,16 +250,20 @@ inline Value *MapValue(const Value *V, ValueToValueMapTy &VM,
240250inline Metadata *MapMetadata (const Metadata *MD, ValueToValueMapTy &VM,
241251 RemapFlags Flags = RF_None,
242252 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);
245257}
246258
247259// / Version of MapMetadata with type safety for MDNode.
248260inline MDNode *MapMetadata (const MDNode *MD, ValueToValueMapTy &VM,
249261 RemapFlags Flags = RF_None,
250262 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);
253267}
254268
255269// / Convert the instruction operands from referencing the current values into
@@ -263,17 +277,21 @@ inline MDNode *MapMetadata(const MDNode *MD, ValueToValueMapTy &VM,
263277inline void RemapInstruction (Instruction *I, ValueToValueMapTy &VM,
264278 RemapFlags Flags = RF_None,
265279 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);
268284}
269285
270286// / Remap the Values used in the DbgRecord \a DR using the value map \a
271287// / VM.
272288inline void RemapDbgRecord (Module *M, DbgRecord *DR, ValueToValueMapTy &VM,
273289 RemapFlags Flags = RF_None,
274290 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);
277295}
278296
279297// / Remap the Values used in the DbgRecords \a Range using the value map \a
@@ -283,8 +301,9 @@ inline void RemapDbgRecordRange(Module *M,
283301 ValueToValueMapTy &VM,
284302 RemapFlags Flags = RF_None,
285303 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)
288307 .remapDbgRecordRange (M, Range);
289308}
290309
@@ -297,16 +316,19 @@ inline void RemapDbgRecordRange(Module *M,
297316inline void RemapFunction (Function &F, ValueToValueMapTy &VM,
298317 RemapFlags Flags = RF_None,
299318 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);
302322}
303323
304324// / Version of MapValue with type safety for Constant.
305325inline Constant *MapValue (const Constant *V, ValueToValueMapTy &VM,
306326 RemapFlags Flags = RF_None,
307327 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);
310332}
311333
312334} // end namespace llvm
0 commit comments