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

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

           What    |Removed                     |Added
----------------------------------------------------------------------------
             Status|UNCONFIRMED                 |NEW
   Last reconfirmed|                            |2017-03-23
   Target Milestone|---                         |7.0
     Ever confirmed|0                           |1

--- Comment #1 from Richard Biener <rguenth at gcc dot gnu.org> ---
Code-hoisting triggers a latent pessimization PRE performs:

Transform:

  <bb 3> [85.00%]:
  # a_14 = PHI <a_10(8), a_5(D)(7)>
  if (b_7(D) != 0)
    goto <bb 4>; [50.00%]
  else
    goto <bb 10>; [50.00%]

  <bb 10> [42.50%]:
  goto <bb 5>; [100.00%]

  <bb 4> [42.50%]:
  a_8 = a_14 + 1;

  <bb 5> [85.00%]:
  # a_2 = PHI <a_14(10), a_8(4)>
  fn2 ();
  a_10 = a_2 + 1;

to

  <bb 3> [85.00%]:
  # a_14 = PHI <prephitmp_12(5), a_5(D)(2)>
  _4 = a_14 + 1;
  if (b_7(D) != 0)
    goto <bb 4>; [50.00%]
  else
    goto <bb 5>; [50.00%]

  <bb 4> [42.50%]:
  _3 = _4 + 1;

  <bb 5> [85.00%]:
  # a_2 = PHI <a_14(3), _4(4)>
  # prephitmp_12 = PHI <_4(3), _3(4)>
  fn2 ();

that's because the hoisting (which itself isn't a problem) makes
a_2 + 1 partially redundant over the latch.  We see this issue
in related testcases where PRE can compute a constant for the
first iteration value of expressions and thus inserts IVs for
them.  So it's nothing new and a fix would hopefully fix those
cases as well.

Reply via email to