[Bug rtl-optimization/80127] New: regrename_do_replace does not update the df refs
stefan at franke dot ms
gcc-bugzilla@gcc.gnu.org
Tue Mar 21 09:26:00 GMT 2017
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=80127
Bug ID: 80127
Summary: regrename_do_replace does not update the df refs
Product: gcc
Version: 6.3.1
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: rtl-optimization
Assignee: unassigned at gcc dot gnu.org
Reporter: stefan at franke dot ms
Target Milestone: ---
The method regrename_do_replace does neither update the df refs nor reset the
ever_live flag. Also the passes for stack variables are scheduled to early.
This leads to eliminated variables which are still pushed/popped to/from stack
but are never used.
Old code:
bool
regrename_do_replace (struct du_head *head, int regno)
{
...
mode = GET_MODE(*head->first->loc);
head->renamed = 1;
head->regno = regno;
head->nregs = hard_regno_nregs[regno][mode];
return true;
}
My code:
bool
regrename_do_replace (struct du_head *head, int regno)
{
...
mode = GET_MODE(*head->first->loc);
head->renamed = 1;
head->regno = regno;
head->nregs = hard_regno_nregs[regno][mode];
/* SBF: also update the current df info, move from base_regno -> regno. */
if (base_regno < FIRST_PSEUDO_REGISTER && regno < FIRST_PSEUDO_REGISTER)
for (chain = head->first; chain; chain = chain->next_use)
{
if (DEBUG_INSN_P (chain->insn))
continue;
/* undo regno patch - will be patched again */
if (REGNO (*chain->loc) == regno)
SET_REGNO(*chain->loc, base_regno);
df_ref_change_reg_with_loc (*chain->loc, regno);
SET_REGNO(*chain->loc, regno);
}
/* SBF: Mark the old regno as no longer used. */
if (!df->hard_regs_live_count[base_regno])
df_set_regs_ever_live (base_regno, false);
return true;
}
I also moved the stack creation passed after regrename:
passes.def:
...
NEXT_PASS (pass_regrename);
NEXT_PASS (pass_cprop_hardreg);
NEXT_PASS (pass_thread_prologue_and_epilogue);
NEXT_PASS (pass_rtl_dse2);
NEXT_PASS (pass_stack_adjustments);
...
=> No more push/pop for unused variables due to regrename.
More information about the Gcc-bugs
mailing list