ValueMapper.cpp revision 5e665f559419c7f58a4fd9360cd488f065505c44
151cbcbf435d1aaa1a5269d62b5d0b31b57316b4aChris Lattner//===- ValueMapper.cpp - Interface shared by lib/Transforms/Utils ---------===// 2fd93908ae8b9684fe71c239e3c6cfe13ff6a2663Misha Brukman// 3b576c94c15af9a440f69d9d03c2afead7971118cJohn Criswell// The LLVM Compiler Infrastructure 4b576c94c15af9a440f69d9d03c2afead7971118cJohn Criswell// 5b576c94c15af9a440f69d9d03c2afead7971118cJohn Criswell// This file was developed by the LLVM research group and is distributed under 6b576c94c15af9a440f69d9d03c2afead7971118cJohn Criswell// the University of Illinois Open Source License. See LICENSE.TXT for details. 7fd93908ae8b9684fe71c239e3c6cfe13ff6a2663Misha Brukman// 8b576c94c15af9a440f69d9d03c2afead7971118cJohn Criswell//===----------------------------------------------------------------------===// 951cbcbf435d1aaa1a5269d62b5d0b31b57316b4aChris Lattner// 1051cbcbf435d1aaa1a5269d62b5d0b31b57316b4aChris Lattner// This file defines the MapValue function, which is shared by various parts of 1151cbcbf435d1aaa1a5269d62b5d0b31b57316b4aChris Lattner// the lib/Transforms/Utils library. 1251cbcbf435d1aaa1a5269d62b5d0b31b57316b4aChris Lattner// 1351cbcbf435d1aaa1a5269d62b5d0b31b57316b4aChris Lattner//===----------------------------------------------------------------------===// 1451cbcbf435d1aaa1a5269d62b5d0b31b57316b4aChris Lattner 1551cbcbf435d1aaa1a5269d62b5d0b31b57316b4aChris Lattner#include "ValueMapper.h" 1651cbcbf435d1aaa1a5269d62b5d0b31b57316b4aChris Lattner#include "llvm/Constants.h" 17518310cb0d136906ff0a99d7a24cb460794de5bfReid Spencer#include "llvm/GlobalValue.h" 1851cbcbf435d1aaa1a5269d62b5d0b31b57316b4aChris Lattner#include "llvm/Instruction.h" 19f7703df4968084c18c248c1feea9961c19a32e6aChris Lattnerusing namespace llvm; 2051cbcbf435d1aaa1a5269d62b5d0b31b57316b4aChris Lattner 215e665f559419c7f58a4fd9360cd488f065505c44Chris LattnerValue *llvm::MapValue(const Value *V, ValueMapTy &VM) { 2251cbcbf435d1aaa1a5269d62b5d0b31b57316b4aChris Lattner Value *&VMSlot = VM[V]; 2351cbcbf435d1aaa1a5269d62b5d0b31b57316b4aChris Lattner if (VMSlot) return VMSlot; // Does it exist in the map yet? 245e665f559419c7f58a4fd9360cd488f065505c44Chris Lattner 255e665f559419c7f58a4fd9360cd488f065505c44Chris Lattner // NOTE: VMSlot can be invalidated by any reference to VM, which can grow the 265e665f559419c7f58a4fd9360cd488f065505c44Chris Lattner // DenseMap. This includes any recursive calls to MapValue. 27fd93908ae8b9684fe71c239e3c6cfe13ff6a2663Misha Brukman 285f92e2b11f68624f9003e710f44e3bc324cbf89aChris Lattner // Global values do not need to be seeded into the ValueMap if they are using 295f92e2b11f68624f9003e710f44e3bc324cbf89aChris Lattner // the identity mapping. 303805dea3fe742002f32a945abb19b74e2bb576d9Chris Lattner if (isa<GlobalValue>(V) || isa<InlineAsm>(V)) 315f92e2b11f68624f9003e710f44e3bc324cbf89aChris Lattner return VMSlot = const_cast<Value*>(V); 325f92e2b11f68624f9003e710f44e3bc324cbf89aChris Lattner 3315faa8498cda80828e292e6954e4bfe648d78572Chris Lattner if (Constant *C = const_cast<Constant*>(dyn_cast<Constant>(V))) { 346b6b6ef1677fa71b1072c2911b4c1f9524a558c9Zhou Sheng if (isa<ConstantInt>(C) || isa<ConstantFP>(C) || 3582731c793a9fbe53d8c5e784e3638cd3ad09d5caChris Lattner isa<ConstantPointerNull>(C) || isa<ConstantAggregateZero>(C) || 3683f03bfc3f60a05b9ca5807f837c09798632095eChris Lattner isa<UndefValue>(C)) 3751cbcbf435d1aaa1a5269d62b5d0b31b57316b4aChris Lattner return VMSlot = C; // Primitive constants map directly 38e95ff9afa07e3409b29070aed480ffd780307c97Reid Spencer else if (ConstantArray *CA = dyn_cast<ConstantArray>(C)) { 3915876bb28c9c0983279c30a123c13224648574c1Alkis Evlogimenos for (unsigned i = 0, e = CA->getNumOperands(); i != e; ++i) { 4015876bb28c9c0983279c30a123c13224648574c1Alkis Evlogimenos Value *MV = MapValue(CA->getOperand(i), VM); 4115876bb28c9c0983279c30a123c13224648574c1Alkis Evlogimenos if (MV != CA->getOperand(i)) { 4251cbcbf435d1aaa1a5269d62b5d0b31b57316b4aChris Lattner // This array must contain a reference to a global, make a new array 4351cbcbf435d1aaa1a5269d62b5d0b31b57316b4aChris Lattner // and return it. 4451cbcbf435d1aaa1a5269d62b5d0b31b57316b4aChris Lattner // 4551cbcbf435d1aaa1a5269d62b5d0b31b57316b4aChris Lattner std::vector<Constant*> Values; 4615876bb28c9c0983279c30a123c13224648574c1Alkis Evlogimenos Values.reserve(CA->getNumOperands()); 4751cbcbf435d1aaa1a5269d62b5d0b31b57316b4aChris Lattner for (unsigned j = 0; j != i; ++j) 4815876bb28c9c0983279c30a123c13224648574c1Alkis Evlogimenos Values.push_back(CA->getOperand(j)); 4951cbcbf435d1aaa1a5269d62b5d0b31b57316b4aChris Lattner Values.push_back(cast<Constant>(MV)); 50ac8d4d9d59e8f84f457c9847b2a279edd23c1023Chris Lattner for (++i; i != e; ++i) 5115876bb28c9c0983279c30a123c13224648574c1Alkis Evlogimenos Values.push_back(cast<Constant>(MapValue(CA->getOperand(i), VM))); 525e665f559419c7f58a4fd9360cd488f065505c44Chris Lattner return VM[V] = ConstantArray::get(CA->getType(), Values); 5351cbcbf435d1aaa1a5269d62b5d0b31b57316b4aChris Lattner } 5451cbcbf435d1aaa1a5269d62b5d0b31b57316b4aChris Lattner } 555e665f559419c7f58a4fd9360cd488f065505c44Chris Lattner return VM[V] = C; 5651cbcbf435d1aaa1a5269d62b5d0b31b57316b4aChris Lattner 5751cbcbf435d1aaa1a5269d62b5d0b31b57316b4aChris Lattner } else if (ConstantStruct *CS = dyn_cast<ConstantStruct>(C)) { 5815876bb28c9c0983279c30a123c13224648574c1Alkis Evlogimenos for (unsigned i = 0, e = CS->getNumOperands(); i != e; ++i) { 5915876bb28c9c0983279c30a123c13224648574c1Alkis Evlogimenos Value *MV = MapValue(CS->getOperand(i), VM); 6015876bb28c9c0983279c30a123c13224648574c1Alkis Evlogimenos if (MV != CS->getOperand(i)) { 6151cbcbf435d1aaa1a5269d62b5d0b31b57316b4aChris Lattner // This struct must contain a reference to a global, make a new struct 6251cbcbf435d1aaa1a5269d62b5d0b31b57316b4aChris Lattner // and return it. 6351cbcbf435d1aaa1a5269d62b5d0b31b57316b4aChris Lattner // 6451cbcbf435d1aaa1a5269d62b5d0b31b57316b4aChris Lattner std::vector<Constant*> Values; 6515876bb28c9c0983279c30a123c13224648574c1Alkis Evlogimenos Values.reserve(CS->getNumOperands()); 6651cbcbf435d1aaa1a5269d62b5d0b31b57316b4aChris Lattner for (unsigned j = 0; j != i; ++j) 6715876bb28c9c0983279c30a123c13224648574c1Alkis Evlogimenos Values.push_back(CS->getOperand(j)); 6851cbcbf435d1aaa1a5269d62b5d0b31b57316b4aChris Lattner Values.push_back(cast<Constant>(MV)); 69ac8d4d9d59e8f84f457c9847b2a279edd23c1023Chris Lattner for (++i; i != e; ++i) 7015876bb28c9c0983279c30a123c13224648574c1Alkis Evlogimenos Values.push_back(cast<Constant>(MapValue(CS->getOperand(i), VM))); 715e665f559419c7f58a4fd9360cd488f065505c44Chris Lattner return VM[V] = ConstantStruct::get(CS->getType(), Values); 7251cbcbf435d1aaa1a5269d62b5d0b31b57316b4aChris Lattner } 7351cbcbf435d1aaa1a5269d62b5d0b31b57316b4aChris Lattner } 745e665f559419c7f58a4fd9360cd488f065505c44Chris Lattner return VM[V] = C; 7551cbcbf435d1aaa1a5269d62b5d0b31b57316b4aChris Lattner 7651cbcbf435d1aaa1a5269d62b5d0b31b57316b4aChris Lattner } else if (ConstantExpr *CE = dyn_cast<ConstantExpr>(C)) { 7727d672136a57519095a3ef20161697749cffb57cChris Lattner std::vector<Constant*> Ops; 7827d672136a57519095a3ef20161697749cffb57cChris Lattner for (unsigned i = 0, e = CE->getNumOperands(); i != e; ++i) 7927d672136a57519095a3ef20161697749cffb57cChris Lattner Ops.push_back(cast<Constant>(MapValue(CE->getOperand(i), VM))); 805e665f559419c7f58a4fd9360cd488f065505c44Chris Lattner return VM[V] = CE->getWithOperands(Ops); 8149aaa6a8ee783e8a0a7b272ecdc6c71afd53c18dChris Lattner } else if (ConstantPacked *CP = dyn_cast<ConstantPacked>(C)) { 8249aaa6a8ee783e8a0a7b272ecdc6c71afd53c18dChris Lattner for (unsigned i = 0, e = CP->getNumOperands(); i != e; ++i) { 8349aaa6a8ee783e8a0a7b272ecdc6c71afd53c18dChris Lattner Value *MV = MapValue(CP->getOperand(i), VM); 8449aaa6a8ee783e8a0a7b272ecdc6c71afd53c18dChris Lattner if (MV != CP->getOperand(i)) { 8549aaa6a8ee783e8a0a7b272ecdc6c71afd53c18dChris Lattner // This packed value must contain a reference to a global, make a new 8649aaa6a8ee783e8a0a7b272ecdc6c71afd53c18dChris Lattner // packed constant and return it. 8749aaa6a8ee783e8a0a7b272ecdc6c71afd53c18dChris Lattner // 8849aaa6a8ee783e8a0a7b272ecdc6c71afd53c18dChris Lattner std::vector<Constant*> Values; 8949aaa6a8ee783e8a0a7b272ecdc6c71afd53c18dChris Lattner Values.reserve(CP->getNumOperands()); 9049aaa6a8ee783e8a0a7b272ecdc6c71afd53c18dChris Lattner for (unsigned j = 0; j != i; ++j) 9149aaa6a8ee783e8a0a7b272ecdc6c71afd53c18dChris Lattner Values.push_back(CP->getOperand(j)); 9249aaa6a8ee783e8a0a7b272ecdc6c71afd53c18dChris Lattner Values.push_back(cast<Constant>(MV)); 9349aaa6a8ee783e8a0a7b272ecdc6c71afd53c18dChris Lattner for (++i; i != e; ++i) 9449aaa6a8ee783e8a0a7b272ecdc6c71afd53c18dChris Lattner Values.push_back(cast<Constant>(MapValue(CP->getOperand(i), VM))); 955e665f559419c7f58a4fd9360cd488f065505c44Chris Lattner return VM[V] = ConstantPacked::get(Values); 9649aaa6a8ee783e8a0a7b272ecdc6c71afd53c18dChris Lattner } 9749aaa6a8ee783e8a0a7b272ecdc6c71afd53c18dChris Lattner } 9849aaa6a8ee783e8a0a7b272ecdc6c71afd53c18dChris Lattner return VMSlot = C; 9949aaa6a8ee783e8a0a7b272ecdc6c71afd53c18dChris Lattner 10051cbcbf435d1aaa1a5269d62b5d0b31b57316b4aChris Lattner } else { 10151cbcbf435d1aaa1a5269d62b5d0b31b57316b4aChris Lattner assert(0 && "Unknown type of constant!"); 10251cbcbf435d1aaa1a5269d62b5d0b31b57316b4aChris Lattner } 10351cbcbf435d1aaa1a5269d62b5d0b31b57316b4aChris Lattner } 1043cf5db73c7382c7236256779513fdeb1075f2f16Chris Lattner 10551cbcbf435d1aaa1a5269d62b5d0b31b57316b4aChris Lattner return 0; 10651cbcbf435d1aaa1a5269d62b5d0b31b57316b4aChris Lattner} 1076129af3fb14d1050f9fb4800c787e6f930b910d1Brian Gaeke 1086129af3fb14d1050f9fb4800c787e6f930b910d1Brian Gaeke/// RemapInstruction - Convert the instruction operands from referencing the 1096129af3fb14d1050f9fb4800c787e6f930b910d1Brian Gaeke/// current values into those specified by ValueMap. 1106129af3fb14d1050f9fb4800c787e6f930b910d1Brian Gaeke/// 1115e665f559419c7f58a4fd9360cd488f065505c44Chris Lattnervoid llvm::RemapInstruction(Instruction *I, ValueMapTy &ValueMap) { 1126129af3fb14d1050f9fb4800c787e6f930b910d1Brian Gaeke for (unsigned op = 0, E = I->getNumOperands(); op != E; ++op) { 1136129af3fb14d1050f9fb4800c787e6f930b910d1Brian Gaeke const Value *Op = I->getOperand(op); 1146129af3fb14d1050f9fb4800c787e6f930b910d1Brian Gaeke Value *V = MapValue(Op, ValueMap); 1156129af3fb14d1050f9fb4800c787e6f930b910d1Brian Gaeke assert(V && "Referenced value not in value map!"); 1166129af3fb14d1050f9fb4800c787e6f930b910d1Brian Gaeke I->setOperand(op, V); 1176129af3fb14d1050f9fb4800c787e6f930b910d1Brian Gaeke } 1186129af3fb14d1050f9fb4800c787e6f930b910d1Brian Gaeke} 119