> Am 12.11.2019 um 15:32 schrieb Segher Boessenkool > <seg...@kernel.crashing.org>: > > Hi! > > On Tue, Nov 12, 2019 at 03:11:05PM +0100, Ilya Leoshkevich wrote: >> try_forward_edges does not update dominance info, and merge_blocks >> relies on it being up-to-date. In PR92430 stale dominance info makes >> merge_blocks produce a loop in the dominator tree, which in turn makes >> delete_basic_block loop forever. >> >> Fix by freeing dominance info at the beginning of cleanup_cfg. > >> --- a/gcc/cfgcleanup.c >> +++ b/gcc/cfgcleanup.c >> @@ -3312,6 +3312,9 @@ public: >> unsigned int >> pass_jump_after_combine::execute (function *) >> { >> + /* Jump threading does not keep dominators up-to-date. */ >> + free_dominance_info (CDI_DOMINATORS); >> + free_dominance_info (CDI_POST_DOMINATORS); >> cleanup_cfg (flag_thread_jumps ? CLEANUP_THREADING : 0); >> return 0; >> } > > Why do you always free it, if if only gets invalidated if flag_thread_jumps? > > It may be a good idea to throw away the dom info anyway, but the comment > seems off then?
Hmm, come to think of it, it would make sense to make flag_thread_jumps a gate for this pass, and then run free_dominance_info (CDI_DOMINATORS) and cleanup_cfg (CLEANUP_THREADING) unconditionally. What do you think? Best regards, Ilya