https://gcc.gnu.org/bugzilla/show_bug.cgi?id=71661
--- Comment #6 from Jeffrey A. Law <law at redhat dot com> ---
As noted in my last comment, removal of a forwarder block may turn an
irreducible loop into a natural loop. The loop header for any such exposed
natural loop will not be recognized as a loop header by tree_forwarder_block_p
(which avoids forwarding through loop headers).
So the easiest way to fix this problem is check if a block is a loop header in
remove_forwarder_block* rather than just in tree_forwarder_block_p. This is
comparable to how we avoid infinite loops where we have this tidbit of code:
/* We check for infinite loops already in tree_forwarder_block_p.
However it may happen that the infinite loop is created
afterwards due to removal of forwarders. */
if (dest == bb)
return false;