Home | History | Annotate | Download | only in Utils
      1 //===- ValueMapper.cpp - Interface shared by lib/Transforms/Utils ---------===//
      2 //
      3 //                     The LLVM Compiler Infrastructure
      4 //
      5 // This file is distributed under the University of Illinois Open Source
      6 // License. See LICENSE.TXT for details.
      7 //
      8 //===----------------------------------------------------------------------===//
      9 //
     10 // This file defines the MapValue function, which is shared by various parts of
     11 // the lib/Transforms/Utils library.
     12 //
     13 //===----------------------------------------------------------------------===//
     14 
     15 #include "llvm/Transforms/Utils/ValueMapper.h"
     16 #include "llvm/IR/CallSite.h"
     17 #include "llvm/IR/Constants.h"
     18 #include "llvm/IR/Function.h"
     19 #include "llvm/IR/InlineAsm.h"
     20 #include "llvm/IR/Instructions.h"
     21 #include "llvm/IR/Metadata.h"
     22 #include "llvm/IR/Operator.h"
     23 using namespace llvm;
     24 
     25 // Out of line method to get vtable etc for class.
     26 void ValueMapTypeRemapper::anchor() {}
     27 void ValueMaterializer::anchor() {}
     28 void ValueMaterializer::materializeInitFor(GlobalValue *New, GlobalValue *Old) {
     29 }
     30 
     31 Value *llvm::MapValue(const Value *V, ValueToValueMapTy &VM, RemapFlags Flags,
     32                       ValueMapTypeRemapper *TypeMapper,
     33                       ValueMaterializer *Materializer) {
     34   ValueToValueMapTy::iterator I = VM.find(V);
     35 
     36   // If the value already exists in the map, use it.
     37   if (I != VM.end() && I->second) return I->second;
     38 
     39   // If we have a materializer and it can materialize a value, use that.
     40   if (Materializer) {
     41     if (Value *NewV =
     42             Materializer->materializeDeclFor(const_cast<Value *>(V))) {
     43       VM[V] = NewV;
     44       if (auto *NewGV = dyn_cast<GlobalValue>(NewV))
     45         Materializer->materializeInitFor(
     46             NewGV, const_cast<GlobalValue *>(cast<GlobalValue>(V)));
     47       return NewV;
     48     }
     49   }
     50 
     51   // Global values do not need to be seeded into the VM if they
     52   // are using the identity mapping.
     53   if (isa<GlobalValue>(V)) {
     54     if (Flags & RF_NullMapMissingGlobalValues) {
     55       assert(!(Flags & RF_IgnoreMissingEntries) &&
     56              "Illegal to specify both RF_NullMapMissingGlobalValues and "
     57              "RF_IgnoreMissingEntries");
     58       return nullptr;
     59     }
     60     return VM[V] = const_cast<Value*>(V);
     61   }
     62 
     63   if (const InlineAsm *IA = dyn_cast<InlineAsm>(V)) {
     64     // Inline asm may need *type* remapping.
     65     FunctionType *NewTy = IA->getFunctionType();
     66     if (TypeMapper) {
     67       NewTy = cast<FunctionType>(TypeMapper->remapType(NewTy));
     68 
     69       if (NewTy != IA->getFunctionType())
     70         V = InlineAsm::get(NewTy, IA->getAsmString(), IA->getConstraintString(),
     71                            IA->hasSideEffects(), IA->isAlignStack());
     72     }
     73 
     74     return VM[V] = const_cast<Value*>(V);
     75   }
     76 
     77   if (const auto *MDV = dyn_cast<MetadataAsValue>(V)) {
     78     const Metadata *MD = MDV->getMetadata();
     79     // If this is a module-level metadata and we know that nothing at the module
     80     // level is changing, then use an identity mapping.
     81     if (!isa<LocalAsMetadata>(MD) && (Flags & RF_NoModuleLevelChanges))
     82       return VM[V] = const_cast<Value *>(V);
     83 
     84     auto *MappedMD = MapMetadata(MD, VM, Flags, TypeMapper, Materializer);
     85     if (MD == MappedMD || (!MappedMD && (Flags & RF_IgnoreMissingEntries)))
     86       return VM[V] = const_cast<Value *>(V);
     87 
     88     // FIXME: This assert crashes during bootstrap, but I think it should be
     89     // correct.  For now, just match behaviour from before the metadata/value
     90     // split.
     91     //
     92     //    assert((MappedMD || (Flags & RF_NullMapMissingGlobalValues)) &&
     93     //           "Referenced metadata value not in value map");
     94     return VM[V] = MetadataAsValue::get(V->getContext(), MappedMD);
     95   }
     96 
     97   // Okay, this either must be a constant (which may or may not be mappable) or
     98   // is something that is not in the mapping table.
     99   Constant *C = const_cast<Constant*>(dyn_cast<Constant>(V));
    100   if (!C)
    101     return nullptr;
    102 
    103   if (BlockAddress *BA = dyn_cast<BlockAddress>(C)) {
    104     Function *F =
    105       cast<Function>(MapValue(BA->getFunction(), VM, Flags, TypeMapper, Materializer));
    106     BasicBlock *BB = cast_or_null<BasicBlock>(MapValue(BA->getBasicBlock(), VM,
    107                                                        Flags, TypeMapper, Materializer));
    108     return VM[V] = BlockAddress::get(F, BB ? BB : BA->getBasicBlock());
    109   }
    110 
    111   // Otherwise, we have some other constant to remap.  Start by checking to see
    112   // if all operands have an identity remapping.
    113   unsigned OpNo = 0, NumOperands = C->getNumOperands();
    114   Value *Mapped = nullptr;
    115   for (; OpNo != NumOperands; ++OpNo) {
    116     Value *Op = C->getOperand(OpNo);
    117     Mapped = MapValue(Op, VM, Flags, TypeMapper, Materializer);
    118     if (Mapped != C) break;
    119   }
    120 
    121   // See if the type mapper wants to remap the type as well.
    122   Type *NewTy = C->getType();
    123   if (TypeMapper)
    124     NewTy = TypeMapper->remapType(NewTy);
    125 
    126   // If the result type and all operands match up, then just insert an identity
    127   // mapping.
    128   if (OpNo == NumOperands && NewTy == C->getType())
    129     return VM[V] = C;
    130 
    131   // Okay, we need to create a new constant.  We've already processed some or
    132   // all of the operands, set them all up now.
    133   SmallVector<Constant*, 8> Ops;
    134   Ops.reserve(NumOperands);
    135   for (unsigned j = 0; j != OpNo; ++j)
    136     Ops.push_back(cast<Constant>(C->getOperand(j)));
    137 
    138   // If one of the operands mismatch, push it and the other mapped operands.
    139   if (OpNo != NumOperands) {
    140     Ops.push_back(cast<Constant>(Mapped));
    141 
    142     // Map the rest of the operands that aren't processed yet.
    143     for (++OpNo; OpNo != NumOperands; ++OpNo)
    144       Ops.push_back(MapValue(cast<Constant>(C->getOperand(OpNo)), VM,
    145                              Flags, TypeMapper, Materializer));
    146   }
    147   Type *NewSrcTy = nullptr;
    148   if (TypeMapper)
    149     if (auto *GEPO = dyn_cast<GEPOperator>(C))
    150       NewSrcTy = TypeMapper->remapType(GEPO->getSourceElementType());
    151 
    152   if (ConstantExpr *CE = dyn_cast<ConstantExpr>(C))
    153     return VM[V] = CE->getWithOperands(Ops, NewTy, false, NewSrcTy);
    154   if (isa<ConstantArray>(C))
    155     return VM[V] = ConstantArray::get(cast<ArrayType>(NewTy), Ops);
    156   if (isa<ConstantStruct>(C))
    157     return VM[V] = ConstantStruct::get(cast<StructType>(NewTy), Ops);
    158   if (isa<ConstantVector>(C))
    159     return VM[V] = ConstantVector::get(Ops);
    160   // If this is a no-operand constant, it must be because the type was remapped.
    161   if (isa<UndefValue>(C))
    162     return VM[V] = UndefValue::get(NewTy);
    163   if (isa<ConstantAggregateZero>(C))
    164     return VM[V] = ConstantAggregateZero::get(NewTy);
    165   assert(isa<ConstantPointerNull>(C));
    166   return VM[V] = ConstantPointerNull::get(cast<PointerType>(NewTy));
    167 }
    168 
    169 static Metadata *mapToMetadata(ValueToValueMapTy &VM, const Metadata *Key,
    170                                Metadata *Val, ValueMaterializer *Materializer,
    171                                RemapFlags Flags) {
    172   VM.MD()[Key].reset(Val);
    173   if (Materializer && !(Flags & RF_HaveUnmaterializedMetadata)) {
    174     auto *N = dyn_cast_or_null<MDNode>(Val);
    175     // Need to invoke this once we have non-temporary MD.
    176     if (!N || !N->isTemporary())
    177       Materializer->replaceTemporaryMetadata(Key, Val);
    178   }
    179   return Val;
    180 }
    181 
    182 static Metadata *mapToSelf(ValueToValueMapTy &VM, const Metadata *MD,
    183                            ValueMaterializer *Materializer, RemapFlags Flags) {
    184   return mapToMetadata(VM, MD, const_cast<Metadata *>(MD), Materializer, Flags);
    185 }
    186 
    187 static Metadata *MapMetadataImpl(const Metadata *MD,
    188                                  SmallVectorImpl<MDNode *> &DistinctWorklist,
    189                                  ValueToValueMapTy &VM, RemapFlags Flags,
    190                                  ValueMapTypeRemapper *TypeMapper,
    191                                  ValueMaterializer *Materializer);
    192 
    193 static Metadata *mapMetadataOp(Metadata *Op,
    194                                SmallVectorImpl<MDNode *> &DistinctWorklist,
    195                                ValueToValueMapTy &VM, RemapFlags Flags,
    196                                ValueMapTypeRemapper *TypeMapper,
    197                                ValueMaterializer *Materializer) {
    198   if (!Op)
    199     return nullptr;
    200 
    201   if (Materializer && !Materializer->isMetadataNeeded(Op))
    202     return nullptr;
    203 
    204   if (Metadata *MappedOp = MapMetadataImpl(Op, DistinctWorklist, VM, Flags,
    205                                            TypeMapper, Materializer))
    206     return MappedOp;
    207   // Use identity map if MappedOp is null and we can ignore missing entries.
    208   if (Flags & RF_IgnoreMissingEntries)
    209     return Op;
    210 
    211   // FIXME: This assert crashes during bootstrap, but I think it should be
    212   // correct.  For now, just match behaviour from before the metadata/value
    213   // split.
    214   //
    215   //    assert((Flags & RF_NullMapMissingGlobalValues) &&
    216   //           "Referenced metadata not in value map!");
    217   return nullptr;
    218 }
    219 
    220 /// Resolve uniquing cycles involving the given metadata.
    221 static void resolveCycles(Metadata *MD, bool MDMaterialized) {
    222   if (auto *N = dyn_cast_or_null<MDNode>(MD)) {
    223     if (!MDMaterialized && N->isTemporary())
    224       return;
    225     if (!N->isResolved())
    226       N->resolveCycles(MDMaterialized);
    227   }
    228 }
    229 
    230 /// Remap the operands of an MDNode.
    231 ///
    232 /// If \c Node is temporary, uniquing cycles are ignored.  If \c Node is
    233 /// distinct, uniquing cycles are resolved as they're found.
    234 ///
    235 /// \pre \c Node.isDistinct() or \c Node.isTemporary().
    236 static bool remapOperands(MDNode &Node,
    237                           SmallVectorImpl<MDNode *> &DistinctWorklist,
    238                           ValueToValueMapTy &VM, RemapFlags Flags,
    239                           ValueMapTypeRemapper *TypeMapper,
    240                           ValueMaterializer *Materializer) {
    241   assert(!Node.isUniqued() && "Expected temporary or distinct node");
    242   const bool IsDistinct = Node.isDistinct();
    243 
    244   bool AnyChanged = false;
    245   for (unsigned I = 0, E = Node.getNumOperands(); I != E; ++I) {
    246     Metadata *Old = Node.getOperand(I);
    247     Metadata *New = mapMetadataOp(Old, DistinctWorklist, VM, Flags, TypeMapper,
    248                                   Materializer);
    249     if (Old != New) {
    250       AnyChanged = true;
    251       Node.replaceOperandWith(I, New);
    252 
    253       // Resolve uniquing cycles underneath distinct nodes on the fly so they
    254       // don't infect later operands.
    255       if (IsDistinct)
    256         resolveCycles(New, !(Flags & RF_HaveUnmaterializedMetadata));
    257     }
    258   }
    259 
    260   return AnyChanged;
    261 }
    262 
    263 /// Map a distinct MDNode.
    264 ///
    265 /// Whether distinct nodes change is independent of their operands.  If \a
    266 /// RF_MoveDistinctMDs, then they are reused, and their operands remapped in
    267 /// place; effectively, they're moved from one graph to another.  Otherwise,
    268 /// they're cloned/duplicated, and the new copy's operands are remapped.
    269 static Metadata *mapDistinctNode(const MDNode *Node,
    270                                  SmallVectorImpl<MDNode *> &DistinctWorklist,
    271                                  ValueToValueMapTy &VM, RemapFlags Flags,
    272                                  ValueMapTypeRemapper *TypeMapper,
    273                                  ValueMaterializer *Materializer) {
    274   assert(Node->isDistinct() && "Expected distinct node");
    275 
    276   MDNode *NewMD;
    277   if (Flags & RF_MoveDistinctMDs)
    278     NewMD = const_cast<MDNode *>(Node);
    279   else
    280     NewMD = MDNode::replaceWithDistinct(Node->clone());
    281 
    282   // Remap operands later.
    283   DistinctWorklist.push_back(NewMD);
    284   return mapToMetadata(VM, Node, NewMD, Materializer, Flags);
    285 }
    286 
    287 /// \brief Map a uniqued MDNode.
    288 ///
    289 /// Uniqued nodes may not need to be recreated (they may map to themselves).
    290 static Metadata *mapUniquedNode(const MDNode *Node,
    291                                 SmallVectorImpl<MDNode *> &DistinctWorklist,
    292                                 ValueToValueMapTy &VM, RemapFlags Flags,
    293                                 ValueMapTypeRemapper *TypeMapper,
    294                                 ValueMaterializer *Materializer) {
    295   assert(((Flags & RF_HaveUnmaterializedMetadata) || Node->isUniqued()) &&
    296          "Expected uniqued node");
    297 
    298   // Create a temporary node and map it upfront in case we have a uniquing
    299   // cycle.  If necessary, this mapping will get updated by RAUW logic before
    300   // returning.
    301   auto ClonedMD = Node->clone();
    302   mapToMetadata(VM, Node, ClonedMD.get(), Materializer, Flags);
    303   if (!remapOperands(*ClonedMD, DistinctWorklist, VM, Flags, TypeMapper,
    304                      Materializer)) {
    305     // No operands changed, so use the original.
    306     ClonedMD->replaceAllUsesWith(const_cast<MDNode *>(Node));
    307     // Even though replaceAllUsesWith would have replaced the value map
    308     // entry, we need to explictly map with the final non-temporary node
    309     // to replace any temporary metadata via the callback.
    310     return mapToSelf(VM, Node, Materializer, Flags);
    311   }
    312 
    313   // Uniquify the cloned node. Explicitly map it with the final non-temporary
    314   // node so that replacement of temporary metadata via the callback occurs.
    315   return mapToMetadata(VM, Node,
    316                        MDNode::replaceWithUniqued(std::move(ClonedMD)),
    317                        Materializer, Flags);
    318 }
    319 
    320 static Metadata *MapMetadataImpl(const Metadata *MD,
    321                                  SmallVectorImpl<MDNode *> &DistinctWorklist,
    322                                  ValueToValueMapTy &VM, RemapFlags Flags,
    323                                  ValueMapTypeRemapper *TypeMapper,
    324                                  ValueMaterializer *Materializer) {
    325   // If the value already exists in the map, use it.
    326   if (Metadata *NewMD = VM.MD().lookup(MD).get())
    327     return NewMD;
    328 
    329   if (isa<MDString>(MD))
    330     return mapToSelf(VM, MD, Materializer, Flags);
    331 
    332   if (isa<ConstantAsMetadata>(MD))
    333     if ((Flags & RF_NoModuleLevelChanges))
    334       return mapToSelf(VM, MD, Materializer, Flags);
    335 
    336   if (const auto *VMD = dyn_cast<ValueAsMetadata>(MD)) {
    337     Value *MappedV =
    338         MapValue(VMD->getValue(), VM, Flags, TypeMapper, Materializer);
    339     if (VMD->getValue() == MappedV ||
    340         (!MappedV && (Flags & RF_IgnoreMissingEntries)))
    341       return mapToSelf(VM, MD, Materializer, Flags);
    342 
    343     // FIXME: This assert crashes during bootstrap, but I think it should be
    344     // correct.  For now, just match behaviour from before the metadata/value
    345     // split.
    346     //
    347     //    assert((MappedV || (Flags & RF_NullMapMissingGlobalValues)) &&
    348     //           "Referenced metadata not in value map!");
    349     if (MappedV)
    350       return mapToMetadata(VM, MD, ValueAsMetadata::get(MappedV), Materializer,
    351                            Flags);
    352     return nullptr;
    353   }
    354 
    355   // Note: this cast precedes the Flags check so we always get its associated
    356   // assertion.
    357   const MDNode *Node = cast<MDNode>(MD);
    358 
    359   // If this is a module-level metadata and we know that nothing at the
    360   // module level is changing, then use an identity mapping.
    361   if (Flags & RF_NoModuleLevelChanges)
    362     return mapToSelf(VM, MD, Materializer, Flags);
    363 
    364   // Require resolved nodes whenever metadata might be remapped.
    365   assert(((Flags & RF_HaveUnmaterializedMetadata) || Node->isResolved()) &&
    366          "Unexpected unresolved node");
    367 
    368   if (Materializer && Node->isTemporary()) {
    369     assert(Flags & RF_HaveUnmaterializedMetadata);
    370     Metadata *TempMD =
    371         Materializer->mapTemporaryMetadata(const_cast<Metadata *>(MD));
    372     // If the above callback returned an existing temporary node, use it
    373     // instead of the current temporary node. This happens when earlier
    374     // function importing passes already created and saved a temporary
    375     // metadata node for the same value id.
    376     if (TempMD) {
    377       mapToMetadata(VM, MD, TempMD, Materializer, Flags);
    378       return TempMD;
    379     }
    380   }
    381 
    382   if (Node->isDistinct())
    383     return mapDistinctNode(Node, DistinctWorklist, VM, Flags, TypeMapper,
    384                            Materializer);
    385 
    386   return mapUniquedNode(Node, DistinctWorklist, VM, Flags, TypeMapper,
    387                         Materializer);
    388 }
    389 
    390 Metadata *llvm::MapMetadata(const Metadata *MD, ValueToValueMapTy &VM,
    391                             RemapFlags Flags, ValueMapTypeRemapper *TypeMapper,
    392                             ValueMaterializer *Materializer) {
    393   SmallVector<MDNode *, 8> DistinctWorklist;
    394   Metadata *NewMD = MapMetadataImpl(MD, DistinctWorklist, VM, Flags, TypeMapper,
    395                                     Materializer);
    396 
    397   // When there are no module-level changes, it's possible that the metadata
    398   // graph has temporaries.  Skip the logic to resolve cycles, since it's
    399   // unnecessary (and invalid) in that case.
    400   if (Flags & RF_NoModuleLevelChanges)
    401     return NewMD;
    402 
    403   // Resolve cycles involving the entry metadata.
    404   resolveCycles(NewMD, !(Flags & RF_HaveUnmaterializedMetadata));
    405 
    406   // Remap the operands of distinct MDNodes.
    407   while (!DistinctWorklist.empty())
    408     remapOperands(*DistinctWorklist.pop_back_val(), DistinctWorklist, VM, Flags,
    409                   TypeMapper, Materializer);
    410 
    411   return NewMD;
    412 }
    413 
    414 MDNode *llvm::MapMetadata(const MDNode *MD, ValueToValueMapTy &VM,
    415                           RemapFlags Flags, ValueMapTypeRemapper *TypeMapper,
    416                           ValueMaterializer *Materializer) {
    417   return cast<MDNode>(MapMetadata(static_cast<const Metadata *>(MD), VM, Flags,
    418                                   TypeMapper, Materializer));
    419 }
    420 
    421 /// RemapInstruction - Convert the instruction operands from referencing the
    422 /// current values into those specified by VMap.
    423 ///
    424 void llvm::RemapInstruction(Instruction *I, ValueToValueMapTy &VMap,
    425                             RemapFlags Flags, ValueMapTypeRemapper *TypeMapper,
    426                             ValueMaterializer *Materializer){
    427   // Remap operands.
    428   for (User::op_iterator op = I->op_begin(), E = I->op_end(); op != E; ++op) {
    429     Value *V = MapValue(*op, VMap, Flags, TypeMapper, Materializer);
    430     // If we aren't ignoring missing entries, assert that something happened.
    431     if (V)
    432       *op = V;
    433     else
    434       assert((Flags & RF_IgnoreMissingEntries) &&
    435              "Referenced value not in value map!");
    436   }
    437 
    438   // Remap phi nodes' incoming blocks.
    439   if (PHINode *PN = dyn_cast<PHINode>(I)) {
    440     for (unsigned i = 0, e = PN->getNumIncomingValues(); i != e; ++i) {
    441       Value *V = MapValue(PN->getIncomingBlock(i), VMap, Flags);
    442       // If we aren't ignoring missing entries, assert that something happened.
    443       if (V)
    444         PN->setIncomingBlock(i, cast<BasicBlock>(V));
    445       else
    446         assert((Flags & RF_IgnoreMissingEntries) &&
    447                "Referenced block not in value map!");
    448     }
    449   }
    450 
    451   // Remap attached metadata.
    452   SmallVector<std::pair<unsigned, MDNode *>, 4> MDs;
    453   I->getAllMetadata(MDs);
    454   for (const auto &MI : MDs) {
    455     MDNode *Old = MI.second;
    456     MDNode *New = MapMetadata(Old, VMap, Flags, TypeMapper, Materializer);
    457     if (New != Old)
    458       I->setMetadata(MI.first, New);
    459   }
    460 
    461   if (!TypeMapper)
    462     return;
    463 
    464   // If the instruction's type is being remapped, do so now.
    465   if (auto CS = CallSite(I)) {
    466     SmallVector<Type *, 3> Tys;
    467     FunctionType *FTy = CS.getFunctionType();
    468     Tys.reserve(FTy->getNumParams());
    469     for (Type *Ty : FTy->params())
    470       Tys.push_back(TypeMapper->remapType(Ty));
    471     CS.mutateFunctionType(FunctionType::get(
    472         TypeMapper->remapType(I->getType()), Tys, FTy->isVarArg()));
    473     return;
    474   }
    475   if (auto *AI = dyn_cast<AllocaInst>(I))
    476     AI->setAllocatedType(TypeMapper->remapType(AI->getAllocatedType()));
    477   if (auto *GEP = dyn_cast<GetElementPtrInst>(I)) {
    478     GEP->setSourceElementType(
    479         TypeMapper->remapType(GEP->getSourceElementType()));
    480     GEP->setResultElementType(
    481         TypeMapper->remapType(GEP->getResultElementType()));
    482   }
    483   I->mutateType(TypeMapper->remapType(I->getType()));
    484 }
    485