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

--- Comment #8 from Jan Hubicka <hubicka at gcc dot gnu.org> ---
The difference is that tailr1 pass now turns recursion into loop.

GCC15 does:

Basic block 11 has extra exit edges
Basic block 33 has extra exit edges
Basic block 28 has extra exit edges
Basic block 23 has extra exit edges
Cannot handle *_15 = _16;
Basic block 19 has extra exit edges

while trunk:


Basic block 11 has extra exit edges
Basic block 33 has extra exit edges
Basic block 28 has extra exit edges
Basic block 23 has extra exit edges
Cannot handle *_15 = _16;
Basic block 19 has extra exit edges
Eliminated tail recursion in bb 6 : src_181 = codec47_block (ctx_168(D),
src_179, _40, _38, _36, w_157(D), coltbl_170(D), size_167);

It is not 100% clear to me why this happens.  The recursive call in GCC 15 is

 <bb 6> :
  size_175 = size_168(D) >> 1;
  _17 = (int) size_175;
  _18 = (int) w_165(D);
  src_180 = codec47_block (ctx_176(D), src_162, dst_172(D), p1_177(D),
p2_171(D), _18, coltbl_178(D), _17);
  _21 = (sizetype) size_175;
  _22 = p2_171(D) + _21;
  _24 = p1_177(D) + _21;
  _26 = dst_172(D) + _21;
  src_182 = codec47_block (ctx_176(D), src_180, _26, _24, _22, _18,
coltbl_178(D), _17);
  _29 = _17 * _18;
  _30 = (sizetype) _29;
  dst_183 = dst_172(D) + _30;
  p1_184 = p1_177(D) + _30;
  p2_185 = p2_171(D) + _30;
  src_187 = codec47_block (ctx_176(D), src_182, dst_183, p1_184, p2_185, _18,
coltbl_178(D), _17);
  _44 = p2_185 + _21;
  _46 = p1_184 + _21;
  _48 = dst_183 + _21;
  src_189 = codec47_block (ctx_176(D), src_187, _48, _46, _44, _18,
coltbl_178(D), _17);
  goto <bb 35>; [INV]
...
  <bb 35> :
  # src_136 = PHI <src_198(11), src_162(34), src_189(6), src_196(5),
src_209(19)>
  col ={v} {CLOBBER(eos)};
  return src_136;

while trunk:
 <bb 6> :
  size_175 = size_168(D) >> 1;
  _17 = (int) size_175;
  _18 = (int) w_165(D);
  src_180 = codec47_block (ctx_176(D), src_162, dst_172(D), p1_177(D),
p2_171(D), _18, coltbl_178(D), _17);
  _21 = (sizetype) size_175;
  _22 = p2_171(D) + _21;
  _24 = p1_177(D) + _21;
  _26 = dst_172(D) + _21;
  src_182 = codec47_block (ctx_176(D), src_180, _26, _24, _22, _18,
coltbl_178(D), _17);
  _29 = _17 * _18;
  _30 = (sizetype) _29;
  dst_183 = dst_172(D) + _30;
  p1_184 = p1_177(D) + _30;
  p2_185 = p2_171(D) + _30;
  src_187 = codec47_block (ctx_176(D), src_182, dst_183, p1_184, p2_185, _18,
coltbl_178(D), _17);
  _44 = p2_185 + _21;
  _46 = p1_184 + _21;
  _48 = dst_183 + _21;
  src_189 = codec47_block (ctx_176(D), src_187, _48, _46, _44, _18,
coltbl_178(D), _17);
  goto <bb 35>; [INV]
...
  <bb 35> :
  # src_128 = PHI <src_190(11), src_154(34), src_181(6), src_188(5),
src_201(19)>
  col ={v} {CLOBBER(eos)};
  return src_128;


but the loop introduced by the tail recursion pass turns pass-thru to
non-pass-thru and we lose recursive cloning opurtunity.

Reply via email to