void loop_optimizer_finalize (struct function *fn) { struct loop *loop; basic_block bb; timevar_push (TV_LOOP_FINI); if (loops_state_satisfies_p (fn, LOOPS_HAVE_RECORDED_EXITS)) release_recorded_exits (fn); free_numbers_of_iterations_estimates (fn); /* If we should preserve loop structure, do not free it but clear flags that advanced properties are there as we are not preserving that in full. */ if (fn->curr_properties & PROP_loops) { loops_state_clear (fn, LOOP_CLOSED_SSA | LOOPS_HAVE_MARKED_IRREDUCIBLE_REGIONS | LOOPS_HAVE_PREHEADERS | LOOPS_HAVE_SIMPLE_LATCHES | LOOPS_HAVE_FALLTHRU_PREHEADERS); loops_state_set (fn, LOOPS_MAY_HAVE_MULTIPLE_LATCHES); goto loop_fini_done; } FOR_EACH_LOOP_FN (fn, loop, 0) free_simple_loop_desc (loop); /* Clean up. */ flow_loops_free (loops_for_fn (fn)); ggc_free (loops_for_fn (fn)); set_loops_for_fn (fn, NULL); FOR_ALL_BB_FN (bb, fn) { bb->loop_father = NULL; } loop_fini_done: timevar_pop (TV_LOOP_FINI); }
static bool gate_loop (function *fn) { if (!flag_tree_loop_optimize) return false; /* For -fdump-passes which runs before loop discovery print the state of -ftree-loop-optimize. */ if (!loops_for_fn (fn)) return true; return number_of_loops (fn) > 1; }