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

Jakub Jelinek <jakub at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
                 CC|                            |rguenth at gcc dot gnu.org

--- Comment #2 from Jakub Jelinek <jakub at gcc dot gnu.org> ---
Seems this is invalid variable sharing during RTL, I'm afraid we have tons of
open bugs against that, and I'm afraid I don't know anything what to do on the
bitint lowering side.
Bitint lowering creates 3 large variables:
  unsigned long bitint.8[75];
  unsigned long bitint.7[75];
  unsigned long bitint.6[100];
where bitint.6 corresponds to
  _3 = _2 % y_14(D);
and later when _3 isn't needed anymore to
  _8 = -y_14(D);
bitint.7 corresponds to
  _4 = -_3;
  _5 = (unsigned _BitInt(4745)) _4;
and bitint.8 corresponds to
  _7 = _5 * _6;
Reusing the same variable bitint.6 for 2 different _BitInt(6384) SSA_NAMEs
ought to be fine, they aren't live at the same time.
After lowering, we end up with:
  .DIVMODBITINT (0B, 0, &bitint.6, 6384, &D.2796, -8, &y, -6384);
  // Above fills in bitint.6 array
...
  loop which uses bitint.6 to compute bitint.7
  bitint.6 ={v} {CLOBBER(eos)};
...
  .MULBITINT (&bitint.8, 4745, &bitint.7, 4745, &D.2795, -8);
  // Above fills in bitint.8 array
...
  loop to compute bitint.6
...
  loop which uses bitint.6
...
  _21 = MEM[(unsigned long *)&bitint.8];
  _22 = (_BitInt(8)) _21;
  _18 = _22;
  return _18;
  // I.e. use bitint.8 for the return value

But unfortunately RTL expansion decides to use the same underlying memory for
bitint.6 and bitint.8 arrays, even when the second uses of bitint.6 happens
when bitint.8 is live.

Or am I using incorrect CLOBBER kind when an underlying variable is used for
more than one SSA_NAME?  Like should that be just eob rather than eos?

Reply via email to