Index: llvm/lib/Linker/IRMover.cpp =================================================================== --- llvm/lib/Linker/IRMover.cpp +++ llvm/lib/Linker/IRMover.cpp @@ -650,7 +650,7 @@ for (unsigned i = 0; i < Attrs.getNumAttrSets(); ++i) { for (Attribute::AttrKind TypedAttr : {Attribute::ByVal, Attribute::StructRet, Attribute::ByRef, - Attribute::InAlloca}) { + Attribute::InAlloca, Attribute::ElementType}) { if (Attrs.hasAttribute(i, TypedAttr)) { if (Type *Ty = Attrs.getAttribute(i, TypedAttr).getValueAsType()) { Attrs = Attrs.replaceAttributeType(C, i, TypedAttr, TypeMap.get(Ty)); Index: llvm/lib/Transforms/Utils/ValueMapper.cpp =================================================================== --- llvm/lib/Transforms/Utils/ValueMapper.cpp +++ llvm/lib/Transforms/Utils/ValueMapper.cpp @@ -945,8 +945,8 @@ AttributeList Attrs = CB->getAttributes(); for (unsigned i = 0; i < Attrs.getNumAttrSets(); ++i) { for (Attribute::AttrKind TypedAttr : - {Attribute::ByVal, Attribute::StructRet, Attribute::ByRef, - Attribute::InAlloca}) { + {Attribute::ByVal, Attribute::StructRet, Attribute::ByRef, + Attribute::InAlloca, Attribute::ElementType}) { if (Type *Ty = Attrs.getAttribute(i, TypedAttr).getValueAsType()) { Attrs = Attrs.replaceAttributeType(C, i, TypedAttr, TypeMapper->remapType(Ty)); Index: llvm/test/Linker/Inputs/elementtype-struct-2.ll =================================================================== --- /dev/null +++ llvm/test/Linker/Inputs/elementtype-struct-2.ll @@ -0,0 +1,8 @@ +%struct = type {i32, i8} + +define void @struct_elementtype_2() { + call %struct* @llvm.preserve.array.access.index.p0s_structs.p0s_structs(%struct* elementtype(%struct) null, i32 0, i32 0) + ret void +} + +declare %struct* @llvm.preserve.array.access.index.p0s_structs.p0s_structs(%struct*, i32, i32) \ No newline at end of file Index: llvm/test/Linker/elementtype-struct-1.ll =================================================================== --- /dev/null +++ llvm/test/Linker/elementtype-struct-1.ll @@ -0,0 +1,17 @@ +; RUN: llvm-link %S/Inputs/elementtype-struct-2.ll %s -S | FileCheck %s + +; Check that the attribute for elementtype matches when linking. + +; CHECK: define void @struct_elementtype_2 +; CHECK: call %struct* @llvm.preserve.array.access.index.p0s_structs.p0s_structs(%struct* elementtype(%struct) null, i32 0, i32 0) +; CHECK: define void @struct_elementtype +; CHECK: call %struct* @llvm.preserve.array.access.index.p0s_structs.p0s_structs(%struct* elementtype(%struct) null, i32 0, i32 0) + +%struct = type {i32, i8} + +define void @struct_elementtype() { + call %struct* @llvm.preserve.array.access.index.p0s_structs.p0s_structs(%struct* elementtype(%struct) null, i32 0, i32 0) + ret void +} + +declare %struct* @llvm.preserve.array.access.index.p0s_structs.p0s_structs(%struct*, i32, i32)