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

Andrew Pinski <pinskia at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
           Keywords|                            |missed-optimization
   Last reconfirmed|2014-01-07 00:00:00         |2021-6-1

--- Comment #12 from Andrew Pinski <pinskia at gcc dot gnu.org> ---
(In reply to Jan Hubicka from comment #4)
> > Not all testcases can be handled at gimplification time IIRC.  Which
> > means "testcases welcome" first, so we can look at them individually.
> 
> The GCC one I saw was equivalent of:
> #include <stdbool.h>
> bool
> m_is_less_than_n (int n, int m)
> {
>    return (n==m || m_is_less_than_n (n-1,m));
> }

First we cannot optimize this into a loop until tailc rather than in either
tailr1 or tailr2.

In tailr1, we have:
  _2 = m_is_less_than_n (_1, m_7(D));
  if (_2 != 0)
    goto <bb 6>; [INV]
  else
    goto <bb 5>; [INV]

  <bb 6> :

  <bb 5> :
  # iftmp.0_3 = PHI <1(6), 0(3), 1(2)>
  _12 = (_Bool) iftmp.0_3;


While in tailr2, we have:
  _18 = m_is_less_than_n (_17, m_6(D));
  _4 = (int) _18;

  <bb 7> [local count: 1073741825]:
  # iftmp.0_3 = PHI <_4(6), 1(3), 1(2), 1(4), 1(5)>
  _8 = (_Bool) iftmp.0_3;

It is not until PRE where we remove the casts (to/from int).

Reply via email to