register renaming
Stan Cox
scox@cygnus.com
Fri Mar 31 01:23:00 GMT 2000
A couple of bug fixes: bad updating of dead notes and incorrect mode with a
register substitution on x86.
*** regrename.c Thu Mar 30 20:39:29 2000
--- regrename.c Thu Mar 30 20:48:41 2000
@@ -504,27 +504,45 @@ replace_reg_in_block (du, uid_ruid, def,
{
int du_idx, status = 1;
int r = REGNO (reg_def);
+ rtx death_note;
+ rtx new_reg = gen_rtx_REG (GET_MODE (reg_def), avail_reg);
- rr_replace_reg (VARRAY_RTX (*uid_ruid, def), reg_def,
- gen_rtx_REG (GET_MODE (reg_def), avail_reg),
- DESTINATION, VARRAY_RTX (*uid_ruid, def),
+
+ rr_replace_reg (PATTERN (VARRAY_RTX (*uid_ruid, def)), reg_def,
+ new_reg, DESTINATION, VARRAY_RTX (*uid_ruid, def),
&status);
if (!status)
return status;
+ death_note = find_reg_note (VARRAY_RTX (*uid_ruid, def), REG_DEAD, reg_def);
+ if (!death_note)
+ death_note = find_reg_note (VARRAY_RTX (*uid_ruid, def), REG_UNUSED, reg_def);
+ if (death_note)
+ rr_replace_reg (death_note, reg_def, new_reg, 0,
+ VARRAY_RTX (*uid_ruid, def), &status);
+
for (du_idx = def + 1; du_idx < du->high_bound; du_idx++)
{
rtx reg_use;
+ rtx new_reg;
if (GET_RTX_CLASS (GET_CODE (VARRAY_RTX (*uid_ruid, du_idx))) != 'i')
continue;
reg_use = regno_use_in (r, PATTERN (VARRAY_RTX (*uid_ruid, du_idx)));
if (reg_use && TEST_BIT (du->uses[r], du_idx))
{
- rr_replace_reg (VARRAY_RTX (*uid_ruid, du_idx), reg_use,
- gen_rtx_REG (GET_MODE (reg_use), avail_reg),
- SOURCE, VARRAY_RTX (*uid_ruid, du_idx),
+ new_reg = gen_rtx_REG (GET_MODE (reg_use), avail_reg);
+ rr_replace_reg (PATTERN (VARRAY_RTX (*uid_ruid, du_idx)), reg_use,
+ new_reg, SOURCE, VARRAY_RTX (*uid_ruid, du_idx),
&status);
+ death_note = find_reg_note (VARRAY_RTX (*uid_ruid, du_idx),
+ REG_DEAD, reg_use);
+ if (!death_note)
+ death_note = find_reg_note (VARRAY_RTX (*uid_ruid, du_idx),
+ REG_UNUSED, reg_use);
+ if (death_note)
+ rr_replace_reg (death_note, reg_use, new_reg, 0,
+ VARRAY_RTX (*uid_ruid, def), &status);
SET_BIT (du->uses[avail_reg], du_idx);
RESET_BIT (du->uses[r], du_idx);
if (!status)
@@ -563,7 +581,10 @@ rr_replace_reg (x, reg_use, reg_sub, rep
case REG:
if (REGNO (x) == REGNO (reg_use))
{
+ if (GET_MODE (x) == GET_MODE (reg_use))
return reg_sub;
+ else
+ return gen_rtx_REG (GET_MODE (x), REGNO (reg_use));
}
return x;
@@ -727,10 +748,15 @@ consider_use (insn, regno, def_block, us
if (condmove_p (insn))
return 0;
- /* Don't consider register if the only use is in a USE */
reg_use = regno_first_use_in (regno, PATTERN (insn));
if (reg_use)
{
+ /* Don't consider multi-reg values. */
+ if (HARD_REGNO_NREGS (regno, GET_MODE (reg_use)) != 1
+ && GET_MODE (reg_use) != CCmode)
+ return 0;
+
+ /* Don't consider register if the only use is in a USE */
if (reg_mentioned_p (gen_rtx_USE (VOIDmode, reg_use),
PATTERN (insn)))
return 0;
More information about the Gcc-patches
mailing list