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

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

           What    |Removed                     |Added
----------------------------------------------------------------------------
           Keywords|                            |missed-optimization
             Status|UNCONFIRMED                 |NEW
   Last reconfirmed|                            |2019-01-24
                 CC|                            |rguenth at gcc dot gnu.org
     Ever confirmed|0                           |1

--- Comment #1 from Richard Biener <rguenth at gcc dot gnu.org> ---
fold does/did some of these transforms (not for the call case).  There's
tail merging on GIMPLE and cross-jumping on RTL as well as ifcvt/phiopt
that in theory could handle all cases.

There's also code sinking that could be massaged (like I massaged it
to common stores).  It doesn't really fit very well anywhere though
(phiopt comes closest I think, as "pre"-pass to the other transforms,
emptying the middle blocks as much as possible).

  <bb 2> [local count: 1073741824]:
  if (a_2(D) >= b_3(D))
    goto <bb 3>; [50.00%]
  else
    goto <bb 4>; [50.00%]

  <bb 3> [local count: 536870913]:
  iftmp.0_4 = -a_2(D);
  goto <bb 5>; [100.00%]

  <bb 4> [local count: 536870913]:
  iftmp.0_5 = -b_3(D);

  <bb 5> [local count: 1073741824]:
  # iftmp.0_1 = PHI <iftmp.0_4(3), iftmp.0_5(4)>
  return iftmp.0_1;

..

  <bb 2> [local count: 1073741824]:
  if (a_3(D) >= b_4(D))
    goto <bb 3>; [50.00%]
  else
    goto <bb 4>; [50.00%]

  <bb 3> [local count: 536870913]:
  iftmp.2_7 = transform (a_3(D));
  goto <bb 5>; [100.00%]

  <bb 4> [local count: 536870913]:
  iftmp.2_9 = transform (b_4(D));

  <bb 5> [local count: 1073741824]:
  # iftmp.2_1 = PHI <iftmp.2_7(3), iftmp.2_9(4)>
  return iftmp.2_1;

Reply via email to