https://gcc.gnu.org/bugzilla/show_bug.cgi?id=86928
Andrey Belevantsev <abel at gcc dot gnu.org> changed: What |Removed |Added ---------------------------------------------------------------------------- CC| |abel at gcc dot gnu.org, | |amonakov at gcc dot gnu.org --- Comment #2 from Andrey Belevantsev <abel at gcc dot gnu.org> --- We're not somehow updating liveness information at all times when we change control flow. E.g. we do update liveness in sel_split_edge, but not in sel_redirect_edge_and_branch{,force} hooks, when we're making a new jump and resetting liveness on the bb it ended up in. This leaves us with the unknown lv set, and later breaks when we're computing liveness from the other region and come to this block, as we're assuming that other regions always have correct liveness. Fixed with the below patch but I'm not completely sure it fully makes sense -- Alexander, thoughts? diff --git a/gcc/sel-sched-ir.c b/gcc/sel-sched-ir.c index 85ff5bd3eb4..c399c1117a3 100644 --- a/gcc/sel-sched-ir.c +++ b/gcc/sel-sched-ir.c @@ -5642,6 +5642,8 @@ sel_redirect_edge_and_branch_force (edge e, basic_block to) recompute_dominator (CDI_DOMINATORS, to)); set_immediate_dominator (CDI_DOMINATORS, orig_dest, recompute_dominator (CDI_DOMINATORS, orig_dest)); + if (jump == sel_bb_head (BLOCK_FOR_INSN (jump))) + compute_live (jump); } /* A wrapper for redirect_edge_and_branch. Return TRUE if blocks connected by @@ -5702,6 +5704,8 @@ sel_redirect_edge_and_branch (edge e, basic_block to) set_immediate_dominator (CDI_DOMINATORS, orig_dest, recompute_dominator (CDI_DOMINATORS, orig_dest)); } + if (jump == sel_bb_head (BLOCK_FOR_INSN (jump))) + compute_live (jump); return recompute_toporder_p; }