参照元†
返り値†
static void
do_reload (void)
{
basic_block bb;
bool need_dce;
unsigned pic_offset_table_regno = INVALID_REGNUM;
if (flag_ira_verbose < 10)
ira_dump_file = dump_file;
/* If pic_offset_table_rtx is a pseudo register, then keep it so
after reload to avoid possible wrong usages of hard reg assigned
to it. */
if (pic_offset_table_rtx
&& REGNO (pic_offset_table_rtx) >= FIRST_PSEUDO_REGISTER)
pic_offset_table_regno = REGNO (pic_offset_table_rtx);
timevar_push (TV_RELOAD);
if (ira_use_lra_p)
{
if (current_loops != NULL)
{
loop_optimizer_finalize ();
free_dominance_info (CDI_DOMINATORS);
}
FOR_ALL_BB_FN (bb, cfun)
bb->loop_father = NULL;
current_loops = NULL;
ira_destroy ();
lra (ira_dump_file);
/* ???!!! Move it before lra () when we use ira_reg_equiv in
LRA. */
vec_free (reg_equivs);
reg_equivs = NULL;
need_dce = false;
}
else
{
df_set_flags (DF_NO_INSN_RESCAN);
build_insn_chain ();
need_dce = reload (get_insns (), ira_conflicts_p);
}
timevar_pop (TV_RELOAD);
timevar_push (TV_IRA);
if (ira_conflicts_p && ! ira_use_lra_p)
{
ira_free (ira_spilled_reg_stack_slots);
ira_finish_assign ();
}
if (internal_flag_ira_verbose > 0 && ira_dump_file != NULL
&& overall_cost_before != ira_overall_cost)
fprintf (ira_dump_file, "+++Overall after reload %" PRId64 "\n",
ira_overall_cost);
flag_ira_share_spill_slots = saved_flag_ira_share_spill_slots;
if (! ira_use_lra_p)
{
ira_destroy ();
if (current_loops != NULL)
{
loop_optimizer_finalize ();
free_dominance_info (CDI_DOMINATORS);
}
FOR_ALL_BB_FN (bb, cfun)
bb->loop_father = NULL;
current_loops = NULL;
regstat_free_ri ();
regstat_free_n_sets_and_refs ();
}
if (optimize)
cleanup_cfg (CLEANUP_EXPENSIVE);
finish_reg_equiv ();
bitmap_obstack_release (&ira_bitmap_obstack);
#ifndef IRA_NO_OBSTACK
obstack_free (&ira_obstack, NULL);
#endif
/* The code after the reload has changed so much that at this point
we might as well just rescan everything. Note that
df_rescan_all_insns is not going to help here because it does not
touch the artificial uses and defs. */
df_finish_pass (true);
df_scan_alloc (NULL);
df_scan_blocks ();
if (optimize > 1)
{
df_live_add_problem ();
df_live_set_all_dirty ();
}
if (optimize)
df_analyze ();
if (need_dce && optimize)
run_fast_dce ();
/* Diagnose uses of the hard frame pointer when it is used as a global
register. Often we can get away with letting the user appropriate
the frame pointer, but we should let them know when code generation
makes that impossible. */
if (global_regs[HARD_FRAME_POINTER_REGNUM] && frame_pointer_needed)
{
tree decl = global_regs_decl[HARD_FRAME_POINTER_REGNUM];
error_at (DECL_SOURCE_LOCATION (current_function_decl),
"frame pointer required, but reserved");
inform (DECL_SOURCE_LOCATION (decl), "for %qD", decl);
}
/* If we are doing generic stack checking, give a warning if this
function's frame size is larger than we expect. */
if (flag_stack_check == GENERIC_STACK_CHECK)
{
poly_int64 size = get_frame_size () + STACK_CHECK_FIXED_FRAME_SIZE;
for (int i = 0; i < FIRST_PSEUDO_REGISTER; i++)
if (df_regs_ever_live_p (i) && !fixed_regs[i] && call_used_regs[i])
size += UNITS_PER_WORD;
if (constant_lower_bound (size) > STACK_CHECK_MAX_FRAME_SIZE)
warning (0, "frame size too large for reliable stack checking");
}
if (pic_offset_table_regno != INVALID_REGNUM)
pic_offset_table_rtx = gen_rtx_REG (Pmode, pic_offset_table_regno);
timevar_pop (TV_IRA);
}
コメント†