Commit 2169f14c by Eric Botcazou Committed by Eric Botcazou

re PR rtl-optimization/52629 (out-of-bounds access in reload1.c)

	PR rtl-optimization/52629
	* reload1.c (count_pseudo): Short-circuit common case.
	(count_spilled_pseudo): Return early for pseudos without hard regs.
	Assert that the pseudo has got a hard reg before manipulating it.

From-SVN: r185787
parent dd03252e
2012-03-26 Eric Botcazou <ebotcazou@adacore.com>
PR rtl-optimization/52629
* reload1.c (count_pseudo): Short-circuit common case.
(count_spilled_pseudo): Return early for pseudos without hard regs.
Assert that the pseudo has got a hard reg before manipulating it.
2012-03-24 Jan Hubicka <jh@suse.cz> 2012-03-24 Jan Hubicka <jh@suse.cz>
PR lto/51663 PR lto/51663
......
...@@ -1746,11 +1746,12 @@ count_pseudo (int reg) ...@@ -1746,11 +1746,12 @@ count_pseudo (int reg)
int r = reg_renumber[reg]; int r = reg_renumber[reg];
int nregs; int nregs;
/* Ignore spilled pseudo-registers which can be here only if IRA is used. */
if (ira_conflicts_p && r < 0)
return;
if (REGNO_REG_SET_P (&pseudos_counted, reg) if (REGNO_REG_SET_P (&pseudos_counted, reg)
|| REGNO_REG_SET_P (&spilled_pseudos, reg) || REGNO_REG_SET_P (&spilled_pseudos, reg))
/* Ignore spilled pseudo-registers which can be here only if IRA
is used. */
|| (ira_conflicts_p && r < 0))
return; return;
SET_REGNO_REG_SET (&pseudos_counted, reg); SET_REGNO_REG_SET (&pseudos_counted, reg);
...@@ -1827,12 +1828,17 @@ count_spilled_pseudo (int spilled, int spilled_nregs, int reg) ...@@ -1827,12 +1828,17 @@ count_spilled_pseudo (int spilled, int spilled_nregs, int reg)
{ {
int freq = REG_FREQ (reg); int freq = REG_FREQ (reg);
int r = reg_renumber[reg]; int r = reg_renumber[reg];
int nregs = hard_regno_nregs[r][PSEUDO_REGNO_MODE (reg)]; int nregs;
/* Ignore spilled pseudo-registers which can be here only if IRA is used. */
if (ira_conflicts_p && r < 0)
return;
gcc_assert (r >= 0);
nregs = hard_regno_nregs[r][PSEUDO_REGNO_MODE (reg)];
/* Ignore spilled pseudo-registers which can be here only if IRA is if (REGNO_REG_SET_P (&spilled_pseudos, reg)
used. */
if ((ira_conflicts_p && r < 0)
|| REGNO_REG_SET_P (&spilled_pseudos, reg)
|| spilled + spilled_nregs <= r || r + nregs <= spilled) || spilled + spilled_nregs <= r || r + nregs <= spilled)
return; return;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment