ValueMapper: Allow RF_IgnoreMissingLocals and RF_NullMapMissingGlobalValues

Remove the assertion that disallowed the combination, since
RF_IgnoreMissingLocals should have no effect on globals.  As it happens,
RF_NullMapMissingGlobalValues asserted in MapValue(Constant*,...), so I
also changed a cast to a cast_or_null to get my test passing.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@265633 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Duncan P. N. Exon Smith 2016-04-07 01:22:45 +00:00
parent a10355896b
commit 5c7a97c89b
3 changed files with 15 additions and 8 deletions

View File

@ -128,7 +128,8 @@ inline Constant *MapValue(const Constant *V, ValueToValueMapTy &VM,
RemapFlags Flags = RF_None,
ValueMapTypeRemapper *TypeMapper = nullptr,
ValueMaterializer *Materializer = nullptr) {
return cast<Constant>(
// This can be null for RF_NullMapMissingGlobalValues.
return cast_or_null<Constant>(
MapValue((const Value *)V, VM, Flags, TypeMapper, Materializer));
}

View File

@ -276,14 +276,8 @@ Value *Mapper::mapValue(const Value *V) {
// Global values do not need to be seeded into the VM if they
// are using the identity mapping.
if (isa<GlobalValue>(V)) {
if (Flags & RF_NullMapMissingGlobalValues) {
// FIXME: Remove this assertion. RF_IgnoreMissingLocals is unrelated to
// RF_NullMapMissingGlobalValues.
assert(!(Flags & RF_IgnoreMissingLocals) &&
"Illegal to specify both RF_NullMapMissingGlobalValues and "
"RF_IgnoreMissingLocals");
if (Flags & RF_NullMapMissingGlobalValues)
return nullptr;
}
return VM[V] = const_cast<Value*>(V);
}

View File

@ -209,4 +209,16 @@ TEST(ValueMapperTest, MapValueLocalAsMetadata) {
EXPECT_EQ(&A, MapValue(MAV, VM, RF_IgnoreMissingLocals));
}
TEST(ValueMapperTest, MapMetadataNullMapGlobalWithIgnoreMissingLocals) {
LLVMContext C;
FunctionType *FTy =
FunctionType::get(Type::getVoidTy(C), Type::getInt8Ty(C), false);
std::unique_ptr<Function> F(
Function::Create(FTy, GlobalValue::ExternalLinkage, "F"));
ValueToValueMapTy VM;
RemapFlags Flags = RF_IgnoreMissingLocals | RF_NullMapMissingGlobalValues;
EXPECT_EQ(nullptr, MapValue(F.get(), VM, Flags));
}
} // end namespace