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

--- Comment #25 from amker at gcc dot gnu.org ---
I tend to believe this is an register pressure based strength-reduction + lim
problem than ivopts.

So given class of memory references like:

  reg = ...
Loop:
  MEM[iv_base + reg * 0];
  MEM[iv_base + reg * 1];
  MEM[iv_base + reg * 2];
  MEM[iv_base + reg * 3];
  MEM[iv_base + reg * 4];
  MEM[iv_base + reg * 5];
  MEM[iv_base + reg * 6];
  MEM[iv_base + reg * 7];

The best arrangement probably would be:

  reg = ...
  regX = reg * 3;
Loop:
  MEM[iv_base + reg * 0];
  MEM[iv_base + reg * 1];
  MEM[iv_base + reg * 2];
  t = iv_base + regX;
  MEM[t];
  MEM[iv_base + reg * 4];
  MEM[t + reg * 2];
  MEM[iv_base + regX * 2];
  MEM[t + reg * 4];

Depending on the register pressure, regX should be re-materialized in loop or
hoisted as invariant.

Reply via email to