https://gcc.gnu.org/bugzilla/show_bug.cgi?id=108804
Richard Biener <rguenth at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- Target| |x86_64-*-* Status|UNCONFIRMED |NEW Ever confirmed|0 |1 Keywords| |missed-optimization Last reconfirmed| |2023-02-20 --- Comment #2 from Richard Biener <rguenth at gcc dot gnu.org> --- EVRP does @@ -38,16 +61,18 @@ k_12 = k_10 >> 23; _2 = k_12 & 8388607; y_13 = _2 | 1065353216; - _3 = (float) x_11; + _17 = (signed long) x_11; + _3 = (float) _17; f[i_6] = _3; _4 = i_6 + 128; - _5 = (float) y_13; + _18 = (signed long) y_13; + _5 = (float) _18; f[_4] = _5; because unsigned long -> float is even more difficult. With -fno-tree-vrp the conversion is still from uint64_t but that's not supported either. So it's a target issue. Shorter testcase: #include<stdint.h> uint64_t d[512]; float f[1024]; void foo() { for (int i=0; i<512; ++i) { uint64_t k = d[i]; f[i]=k; } }