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;
    }
}

Reply via email to