void loop_optimizer_finalize (void) { struct loop *loop; basic_block bb; timevar_push (TV_LOOP_FINI); if (loops_state_satisfies_p (LOOPS_HAVE_RECORDED_EXITS)) release_recorded_exits (); free_numbers_of_iterations_estimates (); /* 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 (cfun->curr_properties & PROP_loops) { loops_state_clear (LOOP_CLOSED_SSA | LOOPS_HAVE_MARKED_IRREDUCIBLE_REGIONS | LOOPS_HAVE_PREHEADERS | LOOPS_HAVE_SIMPLE_LATCHES | LOOPS_HAVE_FALLTHRU_PREHEADERS); loops_state_set (LOOPS_MAY_HAVE_MULTIPLE_LATCHES); goto loop_fini_done; } gcc_assert (current_loops != NULL); FOR_EACH_LOOP (loop, 0) free_simple_loop_desc (loop); /* Clean up. */ flow_loops_free (current_loops); ggc_free (current_loops); current_loops = NULL; FOR_ALL_BB_FN (bb, cfun) { bb->loop_father = NULL; } loop_fini_done: timevar_pop (TV_LOOP_FINI); }
/* Finalize loop optimizer. */ void loop_optimizer_finalize (struct loops *loops) { unsigned i; if (!loops) return; for (i = 1; i < loops->num; i++) if (loops->parray[i]) free_simple_loop_desc (loops->parray[i]); /* Clean up. */ flow_loops_free (loops); free (loops); /* Checking. */ #ifdef ENABLE_CHECKING verify_flow_info (); #endif }