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

--- Comment #3 from Ilya Leoshkevich <iii at linux dot ibm.com> ---
Findings so far: when we forward an edge like this:

#0  redirect_edge_succ (e=0x7ffff6d73cc0, new_succ=0x7ffff6c2aa90) at
../.././gcc/cfg.c:368
#1  0x0000000000a776ff in redirect_edge_succ_nodup (e=0x7ffff6d73cc0,
new_succ=0x7ffff6c2aa90) at ../.././gcc/cfghooks.c:469
#2  0x0000000000a9c18a in cfg_layout_redirect_edge_and_branch
(e=0x7ffff6d73cc0, dest=0x7ffff6c2aa90) at ../.././gcc/cfgrtl.c:4500
#3  0x0000000000a77419 in redirect_edge_and_branch (e=0x7ffff6d73cc0,
dest=0x7ffff6c2aa90) at ../.././gcc/cfghooks.c:373
#4  0x0000000002496e8d in try_forward_edges (mode=40, b=0x7ffff6d86680) at
../.././gcc/cfgcleanup.c:563
#5  0x00000000024a2654 in try_optimize_cfg (mode=40) at
../.././gcc/cfgcleanup.c:2961
#6  0x00000000024a2d1a in cleanup_cfg (mode=40) at
../.././gcc/cfgcleanup.c:3175
#7  0x00000000024a2f29 in (anonymous
namespace)::pass_jump_after_combine::execute (this=0x38a2b00) at
../.././gcc/cfgcleanup.c:3315

we don't seem to correctly update dominance info (if at all), making it
inconsistent with the actual CFG. In this particular case, inconsistency
makes the following call chain produce a loop in the dominator tree:

#3  0x0000000000b37638 in redirect_immediate_dominators (dir=CDI_DOMINATORS,
bb=0x7ffff6c2ab60, to=0x7ffff6d867b8) at ../.././gcc/dominance.c:995
#4  0x0000000000a7838c in merge_blocks (a=0x7ffff6d867b8, b=0x7ffff6c2ab60) at
../.././gcc/cfghooks.c:852
#5  0x00000000024a1a1d in try_optimize_cfg (mode=40) at
../.././gcc/cfgcleanup.c:2825
#6  0x00000000024a2d1a in cleanup_cfg (mode=40) at
../.././gcc/cfgcleanup.c:3175
#7  0x00000000024a2f29 in (anonymous
namespace)::pass_jump_after_combine::execute (this=0x38a2b00) at
../.././gcc/cfgcleanup.c:3315

which ultimately leads to the hang that we are observing.

Reply via email to