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

--- Comment #3 from Richard Biener <rguenth at gcc dot gnu.org> ---
ivcanon adds the decrementing by one IV as expected:

  <bb 2> [local count: 53687088]:

  <bb 3> [local count: 1020054736]:
  # i_8 = PHI <i_5(5), 36(2)>
  # ivtmp_2 = PHI <ivtmp_1(5), 19(2)>
  v ={v} i_8;
  i_5 = i_8 + -2;
  ivtmp_1 = ivtmp_2 - 1;
  if (ivtmp_1 != 0)
    goto <bb 5>; [94.74%]
  else
    goto <bb 4>; [5.26%]

  <bb 5> [local count: 966367644]:
  goto <bb 3>; [100.00%]

IVOPTs then considers

Candidate 8:
  Incr POS: orig biv
  IV struct:
    Type:       int
    Base:       36
    Step:       -2
    Biv:        N
    Overflowness wrto loop niter:       No-overflow

But it doesn't consider Base 38 and rewrite

  v ={v} i_8;
  i_5 = i_8 + -2;

into

  i_5 = i_8 + -2;
  v ={v} i_5;
  if (i_5 != 0)

IVOPTs considers Base 34 because of the i_5 BIV.

Even with disabling IVCANON we do not consider an IV candidate with an != 0
exit test.  We usually add those for doloop but AVR disables IVOPTs
doloop heuristic.

We might want to add the doloop IV candidate unconditionally (but not mark
it doloop if the target doesn't have doloop).  But discovering a doloop
like candidate for step != -1 (in this case -2) is difficult when ivcanon
rewrote the exit test - the natural place would be to record the candidate
because of the exit test use.  The other possibility would be to add
these candidates during BIV processing and add a BIV variant that decrements
to zero.

Then only costs would have to be in a way that we also select that candidate of
course.

Reply via email to