https://gcc.gnu.org/bugzilla/show_bug.cgi?id=108804
Bug ID: 108804 Summary: missed vectorization in presence of conversion from uint64_t to float Product: gcc Version: 12.2.1 Status: UNCONFIRMED Severity: normal Priority: P3 Component: tree-optimization Assignee: unassigned at gcc dot gnu.org Reporter: vincenzo.innocente at cern dot ch Target Milestone: --- in the following code [1] foo does not vectorize, bar doos compiled with -march=haswell -Ofast --no-math-errno -Wall see https://godbolt.org/z/E6xzfavxc clang seems do do better [1] #include<cstdint> uint64_t d[512]; //uint32_t f[1024]; float f[1024]; void foo() { for (int i=0; i<512; ++i) { uint64_t k = d[i]; auto x = (k & 0x007FFFFF) | 0x3F800000; k = k >> 23; auto y = (k & 0x007FFFFF) | 0x3F800000; f[i]=x; f[128+i] = y; } } void bar() { for (int i=0; i<512; ++i) { uint64_t k = d[i]; uint32_t x = (k & 0x007FFFFF); x |= 0x3F800000; uint32_t y = k >> 23; y = (y & 0x007FFFFF) | 0x3F800000; f[i]=x; f[128+i] = y; } }