https://gcc.gnu.org/bugzilla/show_bug.cgi?id=94103

Richard Biener <rguenth at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
          Component|middle-end                  |target
           Keywords|                            |wrong-code
             Status|UNCONFIRMED                 |NEW
   Last reconfirmed|                            |2020-03-10
             Target|                            |x86_64-*-*, i?86-*-*,
                   |                            |m68k-*-*
                 CC|                            |law at gcc dot gnu.org,
                   |                            |rguenth at gcc dot gnu.org
     Ever confirmed|0                           |1

--- Comment #4 from Richard Biener <rguenth at gcc dot gnu.org> ---
There's a related bug about x87 stores not storing all bytes which was closed
as INVALID, the testcase was using a union to pun long double and a character
array IIRC.  Here the situation is quite similar - the IL has (from your
unused load):

  x.1_6 = x;
  _18 = MEM[(char * {ref-all})&x];
  MEM[(char * {ref-all})&u] = _18;
  _7 = u[0];
  _8 = u[1];
  printf ("%016lX %016lX\n", _8, _7);

where x.1_6 is of type long double and _18 is __int128.  Value-numbering
then decides that it can elide the load to _18 and also optimize the loads
from u[] as:

  x.1_6 = x;
  _31 = VIEW_CONVERT_EXPR<__int128 unsigned>(x.1_6);
  MEM[(char * {ref-all})&u] = _31;
  _32 = (long unsigned int) _31;
  _33 = BIT_FIELD_REF <_31, 64, 64>;
  printf ("%016lX %016lX\n", _33, _32);

which is because the backend tells us the FP load x.1_6 = x loads all
bits and do not modify the underlying representation.  Now, for x87
modes GET_MODE_SIZE isn't in agreement with what the actual instruction
does nor does the load reflect the fact that a x87 load (not the
long double variant) can end up doing a rounding step.  m68k is
probably similarly affected.  And yes, compared to the other bug I
was able to close as INVALID conveniently this one looks "real"
(if also artificially constructed and unfortunate...).  Jeff, you
also were involved in the other bug, do you agree here?  I still don't
see any good solution though.

I agree that the decimal float variant is an entirely different bug,
maybe you can open a new one for this?

Reply via email to