ValueMapper.cpp revision 0a205a459884ec745df1c529396dd921f029dafd
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/BasicBlock.h" 17#include "llvm/Constants.h" 18#include "llvm/GlobalValue.h" 19#include "llvm/Instruction.h" 20#include "llvm/LLVMContext.h" 21#include "llvm/MDNode.h" 22#include "llvm/ADT/SmallVector.h" 23using namespace llvm; 24 25Value *llvm::MapValue(const Value *V, ValueMapTy &VM, LLVMContext* Context) { 26 Value *&VMSlot = VM[V]; 27 if (VMSlot) return VMSlot; // Does it exist in the map yet? 28 29 // NOTE: VMSlot can be invalidated by any reference to VM, which can grow the 30 // DenseMap. This includes any recursive calls to MapValue. 31 32 // Global values do not need to be seeded into the ValueMap if they are using 33 // the identity mapping. 34 if (isa<GlobalValue>(V) || isa<InlineAsm>(V)) 35 return VMSlot = const_cast<Value*>(V); 36 37 if (Constant *C = const_cast<Constant*>(dyn_cast<Constant>(V))) { 38 if (isa<ConstantInt>(C) || isa<ConstantFP>(C) || 39 isa<ConstantPointerNull>(C) || isa<ConstantAggregateZero>(C) || 40 isa<UndefValue>(C) || isa<MDString>(C)) 41 return VMSlot = C; // Primitive constants map directly 42 else if (ConstantArray *CA = dyn_cast<ConstantArray>(C)) { 43 for (User::op_iterator b = CA->op_begin(), i = b, e = CA->op_end(); 44 i != e; ++i) { 45 Value *MV = MapValue(*i, VM, Context); 46 if (MV != *i) { 47 // This array must contain a reference to a global, make a new array 48 // and return it. 49 // 50 std::vector<Constant*> Values; 51 Values.reserve(CA->getNumOperands()); 52 for (User::op_iterator j = b; j != i; ++j) 53 Values.push_back(cast<Constant>(*j)); 54 Values.push_back(cast<Constant>(MV)); 55 for (++i; i != e; ++i) 56 Values.push_back(cast<Constant>(MapValue(*i, VM, Context))); 57 return VM[V] = Context->getConstantArray(CA->getType(), Values); 58 } 59 } 60 return VM[V] = C; 61 62 } else if (ConstantStruct *CS = dyn_cast<ConstantStruct>(C)) { 63 for (User::op_iterator b = CS->op_begin(), i = b, e = CS->op_end(); 64 i != e; ++i) { 65 Value *MV = MapValue(*i, VM, Context); 66 if (MV != *i) { 67 // This struct must contain a reference to a global, make a new struct 68 // and return it. 69 // 70 std::vector<Constant*> Values; 71 Values.reserve(CS->getNumOperands()); 72 for (User::op_iterator j = b; j != i; ++j) 73 Values.push_back(cast<Constant>(*j)); 74 Values.push_back(cast<Constant>(MV)); 75 for (++i; i != e; ++i) 76 Values.push_back(cast<Constant>(MapValue(*i, VM, Context))); 77 return VM[V] = Context->getConstantStruct(CS->getType(), Values); 78 } 79 } 80 return VM[V] = C; 81 82 } else if (ConstantExpr *CE = dyn_cast<ConstantExpr>(C)) { 83 std::vector<Constant*> Ops; 84 for (User::op_iterator i = CE->op_begin(), e = CE->op_end(); i != e; ++i) 85 Ops.push_back(cast<Constant>(MapValue(*i, VM, Context))); 86 return VM[V] = CE->getWithOperands(Ops); 87 } else if (ConstantVector *CP = dyn_cast<ConstantVector>(C)) { 88 for (User::op_iterator b = CP->op_begin(), i = b, e = CP->op_end(); 89 i != e; ++i) { 90 Value *MV = MapValue(*i, VM, Context); 91 if (MV != *i) { 92 // This vector value must contain a reference to a global, make a new 93 // vector constant and return it. 94 // 95 std::vector<Constant*> Values; 96 Values.reserve(CP->getNumOperands()); 97 for (User::op_iterator j = b; j != i; ++j) 98 Values.push_back(cast<Constant>(*j)); 99 Values.push_back(cast<Constant>(MV)); 100 for (++i; i != e; ++i) 101 Values.push_back(cast<Constant>(MapValue(*i, VM, Context))); 102 return VM[V] = Context->getConstantVector(Values); 103 } 104 } 105 return VM[V] = C; 106 107 } else if (MDNode *N = dyn_cast<MDNode>(C)) { 108 for (MDNode::const_elem_iterator b = N->elem_begin(), i = b, 109 e = N->elem_end(); i != e; ++i) { 110 if (!*i) continue; 111 112 Value *MV = MapValue(*i, VM, Context); 113 if (MV != *i) { 114 // This MDNode must contain a reference to a global, make a new MDNode 115 // and return it. 116 SmallVector<Value*, 8> Values; 117 Values.reserve(N->getNumElements()); 118 for (MDNode::const_elem_iterator j = b; j != i; ++j) 119 Values.push_back(*j); 120 Values.push_back(MV); 121 for (++i; i != e; ++i) 122 Values.push_back(MapValue(*i, VM, Context)); 123 return VM[V] = Context->getMDNode(Values.data(), Values.size()); 124 } 125 } 126 return VM[V] = C; 127 128 } else { 129 assert(0 && "Unknown type of constant!"); 130 } 131 } 132 133 return 0; 134} 135 136/// RemapInstruction - Convert the instruction operands from referencing the 137/// current values into those specified by ValueMap. 138/// 139void llvm::RemapInstruction(Instruction *I, ValueMapTy &ValueMap) { 140 for (User::op_iterator op = I->op_begin(), E = I->op_end(); op != E; ++op) { 141 Value *V = MapValue(*op, ValueMap, I->getParent()->getContext()); 142 assert(V && "Referenced value not in value map!"); 143 *op = V; 144 } 145} 146