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).