static unsigned int tracer (void) { bool changed; if (n_basic_blocks <= NUM_FIXED_BLOCKS + 1) return 0; mark_dfs_back_edges (); if (dump_file) brief_dump_cfg (dump_file, dump_flags); /* Trace formation is done on the fly inside tail_duplicate */ changed = tail_duplicate (); if (changed) { free_dominance_info (CDI_DOMINATORS); calculate_dominance_info (CDI_DOMINATORS); if (current_loops) fix_loop_structure (NULL); } if (dump_file) brief_dump_cfg (dump_file, dump_flags); return changed ? TODO_cleanup_cfg : 0; }
void loop_optimizer_init (unsigned flags) { timevar_push (TV_LOOP_INIT); if (!current_loops) { gcc_assert (!(cfun->curr_properties & PROP_loops)); /* Find the loops. */ current_loops = flow_loops_find (NULL); } else { bool recorded_exits = loops_state_satisfies_p (LOOPS_HAVE_RECORDED_EXITS); bool needs_fixup = loops_state_satisfies_p (LOOPS_NEED_FIXUP); gcc_assert (cfun->curr_properties & PROP_loops); /* Ensure that the dominators are computed, like flow_loops_find does. */ calculate_dominance_info (CDI_DOMINATORS); #ifdef ENABLE_CHECKING if (!needs_fixup) verify_loop_structure (); #endif /* Clear all flags. */ if (recorded_exits) release_recorded_exits (); loops_state_clear (~0U); if (needs_fixup) { /* Apply LOOPS_MAY_HAVE_MULTIPLE_LATCHES early as fix_loop_structure re-applies flags. */ loops_state_set (flags & LOOPS_MAY_HAVE_MULTIPLE_LATCHES); fix_loop_structure (NULL); } } /* Apply flags to loops. */ apply_loop_flags (flags); /* Dump loops. */ flow_loops_dump (dump_file, NULL, 1); #ifdef ENABLE_CHECKING verify_loop_structure (); #endif timevar_pop (TV_LOOP_INIT); }
/* Main entry point. Perform loop unswitching on all suitable loops. */ void unswitch_loops (void) { struct loop *loop; bool changed = false; /* Go through inner loops (only original ones). */ FOR_EACH_LOOP (loop, LI_ONLY_INNERMOST) changed |= unswitch_single_loop (loop, NULL_RTX, 0); iv_analysis_done (); /* If we unswitched any loop discover new loops that are eventually exposed by making irreducible regions reducible. */ if (changed) { calculate_dominance_info (CDI_DOMINATORS); fix_loop_structure (NULL); } }