https://gcc.gnu.org/bugzilla/show_bug.cgi?id=93896
Bug ID: 93896
Summary: Store merging uses SSE only for trivial types
Product: gcc
Version: 9.2.1
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: tree-optimization
Assignee: unassigned at gcc dot gnu.org
Reporter: msharov at users dot sourceforge.net
Target Milestone: ---
struct M {
constexpr M() :p{},sz{},cz{}{}
public:
char* p;
unsigned sz;
unsigned cap;
};
struct A { M a,b,c; A(); };
A::A() :a{},b{},c{}{}
gcc 9.2.1 with -march=native -Os on Haswell generates:
_ZN1AC2Ev:
movq $0, (%rdi)
movq $0, 8(%rdi)
movq $0, 16(%rdi)
movq $0, 24(%rdi)
movq $0, 32(%rdi)
movq $0, 40(%rdi)
ret
Store merging is obviously working here, but does not use SSE movups. If the
constructor is removed or defaulted the output is:
_ZN1AC2Ev:
vpxor %xmm0, %xmm0, %xmm0
vmovups %xmm0, (%rdi)
vmovups %xmm0, 16(%rdi)
vmovups %xmm0, 32(%rdi)
ret
Whether the type is trivial should not matter by the time store merging occurs,
but for some reason it does.