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

--- Comment #5 from Richard Biener <rguenth at gcc dot gnu.org> ---
OK, so with the abnormal edges the issue is that DCE1 removes the recursive
call to foo () (because the function is "wrongly" pure) which causes us to
clear
cfun->calls_setjmp but then any further gimple_purge_dead_abnormal_call_edges
will simply do nothing (as premature optimization one could guess).  So the
bug would be that we fail to wipe all abnormal edges when a function no
longer calls setjmp or has a nonlocal label.

The easiest fix is to remove the premature optimization in
gimple_purge_dead_abnormal_call_edges.  That leaves the abnormal edges from
bar() even after DCE removes the recursive call to foo() (still a missed
optimization) but it at least will not leave us with stray abnormal edges
from non-call / non-computed goto stmts in the IL.

It also resolves the compare-debug failure for this testcase (but maybe there's
a latent issue in store-merging still).

Reply via email to