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

--- Comment #17 from Andrew Pinski <pinskia at gcc dot gnu.org> ---
(In reply to Andrew Pinski from comment #12)
> (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).

I have a phiopt change which allows us now to optimize this in phiopt2 (and get
the tail call in tailr2).

Reply via email to