Testcase: (https://gcc.godbolt.org/z/97cThnszM) ``` struct data_mixed { int* p1; int* p2; __INTPTR_TYPE__ i3; int* p4; constexpr data_mixed() noexcept : p1(), p2(), i3(), p4() { } }; data_mixed create_data_mixed() { return {}; // somehow suboptimal ↓↓ // mov QWORD PTR [rdi+16], 0 // mov QWORD PTR [rdi+24], 0 // vmovdqu XMMWORD PTR [rdi], xmm0 } struct data_ptrs { int* p1; int* p2; void* p3; int* p4; constexpr data_ptrs() noexcept : p1(), p2(), p3(), p4() { } }; data_ptrs create_data_ptrs() { return {}; // vmovdqu YMMWORD PTR [rdi], ymm0 } struct data_ints { __INTPTR_TYPE__ p1; __INTPTR_TYPE__ p2; __INTPTR_TYPE__ p3; __INTPTR_TYPE__ p4; constexpr data_ints() noexcept : p1(), p2(), p3(), p4() { } }; data_ints create_data_ints() { return {}; // vmovdqu YMMWORD PTR [rdi], ymm0 } ``` I believe these structs should be initialized in the same way, by storing a zero YMM register. However mixed use of pointer and integer types seems to prevent that. This is not specific to GCC 13; in GCC 12 it used to prevent vectorization completely.
Confirmed. I don't know why the SLP vectorizer rejects it. Though I wonder why store merging also rejects it for a cost reason ...