diff options
| -rw-r--r-- | llvm/include/llvm/Transforms/Utils/ValueMapper.h | 3 | ||||
| -rw-r--r-- | llvm/lib/Transforms/Utils/ValueMapper.cpp | 8 | ||||
| -rw-r--r-- | llvm/unittests/Transforms/Utils/ValueMapperTest.cpp | 12 |
3 files changed, 15 insertions, 8 deletions
diff --git a/llvm/include/llvm/Transforms/Utils/ValueMapper.h b/llvm/include/llvm/Transforms/Utils/ValueMapper.h index f986c01a40b..e8023bd3df9 100644 --- a/llvm/include/llvm/Transforms/Utils/ValueMapper.h +++ b/llvm/include/llvm/Transforms/Utils/ValueMapper.h @@ -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)); } diff --git a/llvm/lib/Transforms/Utils/ValueMapper.cpp b/llvm/lib/Transforms/Utils/ValueMapper.cpp index 8b12cd46a48..5a92b4c01c0 100644 --- a/llvm/lib/Transforms/Utils/ValueMapper.cpp +++ b/llvm/lib/Transforms/Utils/ValueMapper.cpp @@ -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); } diff --git a/llvm/unittests/Transforms/Utils/ValueMapperTest.cpp b/llvm/unittests/Transforms/Utils/ValueMapperTest.cpp index 56e407b9e6b..b9cca2292c1 100644 --- a/llvm/unittests/Transforms/Utils/ValueMapperTest.cpp +++ b/llvm/unittests/Transforms/Utils/ValueMapperTest.cpp @@ -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 |

