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

--- Comment #16 from Richard Biener <rguenth at gcc dot gnu.org> ---
(In reply to Jan Hubicka from comment #15)
> The inline bump needed is about 23.  Richard, i guess convincing early
> optimizers to turn that hack into shifts (that is done by GCC but only at
> RTL time), is out of reach for this release, right?

Humm, you mean

  <bb 2>:
  x.d = arg1_3(D);
  _5 = x.i[3];
  if (_5 != 0)
    goto <bb 3>;
  else
    goto <bb 4>;
...
  <bb 4>:
  _12 = x.i[2];
  if (_12 != 0)
    goto <bb 5>;
  else
    goto <bb 6>;

to sth like

  <bb 4>:
  _12 = (unsigned short)(arg1_3(D) >> 32);
  if (_12 != 0)
    goto <bb 5>;
  else
    goto <bb 6>;

?

SCCVN doesn't handle sth "fancy" for the case of union accesses with
not matching offset/size.  We could add that, but I suppose in your
case it's just for the sake of inliner predicates as the actual generated
code might be worse on some targets?

But yes, in principle we can do sth fancy for union loads, though I'd
use BIT_FIELD_REFs (hoping no issues wrt endian...) as the canonical
and "easy" way to represent things here.  Thus

  _12 = BIT_FIELD_REF <arg1_3(D), ...>

(or REALPART/IMAGPART for special cases where that is valid).

Reply via email to