https://gcc.gnu.org/bugzilla/show_bug.cgi?id=119310
Bug ID: 119310 Summary: Unnecessary instructions on std::bit_cast of an array of 3 strongly-typed floats Product: gcc Version: 14.2.0 Status: UNCONFIRMED Severity: normal Priority: P3 Component: rtl-optimization Assignee: unassigned at gcc dot gnu.org Reporter: bernardo at bernardosulzbach dot com Target Milestone: --- I looked at some 10 other std::bit_cast-related issues, but none of them seemed to be the same issue as this. This matters for code that creates strong types around primitives to prevent programmer mistakes such as mixing up units. Users might expect to be able to cast away these strong types cheaply if they don't interfere with memory layout. https://godbolt.org/z/PM16z9fj6 is a minimal example. Note that this is not happening for n = 2 and n = 4. ```cpp #include <array> #include <bit> using T = float; struct StrongA { T value; }; template <std::size_t n> using Vec = std::array<T, n>; auto bitCast(Vec<2> a) { return std::bit_cast<std::array<T, std::size(a)>>(a); } auto bitCast(Vec<3> a) { return std::bit_cast<std::array<T, std::size(a)>>(a); } auto bitCast(Vec<4> a) { return std::bit_cast<std::array<T, std::size(a)>>(a); } ``` generates ``` bitCast(std::array<float, 3ul>): movd DWORD PTR [rsp-32], xmm1 movss xmm1, DWORD PTR [rsp-32] movss DWORD PTR [rsp-16], xmm1 movd xmm1, DWORD PTR [rsp-16] ret ``` for the n = 3 case, which seems to effectively do nothing other than `ret`. Maybe some optimization rule isn't triggering because of the mix of movss and movd? I guessed the component, so "rtl-optimization" might be wrong.