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

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

           What    |Removed                     |Added
----------------------------------------------------------------------------
           Keywords|deferred                    |
           Priority|P3                          |P2

--- Comment #3 from Richard Biener <rguenth at gcc dot gnu.org> ---
The main reason IPA doesn't get this is that we end up with

int func (int i)
{
  long unsigned int _1;
  long unsigned int _2;
  int * _3;
  int _4;

  <bb 2> [local count: 1073741824]:
  _1 = (long unsigned int) i_5(D);
  _2 = _1 * 4;
  _3 = &x + _2;
  _4 = *_3;
  bar (_4);
  return 0;
}

thus an IPA_ADDR ref of 'x' and 'x' TREE_ADDRESSABLE.  We do not try to
handle address-taken statics in full generality though eventually
modref-like analysis might be able to compute that the address of the
static variable doesn't escape from 'func' and that 'func' doesn't write
to 'x'?

Not re-creating x[i] is a correctness issue, that cannot be recovered.
One could abuse TARGET_MEM_REF to avoid the address-taking though, but
that would be abuse and likely pessimization as TMR isn't handled in
full generality in a lot of passes.

Reply via email to