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