Index: lib/CodeGen/CGExprCXX.cpp =================================================================== --- lib/CodeGen/CGExprCXX.cpp +++ lib/CodeGen/CGExprCXX.cpp @@ -318,7 +318,7 @@ llvm::Value *This = LV.getAddress(); if ((MD->isCopyAssignmentOperator() || MD->isMoveAssignmentOperator()) && - MD->isTrivial()) { + MD->isTrivial() && !MD->getParent()->mayInsertExtraPadding()) { llvm::Value *Src = EmitLValue(E->getArg(1)).getAddress(); QualType Ty = E->getType(); EmitAggregateAssign(This, Src, Ty); Index: test/CodeGen/sanitize-address-field-padding.cpp =================================================================== --- test/CodeGen/sanitize-address-field-padding.cpp +++ test/CodeGen/sanitize-address-field-padding.cpp @@ -217,3 +217,22 @@ // WITH_CTOR_ALIASES-NOT: call void @_ZN15WithVirtualDtorD2Ev // WITH_CTOR_ALIASES: call void @_ZN28InheritsFrom_WithVirtualDtorD2Ev // WITH_CTOR_ALIASES: ret void +// + +// Make sure we don't emit memcpy for operator= if paddings are inserted. +struct ClassWithTrivialCopy { + ClassWithTrivialCopy(); + ~ClassWithTrivialCopy(); + void *a; + private: + void *c; +}; + +void MakeTrivialCopy(ClassWithTrivialCopy *s1, ClassWithTrivialCopy *s2) { + *s1 = *s2; +} + +// CHECK-LABEL: define void @_Z15MakeTrivialCopyP20ClassWithTrivialCopyS0_ +// CHECK-NOT: memcpy +// CHECK: ret void +