This fixes two remaining issues with properly preserving loops, one academic with -dx which skips all RTL optimizers and then ICEs in clean_state when trying to verify loops after we freed everything else. One maybe serious where TM instrumentation wrecks loops but doesn't tell others about this (TM might be a reason to not "ignore" loops with abnormal edges?).
Re-bootstrap and regtest running on x86_64-unknown-linux-gnu. Richard. 2017-05-10 Richard Biener <rguent...@suse.de> * passes.c (execute_function_todo): Verify loops if they are said to be up-to-date. * cfgexpand.c (pass_expand::execute): Discard loops for -dx. * trans-mem.c (pass_tm_edges::execute): Mark loops for fixup. Index: gcc/passes.c =================================================================== --- gcc/passes.c (revision 247838) +++ gcc/passes.c (working copy) @@ -1979,8 +1979,12 @@ execute_function_todo (function *fn, voi && !from_ipa_pass) verify_flow_info (); if (current_loops - && loops_state_satisfies_p (LOOP_CLOSED_SSA)) - verify_loop_closed_ssa (false); + && ! loops_state_satisfies_p (LOOPS_NEED_FIXUP)) + { + verify_loop_structure (); + if (loops_state_satisfies_p (LOOP_CLOSED_SSA)) + verify_loop_closed_ssa (false); + } if (cfun->curr_properties & PROP_rtl) verify_rtl_sharing (); } Index: gcc/cfgexpand.c =================================================================== --- gcc/cfgexpand.c (revision 247838) +++ gcc/cfgexpand.c (working copy) @@ -6542,6 +6542,14 @@ pass_expand::execute (function *fun) set_block_levels (DECL_INITIAL (fun->decl), 0); default_rtl_profile (); + /* For -dx discard loops now, otherwise IL verify in clean_state will + ICE. */ + if (rtl_dump_and_exit) + { + cfun->curr_properties &= ~PROP_loops; + loop_optimizer_finalize (); + } + timevar_pop (TV_POST_EXPAND); return 0; Index: gcc/trans-mem.c =================================================================== --- gcc/trans-mem.c (revision 247838) +++ gcc/trans-mem.c (working copy) @@ -3369,6 +3369,8 @@ pass_tm_edges::execute (function *fun) must be rebuilt completely. Otherwise we'll crash trying to update the SSA web in the TODO section following this pass. */ free_dominance_info (CDI_DOMINATORS); + /* We'ge also wrecked loops badly with inserting of abnormal edges. */ + loops_state_set (LOOPS_NEED_FIXUP); bitmap_obstack_release (&tm_obstack); all_tm_regions = NULL;