[Bug target/62147] missed loop counter based optimization

linkw at gcc dot gnu.org gcc-bugzilla@gcc.gnu.org
Tue Jun 11 06:42:00 GMT 2019


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

Kewen Lin <linkw at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
             Status|NEW                         |ASSIGNED

--- Comment #4 from Kewen Lin <linkw at gcc dot gnu.org> ---
It's reproducible on LE too.  With the latest trunk, we should add option
-fno-tree-loop-distribute-patterns to disable the memset transformation.

IVOPTs performs well to use memory based IV to replace the BIV.

  <bb 3> [local count: 955630224]:
  # ivtmp.8_3 = PHI <ivtmp.8_10(5), ivtmp.8_2(6)>
  ivtmp.8_2 = ivtmp.8_3 + 4;
  _15 = (void *) ivtmp.8_2;
  MEM[base: _15, offset: 0B] = 0;
  if (ivtmp.8_2 != _22)
    goto <bb 6>; [89.00%]
  else
    goto <bb 8>; [11.00%]

instead of

  <bb 3> [local count: 955630224]:
  # i_11 = PHI <0(5), i_8(6)>
  s_5(D)->b[i_11] = 0;
  i_8 = i_11 + 1;
  if (_1 >= i_11)
    goto <bb 6>; [89.00%]
  else
    goto <bb 8>; [11.00%]

Later the doloop optimization fails to know this loop is finite.  Because the
loop body has two BBs, BB 4 (address update, store, comp) and BB 6 (latch).
The iteration description is calculated from comp (condition), one of the
operand is invariant and calculated from BB 3, but we don't have any UD
information to back substitute it and determine it's finite then.

One idea is to pass down the finiteness information to RTL phase when we
perform some eliminated IV transformation, later RTL phase can leverage this
information  for accurate finiteness.


More information about the Gcc-bugs mailing list