2002-11-21 04:47:41 +08:00
|
|
|
//===- ValueMapper.cpp - Interface shared by lib/Transforms/Utils ---------===//
|
2005-04-22 07:48:37 +08:00
|
|
|
//
|
2003-10-21 03:43:21 +08:00
|
|
|
// The LLVM Compiler Infrastructure
|
|
|
|
//
|
2007-12-30 04:36:04 +08:00
|
|
|
// This file is distributed under the University of Illinois Open Source
|
|
|
|
// License. See LICENSE.TXT for details.
|
2005-04-22 07:48:37 +08:00
|
|
|
//
|
2003-10-21 03:43:21 +08:00
|
|
|
//===----------------------------------------------------------------------===//
|
2002-11-21 04:47:41 +08:00
|
|
|
//
|
|
|
|
// This file defines the MapValue function, which is shared by various parts of
|
|
|
|
// the lib/Transforms/Utils library.
|
|
|
|
//
|
|
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
|
2010-08-25 02:50:07 +08:00
|
|
|
#include "llvm/Transforms/Utils/ValueMapper.h"
|
2013-01-02 19:36:10 +08:00
|
|
|
#include "llvm/IR/Constants.h"
|
|
|
|
#include "llvm/IR/Function.h"
|
|
|
|
#include "llvm/IR/InlineAsm.h"
|
|
|
|
#include "llvm/IR/Instructions.h"
|
|
|
|
#include "llvm/IR/Metadata.h"
|
2004-01-09 14:12:26 +08:00
|
|
|
using namespace llvm;
|
2002-11-21 04:47:41 +08:00
|
|
|
|
Land the long talked about "type system rewrite" patch. This
patch brings numerous advantages to LLVM. One way to look at it
is through diffstat:
109 files changed, 3005 insertions(+), 5906 deletions(-)
Removing almost 3K lines of code is a good thing. Other advantages
include:
1. Value::getType() is a simple load that can be CSE'd, not a mutating
union-find operation.
2. Types a uniqued and never move once created, defining away PATypeHolder.
3. Structs can be "named" now, and their name is part of the identity that
uniques them. This means that the compiler doesn't merge them structurally
which makes the IR much less confusing.
4. Now that there is no way to get a cycle in a type graph without a named
struct type, "upreferences" go away.
5. Type refinement is completely gone, which should make LTO much MUCH faster
in some common cases with C++ code.
6. Types are now generally immutable, so we can use "Type *" instead
"const Type *" everywhere.
Downsides of this patch are that it removes some functions from the C API,
so people using those will have to upgrade to (not yet added) new API.
"LLVM 3.0" is the right time to do this.
There are still some cleanups pending after this, this patch is large enough
as-is.
llvm-svn: 134829
2011-07-10 01:41:24 +08:00
|
|
|
// Out of line method to get vtable etc for class.
|
2012-09-26 14:36:36 +08:00
|
|
|
void ValueMapTypeRemapper::anchor() {}
|
2013-05-28 23:17:05 +08:00
|
|
|
void ValueMaterializer::anchor() {}
|
Land the long talked about "type system rewrite" patch. This
patch brings numerous advantages to LLVM. One way to look at it
is through diffstat:
109 files changed, 3005 insertions(+), 5906 deletions(-)
Removing almost 3K lines of code is a good thing. Other advantages
include:
1. Value::getType() is a simple load that can be CSE'd, not a mutating
union-find operation.
2. Types a uniqued and never move once created, defining away PATypeHolder.
3. Structs can be "named" now, and their name is part of the identity that
uniques them. This means that the compiler doesn't merge them structurally
which makes the IR much less confusing.
4. Now that there is no way to get a cycle in a type graph without a named
struct type, "upreferences" go away.
5. Type refinement is completely gone, which should make LTO much MUCH faster
in some common cases with C++ code.
6. Types are now generally immutable, so we can use "Type *" instead
"const Type *" everywhere.
Downsides of this patch are that it removes some functions from the C API,
so people using those will have to upgrade to (not yet added) new API.
"LLVM 3.0" is the right time to do this.
There are still some cleanups pending after this, this patch is large enough
as-is.
llvm-svn: 134829
2011-07-10 01:41:24 +08:00
|
|
|
|
|
|
|
Value *llvm::MapValue(const Value *V, ValueToValueMapTy &VM, RemapFlags Flags,
|
2013-05-28 23:17:05 +08:00
|
|
|
ValueMapTypeRemapper *TypeMapper,
|
|
|
|
ValueMaterializer *Materializer) {
|
2011-01-08 16:15:20 +08:00
|
|
|
ValueToValueMapTy::iterator I = VM.find(V);
|
|
|
|
|
|
|
|
// If the value already exists in the map, use it.
|
|
|
|
if (I != VM.end() && I->second) return I->second;
|
2007-02-03 08:08:31 +08:00
|
|
|
|
2013-05-28 23:17:05 +08:00
|
|
|
// If we have a materializer and it can materialize a value, use that.
|
|
|
|
if (Materializer) {
|
|
|
|
if (Value *NewV = Materializer->materializeValueFor(const_cast<Value*>(V)))
|
|
|
|
return VM[V] = NewV;
|
|
|
|
}
|
|
|
|
|
2010-08-26 23:41:53 +08:00
|
|
|
// Global values do not need to be seeded into the VM if they
|
|
|
|
// are using the identity mapping.
|
2011-07-16 07:18:40 +08:00
|
|
|
if (isa<GlobalValue>(V) || isa<MDString>(V))
|
2011-01-08 16:15:20 +08:00
|
|
|
return VM[V] = const_cast<Value*>(V);
|
2011-07-16 07:18:40 +08:00
|
|
|
|
|
|
|
if (const InlineAsm *IA = dyn_cast<InlineAsm>(V)) {
|
|
|
|
// Inline asm may need *type* remapping.
|
|
|
|
FunctionType *NewTy = IA->getFunctionType();
|
|
|
|
if (TypeMapper) {
|
|
|
|
NewTy = cast<FunctionType>(TypeMapper->remapType(NewTy));
|
|
|
|
|
|
|
|
if (NewTy != IA->getFunctionType())
|
|
|
|
V = InlineAsm::get(NewTy, IA->getAsmString(), IA->getConstraintString(),
|
|
|
|
IA->hasSideEffects(), IA->isAlignStack());
|
|
|
|
}
|
|
|
|
|
|
|
|
return VM[V] = const_cast<Value*>(V);
|
|
|
|
}
|
|
|
|
|
2003-10-06 23:23:43 +08:00
|
|
|
|
2010-01-22 05:05:54 +08:00
|
|
|
if (const MDNode *MD = dyn_cast<MDNode>(V)) {
|
2011-01-08 16:15:20 +08:00
|
|
|
// If this is a module-level metadata and we know that nothing at the module
|
|
|
|
// level is changing, then use an identity mapping.
|
|
|
|
if (!MD->isFunctionLocal() && (Flags & RF_NoModuleLevelChanges))
|
|
|
|
return VM[V] = const_cast<Value*>(V);
|
|
|
|
|
2011-01-24 11:18:24 +08:00
|
|
|
// Create a dummy node in case we have a metadata cycle.
|
2013-05-05 08:40:33 +08:00
|
|
|
MDNode *Dummy = MDNode::getTemporary(V->getContext(), None);
|
2011-01-24 11:18:24 +08:00
|
|
|
VM[V] = Dummy;
|
|
|
|
|
2010-08-26 23:41:53 +08:00
|
|
|
// Check all operands to see if any need to be remapped.
|
|
|
|
for (unsigned i = 0, e = MD->getNumOperands(); i != e; ++i) {
|
|
|
|
Value *OP = MD->getOperand(i);
|
2014-04-25 13:29:35 +08:00
|
|
|
if (!OP) continue;
|
2013-05-28 23:17:05 +08:00
|
|
|
Value *Mapped_OP = MapValue(OP, VM, Flags, TypeMapper, Materializer);
|
2013-02-01 05:19:18 +08:00
|
|
|
// Use identity map if Mapped_Op is null and we can ignore missing
|
|
|
|
// entries.
|
|
|
|
if (Mapped_OP == OP ||
|
2014-04-25 13:29:35 +08:00
|
|
|
(Mapped_OP == nullptr && (Flags & RF_IgnoreMissingEntries)))
|
2013-02-01 05:19:18 +08:00
|
|
|
continue;
|
2010-08-26 23:41:53 +08:00
|
|
|
|
2011-01-24 11:18:24 +08:00
|
|
|
// Ok, at least one operand needs remapping.
|
2010-08-26 23:41:53 +08:00
|
|
|
SmallVector<Value*, 4> Elts;
|
|
|
|
Elts.reserve(MD->getNumOperands());
|
2011-01-08 16:15:20 +08:00
|
|
|
for (i = 0; i != e; ++i) {
|
|
|
|
Value *Op = MD->getOperand(i);
|
2014-04-25 13:29:35 +08:00
|
|
|
if (!Op)
|
|
|
|
Elts.push_back(nullptr);
|
2013-02-01 05:19:18 +08:00
|
|
|
else {
|
2013-05-28 23:17:05 +08:00
|
|
|
Value *Mapped_Op = MapValue(Op, VM, Flags, TypeMapper, Materializer);
|
2013-02-01 05:19:18 +08:00
|
|
|
// Use identity map if Mapped_Op is null and we can ignore missing
|
|
|
|
// entries.
|
2014-04-25 13:29:35 +08:00
|
|
|
if (Mapped_Op == nullptr && (Flags & RF_IgnoreMissingEntries))
|
2013-02-01 05:19:18 +08:00
|
|
|
Mapped_Op = Op;
|
|
|
|
Elts.push_back(Mapped_Op);
|
|
|
|
}
|
2011-01-08 16:15:20 +08:00
|
|
|
}
|
2011-04-22 03:59:31 +08:00
|
|
|
MDNode *NewMD = MDNode::get(V->getContext(), Elts);
|
2010-08-26 23:41:53 +08:00
|
|
|
Dummy->replaceAllUsesWith(NewMD);
|
2011-01-24 11:18:24 +08:00
|
|
|
VM[V] = NewMD;
|
2010-08-26 23:41:53 +08:00
|
|
|
MDNode::deleteTemporary(Dummy);
|
2011-01-24 11:18:24 +08:00
|
|
|
return NewMD;
|
2010-08-26 23:41:53 +08:00
|
|
|
}
|
|
|
|
|
2011-01-24 11:18:24 +08:00
|
|
|
VM[V] = const_cast<Value*>(V);
|
|
|
|
MDNode::deleteTemporary(Dummy);
|
|
|
|
|
2011-01-08 16:15:20 +08:00
|
|
|
// No operands needed remapping. Use an identity mapping.
|
2011-01-24 11:18:24 +08:00
|
|
|
return const_cast<Value*>(V);
|
2010-01-20 13:49:59 +08:00
|
|
|
}
|
|
|
|
|
2011-01-08 16:15:20 +08:00
|
|
|
// Okay, this either must be a constant (which may or may not be mappable) or
|
|
|
|
// is something that is not in the mapping table.
|
2009-10-29 08:28:30 +08:00
|
|
|
Constant *C = const_cast<Constant*>(dyn_cast<Constant>(V));
|
2014-04-25 13:29:35 +08:00
|
|
|
if (!C)
|
|
|
|
return nullptr;
|
2009-10-29 08:28:30 +08:00
|
|
|
|
2011-01-08 16:15:20 +08:00
|
|
|
if (BlockAddress *BA = dyn_cast<BlockAddress>(C)) {
|
Land the long talked about "type system rewrite" patch. This
patch brings numerous advantages to LLVM. One way to look at it
is through diffstat:
109 files changed, 3005 insertions(+), 5906 deletions(-)
Removing almost 3K lines of code is a good thing. Other advantages
include:
1. Value::getType() is a simple load that can be CSE'd, not a mutating
union-find operation.
2. Types a uniqued and never move once created, defining away PATypeHolder.
3. Structs can be "named" now, and their name is part of the identity that
uniques them. This means that the compiler doesn't merge them structurally
which makes the IR much less confusing.
4. Now that there is no way to get a cycle in a type graph without a named
struct type, "upreferences" go away.
5. Type refinement is completely gone, which should make LTO much MUCH faster
in some common cases with C++ code.
6. Types are now generally immutable, so we can use "Type *" instead
"const Type *" everywhere.
Downsides of this patch are that it removes some functions from the C API,
so people using those will have to upgrade to (not yet added) new API.
"LLVM 3.0" is the right time to do this.
There are still some cleanups pending after this, this patch is large enough
as-is.
llvm-svn: 134829
2011-07-10 01:41:24 +08:00
|
|
|
Function *F =
|
2013-05-28 23:17:05 +08:00
|
|
|
cast<Function>(MapValue(BA->getFunction(), VM, Flags, TypeMapper, Materializer));
|
2011-01-08 16:15:20 +08:00
|
|
|
BasicBlock *BB = cast_or_null<BasicBlock>(MapValue(BA->getBasicBlock(), VM,
|
2013-05-28 23:17:05 +08:00
|
|
|
Flags, TypeMapper, Materializer));
|
2011-01-08 16:15:20 +08:00
|
|
|
return VM[V] = BlockAddress::get(F, BB ? BB : BA->getBasicBlock());
|
2009-10-29 08:28:30 +08:00
|
|
|
}
|
|
|
|
|
Land the long talked about "type system rewrite" patch. This
patch brings numerous advantages to LLVM. One way to look at it
is through diffstat:
109 files changed, 3005 insertions(+), 5906 deletions(-)
Removing almost 3K lines of code is a good thing. Other advantages
include:
1. Value::getType() is a simple load that can be CSE'd, not a mutating
union-find operation.
2. Types a uniqued and never move once created, defining away PATypeHolder.
3. Structs can be "named" now, and their name is part of the identity that
uniques them. This means that the compiler doesn't merge them structurally
which makes the IR much less confusing.
4. Now that there is no way to get a cycle in a type graph without a named
struct type, "upreferences" go away.
5. Type refinement is completely gone, which should make LTO much MUCH faster
in some common cases with C++ code.
6. Types are now generally immutable, so we can use "Type *" instead
"const Type *" everywhere.
Downsides of this patch are that it removes some functions from the C API,
so people using those will have to upgrade to (not yet added) new API.
"LLVM 3.0" is the right time to do this.
There are still some cleanups pending after this, this patch is large enough
as-is.
llvm-svn: 134829
2011-07-10 01:41:24 +08:00
|
|
|
// Otherwise, we have some other constant to remap. Start by checking to see
|
|
|
|
// if all operands have an identity remapping.
|
|
|
|
unsigned OpNo = 0, NumOperands = C->getNumOperands();
|
2014-04-25 13:29:35 +08:00
|
|
|
Value *Mapped = nullptr;
|
Land the long talked about "type system rewrite" patch. This
patch brings numerous advantages to LLVM. One way to look at it
is through diffstat:
109 files changed, 3005 insertions(+), 5906 deletions(-)
Removing almost 3K lines of code is a good thing. Other advantages
include:
1. Value::getType() is a simple load that can be CSE'd, not a mutating
union-find operation.
2. Types a uniqued and never move once created, defining away PATypeHolder.
3. Structs can be "named" now, and their name is part of the identity that
uniques them. This means that the compiler doesn't merge them structurally
which makes the IR much less confusing.
4. Now that there is no way to get a cycle in a type graph without a named
struct type, "upreferences" go away.
5. Type refinement is completely gone, which should make LTO much MUCH faster
in some common cases with C++ code.
6. Types are now generally immutable, so we can use "Type *" instead
"const Type *" everywhere.
Downsides of this patch are that it removes some functions from the C API,
so people using those will have to upgrade to (not yet added) new API.
"LLVM 3.0" is the right time to do this.
There are still some cleanups pending after this, this patch is large enough
as-is.
llvm-svn: 134829
2011-07-10 01:41:24 +08:00
|
|
|
for (; OpNo != NumOperands; ++OpNo) {
|
|
|
|
Value *Op = C->getOperand(OpNo);
|
2013-05-28 23:17:05 +08:00
|
|
|
Mapped = MapValue(Op, VM, Flags, TypeMapper, Materializer);
|
Land the long talked about "type system rewrite" patch. This
patch brings numerous advantages to LLVM. One way to look at it
is through diffstat:
109 files changed, 3005 insertions(+), 5906 deletions(-)
Removing almost 3K lines of code is a good thing. Other advantages
include:
1. Value::getType() is a simple load that can be CSE'd, not a mutating
union-find operation.
2. Types a uniqued and never move once created, defining away PATypeHolder.
3. Structs can be "named" now, and their name is part of the identity that
uniques them. This means that the compiler doesn't merge them structurally
which makes the IR much less confusing.
4. Now that there is no way to get a cycle in a type graph without a named
struct type, "upreferences" go away.
5. Type refinement is completely gone, which should make LTO much MUCH faster
in some common cases with C++ code.
6. Types are now generally immutable, so we can use "Type *" instead
"const Type *" everywhere.
Downsides of this patch are that it removes some functions from the C API,
so people using those will have to upgrade to (not yet added) new API.
"LLVM 3.0" is the right time to do this.
There are still some cleanups pending after this, this patch is large enough
as-is.
llvm-svn: 134829
2011-07-10 01:41:24 +08:00
|
|
|
if (Mapped != C) break;
|
|
|
|
}
|
|
|
|
|
|
|
|
// See if the type mapper wants to remap the type as well.
|
|
|
|
Type *NewTy = C->getType();
|
|
|
|
if (TypeMapper)
|
|
|
|
NewTy = TypeMapper->remapType(NewTy);
|
|
|
|
|
|
|
|
// If the result type and all operands match up, then just insert an identity
|
|
|
|
// mapping.
|
|
|
|
if (OpNo == NumOperands && NewTy == C->getType())
|
|
|
|
return VM[V] = C;
|
|
|
|
|
|
|
|
// Okay, we need to create a new constant. We've already processed some or
|
|
|
|
// all of the operands, set them all up now.
|
|
|
|
SmallVector<Constant*, 8> Ops;
|
|
|
|
Ops.reserve(NumOperands);
|
|
|
|
for (unsigned j = 0; j != OpNo; ++j)
|
|
|
|
Ops.push_back(cast<Constant>(C->getOperand(j)));
|
|
|
|
|
|
|
|
// If one of the operands mismatch, push it and the other mapped operands.
|
|
|
|
if (OpNo != NumOperands) {
|
2011-01-08 16:15:20 +08:00
|
|
|
Ops.push_back(cast<Constant>(Mapped));
|
Land the long talked about "type system rewrite" patch. This
patch brings numerous advantages to LLVM. One way to look at it
is through diffstat:
109 files changed, 3005 insertions(+), 5906 deletions(-)
Removing almost 3K lines of code is a good thing. Other advantages
include:
1. Value::getType() is a simple load that can be CSE'd, not a mutating
union-find operation.
2. Types a uniqued and never move once created, defining away PATypeHolder.
3. Structs can be "named" now, and their name is part of the identity that
uniques them. This means that the compiler doesn't merge them structurally
which makes the IR much less confusing.
4. Now that there is no way to get a cycle in a type graph without a named
struct type, "upreferences" go away.
5. Type refinement is completely gone, which should make LTO much MUCH faster
in some common cases with C++ code.
6. Types are now generally immutable, so we can use "Type *" instead
"const Type *" everywhere.
Downsides of this patch are that it removes some functions from the C API,
so people using those will have to upgrade to (not yet added) new API.
"LLVM 3.0" is the right time to do this.
There are still some cleanups pending after this, this patch is large enough
as-is.
llvm-svn: 134829
2011-07-10 01:41:24 +08:00
|
|
|
|
2011-01-08 16:15:20 +08:00
|
|
|
// Map the rest of the operands that aren't processed yet.
|
Land the long talked about "type system rewrite" patch. This
patch brings numerous advantages to LLVM. One way to look at it
is through diffstat:
109 files changed, 3005 insertions(+), 5906 deletions(-)
Removing almost 3K lines of code is a good thing. Other advantages
include:
1. Value::getType() is a simple load that can be CSE'd, not a mutating
union-find operation.
2. Types a uniqued and never move once created, defining away PATypeHolder.
3. Structs can be "named" now, and their name is part of the identity that
uniques them. This means that the compiler doesn't merge them structurally
which makes the IR much less confusing.
4. Now that there is no way to get a cycle in a type graph without a named
struct type, "upreferences" go away.
5. Type refinement is completely gone, which should make LTO much MUCH faster
in some common cases with C++ code.
6. Types are now generally immutable, so we can use "Type *" instead
"const Type *" everywhere.
Downsides of this patch are that it removes some functions from the C API,
so people using those will have to upgrade to (not yet added) new API.
"LLVM 3.0" is the right time to do this.
There are still some cleanups pending after this, this patch is large enough
as-is.
llvm-svn: 134829
2011-07-10 01:41:24 +08:00
|
|
|
for (++OpNo; OpNo != NumOperands; ++OpNo)
|
|
|
|
Ops.push_back(MapValue(cast<Constant>(C->getOperand(OpNo)), VM,
|
2013-05-28 23:17:05 +08:00
|
|
|
Flags, TypeMapper, Materializer));
|
2009-10-29 08:31:02 +08:00
|
|
|
}
|
Land the long talked about "type system rewrite" patch. This
patch brings numerous advantages to LLVM. One way to look at it
is through diffstat:
109 files changed, 3005 insertions(+), 5906 deletions(-)
Removing almost 3K lines of code is a good thing. Other advantages
include:
1. Value::getType() is a simple load that can be CSE'd, not a mutating
union-find operation.
2. Types a uniqued and never move once created, defining away PATypeHolder.
3. Structs can be "named" now, and their name is part of the identity that
uniques them. This means that the compiler doesn't merge them structurally
which makes the IR much less confusing.
4. Now that there is no way to get a cycle in a type graph without a named
struct type, "upreferences" go away.
5. Type refinement is completely gone, which should make LTO much MUCH faster
in some common cases with C++ code.
6. Types are now generally immutable, so we can use "Type *" instead
"const Type *" everywhere.
Downsides of this patch are that it removes some functions from the C API,
so people using those will have to upgrade to (not yet added) new API.
"LLVM 3.0" is the right time to do this.
There are still some cleanups pending after this, this patch is large enough
as-is.
llvm-svn: 134829
2011-07-10 01:41:24 +08:00
|
|
|
|
|
|
|
if (ConstantExpr *CE = dyn_cast<ConstantExpr>(C))
|
|
|
|
return VM[V] = CE->getWithOperands(Ops, NewTy);
|
|
|
|
if (isa<ConstantArray>(C))
|
|
|
|
return VM[V] = ConstantArray::get(cast<ArrayType>(NewTy), Ops);
|
|
|
|
if (isa<ConstantStruct>(C))
|
|
|
|
return VM[V] = ConstantStruct::get(cast<StructType>(NewTy), Ops);
|
|
|
|
if (isa<ConstantVector>(C))
|
|
|
|
return VM[V] = ConstantVector::get(Ops);
|
|
|
|
// If this is a no-operand constant, it must be because the type was remapped.
|
|
|
|
if (isa<UndefValue>(C))
|
|
|
|
return VM[V] = UndefValue::get(NewTy);
|
|
|
|
if (isa<ConstantAggregateZero>(C))
|
|
|
|
return VM[V] = ConstantAggregateZero::get(NewTy);
|
|
|
|
assert(isa<ConstantPointerNull>(C));
|
|
|
|
return VM[V] = ConstantPointerNull::get(cast<PointerType>(NewTy));
|
2002-11-21 04:47:41 +08:00
|
|
|
}
|
2004-05-19 17:08:12 +08:00
|
|
|
|
|
|
|
/// RemapInstruction - Convert the instruction operands from referencing the
|
2010-06-24 07:55:51 +08:00
|
|
|
/// current values into those specified by VMap.
|
2004-05-19 17:08:12 +08:00
|
|
|
///
|
2010-08-26 23:41:53 +08:00
|
|
|
void llvm::RemapInstruction(Instruction *I, ValueToValueMapTy &VMap,
|
2013-05-28 23:17:05 +08:00
|
|
|
RemapFlags Flags, ValueMapTypeRemapper *TypeMapper,
|
|
|
|
ValueMaterializer *Materializer){
|
2010-08-26 23:41:53 +08:00
|
|
|
// Remap operands.
|
2008-05-31 05:24:22 +08:00
|
|
|
for (User::op_iterator op = I->op_begin(), E = I->op_end(); op != E; ++op) {
|
2013-05-28 23:17:05 +08:00
|
|
|
Value *V = MapValue(*op, VMap, Flags, TypeMapper, Materializer);
|
2011-01-08 16:15:20 +08:00
|
|
|
// If we aren't ignoring missing entries, assert that something happened.
|
2014-04-25 13:29:35 +08:00
|
|
|
if (V)
|
2011-01-08 16:15:20 +08:00
|
|
|
*op = V;
|
|
|
|
else
|
|
|
|
assert((Flags & RF_IgnoreMissingEntries) &&
|
|
|
|
"Referenced value not in value map!");
|
2004-05-19 17:08:12 +08:00
|
|
|
}
|
2010-08-26 11:48:08 +08:00
|
|
|
|
2011-06-23 17:09:15 +08:00
|
|
|
// Remap phi nodes' incoming blocks.
|
|
|
|
if (PHINode *PN = dyn_cast<PHINode>(I)) {
|
|
|
|
for (unsigned i = 0, e = PN->getNumIncomingValues(); i != e; ++i) {
|
|
|
|
Value *V = MapValue(PN->getIncomingBlock(i), VMap, Flags);
|
|
|
|
// If we aren't ignoring missing entries, assert that something happened.
|
2014-04-25 13:29:35 +08:00
|
|
|
if (V)
|
2011-06-23 17:09:15 +08:00
|
|
|
PN->setIncomingBlock(i, cast<BasicBlock>(V));
|
|
|
|
else
|
|
|
|
assert((Flags & RF_IgnoreMissingEntries) &&
|
|
|
|
"Referenced block not in value map!");
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2011-08-05 04:02:18 +08:00
|
|
|
// Remap attached metadata.
|
2014-11-12 05:30:22 +08:00
|
|
|
SmallVector<std::pair<unsigned, MDNode *>, 4> MDs;
|
2011-08-05 04:02:18 +08:00
|
|
|
I->getAllMetadata(MDs);
|
2014-11-12 05:30:22 +08:00
|
|
|
for (SmallVectorImpl<std::pair<unsigned, MDNode *>>::iterator
|
|
|
|
MI = MDs.begin(),
|
|
|
|
ME = MDs.end();
|
|
|
|
MI != ME; ++MI) {
|
|
|
|
MDNode *Old = MI->second;
|
|
|
|
MDNode *New = MapValue(Old, VMap, Flags, TypeMapper, Materializer);
|
2010-08-26 23:41:53 +08:00
|
|
|
if (New != Old)
|
Land the long talked about "type system rewrite" patch. This
patch brings numerous advantages to LLVM. One way to look at it
is through diffstat:
109 files changed, 3005 insertions(+), 5906 deletions(-)
Removing almost 3K lines of code is a good thing. Other advantages
include:
1. Value::getType() is a simple load that can be CSE'd, not a mutating
union-find operation.
2. Types a uniqued and never move once created, defining away PATypeHolder.
3. Structs can be "named" now, and their name is part of the identity that
uniques them. This means that the compiler doesn't merge them structurally
which makes the IR much less confusing.
4. Now that there is no way to get a cycle in a type graph without a named
struct type, "upreferences" go away.
5. Type refinement is completely gone, which should make LTO much MUCH faster
in some common cases with C++ code.
6. Types are now generally immutable, so we can use "Type *" instead
"const Type *" everywhere.
Downsides of this patch are that it removes some functions from the C API,
so people using those will have to upgrade to (not yet added) new API.
"LLVM 3.0" is the right time to do this.
There are still some cleanups pending after this, this patch is large enough
as-is.
llvm-svn: 134829
2011-07-10 01:41:24 +08:00
|
|
|
I->setMetadata(MI->first, New);
|
2010-08-26 23:41:53 +08:00
|
|
|
}
|
Land the long talked about "type system rewrite" patch. This
patch brings numerous advantages to LLVM. One way to look at it
is through diffstat:
109 files changed, 3005 insertions(+), 5906 deletions(-)
Removing almost 3K lines of code is a good thing. Other advantages
include:
1. Value::getType() is a simple load that can be CSE'd, not a mutating
union-find operation.
2. Types a uniqued and never move once created, defining away PATypeHolder.
3. Structs can be "named" now, and their name is part of the identity that
uniques them. This means that the compiler doesn't merge them structurally
which makes the IR much less confusing.
4. Now that there is no way to get a cycle in a type graph without a named
struct type, "upreferences" go away.
5. Type refinement is completely gone, which should make LTO much MUCH faster
in some common cases with C++ code.
6. Types are now generally immutable, so we can use "Type *" instead
"const Type *" everywhere.
Downsides of this patch are that it removes some functions from the C API,
so people using those will have to upgrade to (not yet added) new API.
"LLVM 3.0" is the right time to do this.
There are still some cleanups pending after this, this patch is large enough
as-is.
llvm-svn: 134829
2011-07-10 01:41:24 +08:00
|
|
|
|
|
|
|
// If the instruction's type is being remapped, do so now.
|
|
|
|
if (TypeMapper)
|
|
|
|
I->mutateType(TypeMapper->remapType(I->getType()));
|
2010-08-26 23:41:53 +08:00
|
|
|
}
|