diff --git a/llvm/lib/Transforms/Utils/ValueMapper.cpp b/llvm/lib/Transforms/Utils/ValueMapper.cpp --- a/llvm/lib/Transforms/Utils/ValueMapper.cpp +++ b/llvm/lib/Transforms/Utils/ValueMapper.cpp @@ -529,6 +529,8 @@ return getVM()[V] = UndefValue::get(NewTy); if (isa(C)) return getVM()[V] = ConstantAggregateZero::get(NewTy); + if (isa(C)) + return getVM()[V] = Constant::getNullValue(NewTy); assert(isa(C)); return getVM()[V] = ConstantPointerNull::get(cast(NewTy)); } diff --git a/llvm/unittests/Transforms/Utils/ValueMapperTest.cpp b/llvm/unittests/Transforms/Utils/ValueMapperTest.cpp --- a/llvm/unittests/Transforms/Utils/ValueMapperTest.cpp +++ b/llvm/unittests/Transforms/Utils/ValueMapperTest.cpp @@ -421,4 +421,19 @@ EXPECT_EQ(NewPoison, Mapper.mapValue(*OldPoison)); } +TEST(ValueMapperTest, mapValueConstantTargetNoneToLayoutTypeNullValue) { + LLVMContext C; + auto *OldTy = TargetExtType::get(C, "spirv.Image"); + Type *NewTy = OldTy->getLayoutType(); + + TestTypeRemapper TM(NewTy); + ValueToValueMapTy VM; + ValueMapper Mapper(VM, RF_None, &TM); + + // Check that ConstantTargetNone is mapped to '0' constant of its layout type. + auto *OldConstant = ConstantTargetNone::get(OldTy); + auto *NewConstant = Constant::getNullValue(NewTy); + EXPECT_EQ(NewConstant, Mapper.mapValue(*OldConstant)); +} + } // end namespace