summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Transforms/Utils/ValueMapper.cpp
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2011-01-24 03:18:24 +0000
committerChris Lattner <sabre@nondot.org>2011-01-24 03:18:24 +0000
commit23289c385abf6bcd80251ca2197d07ff2644de1f (patch)
tree9699807e287630dd9a0cbf0767ff1b4d92a9a2d0 /llvm/lib/Transforms/Utils/ValueMapper.cpp
parentd8d754341943a11575d69a7adc5d50cb4f46380c (diff)
downloadbcm5719-llvm-23289c385abf6bcd80251ca2197d07ff2644de1f.tar.gz
bcm5719-llvm-23289c385abf6bcd80251ca2197d07ff2644de1f.zip
fix PR9015, a crash linking recursive metadata.
llvm-svn: 124099
Diffstat (limited to 'llvm/lib/Transforms/Utils/ValueMapper.cpp')
-rw-r--r--llvm/lib/Transforms/Utils/ValueMapper.cpp17
1 files changed, 11 insertions, 6 deletions
diff --git a/llvm/lib/Transforms/Utils/ValueMapper.cpp b/llvm/lib/Transforms/Utils/ValueMapper.cpp
index 132c3920397..f5481d31eb8 100644
--- a/llvm/lib/Transforms/Utils/ValueMapper.cpp
+++ b/llvm/lib/Transforms/Utils/ValueMapper.cpp
@@ -38,15 +38,16 @@ Value *llvm::MapValue(const Value *V, ValueToValueMapTy &VM,
if (!MD->isFunctionLocal() && (Flags & RF_NoModuleLevelChanges))
return VM[V] = const_cast<Value*>(V);
+ // Create a dummy node in case we have a metadata cycle.
+ MDNode *Dummy = MDNode::getTemporary(V->getContext(), 0, 0);
+ VM[V] = Dummy;
+
// 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);
if (OP == 0 || MapValue(OP, VM, Flags) == OP) continue;
- // Ok, at least one operand needs remapping. Create a dummy node in case
- // we have a metadata cycle.
- MDNode *Dummy = MDNode::getTemporary(V->getContext(), 0, 0);
- VM[V] = Dummy;
+ // Ok, at least one operand needs remapping.
SmallVector<Value*, 4> Elts;
Elts.reserve(MD->getNumOperands());
for (i = 0; i != e; ++i) {
@@ -55,12 +56,16 @@ Value *llvm::MapValue(const Value *V, ValueToValueMapTy &VM,
}
MDNode *NewMD = MDNode::get(V->getContext(), Elts.data(), Elts.size());
Dummy->replaceAllUsesWith(NewMD);
+ VM[V] = NewMD;
MDNode::deleteTemporary(Dummy);
- return VM[V] = NewMD;
+ return NewMD;
}
+ VM[V] = const_cast<Value*>(V);
+ MDNode::deleteTemporary(Dummy);
+
// No operands needed remapping. Use an identity mapping.
- return VM[V] = const_cast<Value*>(V);
+ return const_cast<Value*>(V);
}
// Okay, this either must be a constant (which may or may not be mappable) or
OpenPOWER on IntegriCloud