(regclass): Don't set REGNO_POINTER_FLAG here.

(reg_scan_mark_refs): Set it here.
Accept INSN, not UID as arg.
(reg_scan): Call reg_scan_mark_refs with INSN, not UID.

From-SVN: r3615
This commit is contained in:
Richard Kenner 1993-03-02 18:59:33 -05:00
parent 78c02237e2
commit be8dcd745f
1 changed files with 49 additions and 57 deletions

View File

@ -719,56 +719,6 @@ regclass (f, nregs)
continue;
}
/* If this is setting a pseudo from another pseudo or the
sum of a pseudo and a constant integer and the other
pseudo is known to be a pointer, set the destination to
be a pointer as well.
Likewise if it is setting the destination from an address
or from a value equivalent to an address or to the sum of
an address and something else.
But don't do any of this if the pseudo corresponds to
a user variable since it should have already been set
as a pointer based on the type.
There is no point in doing this during our second
pass since not enough should have changed. */
if (pass == 0 && set != 0 && GET_CODE (SET_DEST (set)) == REG
&& REGNO (SET_DEST (set)) >= FIRST_PSEUDO_REGISTER
&& ! REG_USERVAR_P (SET_DEST (set))
&& ! REGNO_POINTER_FLAG (REGNO (SET_DEST (set)))
&& ((GET_CODE (SET_SRC (set)) == REG
&& REGNO_POINTER_FLAG (REGNO (SET_SRC (set))))
|| ((GET_CODE (SET_SRC (set)) == PLUS
|| GET_CODE (SET_SRC (set)) == LO_SUM)
&& (GET_CODE (XEXP (SET_SRC (set), 1))
== CONST_INT)
&& GET_CODE (XEXP (SET_SRC (set), 0)) == REG
&& REGNO_POINTER_FLAG (REGNO (XEXP (SET_SRC (set), 0))))
|| GET_CODE (SET_SRC (set)) == CONST
|| GET_CODE (SET_SRC (set)) == SYMBOL_REF
|| GET_CODE (SET_SRC (set)) == LABEL_REF
|| (GET_CODE (SET_SRC (set)) == HIGH
&& (GET_CODE (XEXP (SET_SRC (set), 0)) == CONST
|| (GET_CODE (XEXP (SET_SRC (set), 0))
== SYMBOL_REF)
|| (GET_CODE (XEXP (SET_SRC (set), 0))
== LABEL_REF)))
|| ((GET_CODE (SET_SRC (set)) == PLUS
|| GET_CODE (SET_SRC (set)) == LO_SUM)
&& (GET_CODE (XEXP (SET_SRC (set), 1)) == CONST
|| (GET_CODE (XEXP (SET_SRC (set), 1))
== SYMBOL_REF)
|| (GET_CODE (XEXP (SET_SRC (set), 1))
== LABEL_REF)))
|| ((note = find_reg_note (insn, REG_EQUAL, 0)) != 0
&& (GET_CODE (XEXP (note, 0)) == CONST
|| GET_CODE (XEXP (note, 0)) == SYMBOL_REF
|| GET_CODE (XEXP (note, 0)) == LABEL_REF))))
REGNO_POINTER_FLAG (REGNO (SET_DEST (set))) = 1;
for (i = 0; i < noperands; i++)
{
constraints[i]
@ -1572,17 +1522,18 @@ reg_scan (f, nregs, repeat)
if (GET_CODE (PATTERN (insn)) == PARALLEL
&& XVECLEN (PATTERN (insn), 0) > max_parallel)
max_parallel = XVECLEN (PATTERN (insn), 0);
reg_scan_mark_refs (PATTERN (insn), INSN_UID (insn));
reg_scan_mark_refs (PATTERN (insn), insn);
}
}
void
reg_scan_mark_refs (x, uid)
reg_scan_mark_refs (x, insn)
rtx x;
int uid;
rtx insn;
{
register enum rtx_code code = GET_CODE (x);
register rtx dest;
register rtx note;
switch (code)
{
@ -1601,9 +1552,9 @@ reg_scan_mark_refs (x, uid)
{
register int regno = REGNO (x);
regno_last_uid[regno] = uid;
regno_last_uid[regno] = INSN_UID (insn);
if (regno_first_uid[regno] == 0)
regno_first_uid[regno] = uid;
regno_first_uid[regno] = INSN_UID (insn);
}
break;
@ -1618,6 +1569,47 @@ reg_scan_mark_refs (x, uid)
if (GET_CODE (dest) == REG)
reg_n_sets[REGNO (dest)]++;
/* If this is setting a pseudo from another pseudo or the sum of a
pseudo and a constant integer and the other pseudo is known to be
a pointer, set the destination to be a pointer as well.
Likewise if it is setting the destination from an address or from a
value equivalent to an address or to the sum of an address and
something else.
But don't do any of this if the pseudo corresponds to a user
variable since it should have already been set as a pointer based
on the type. */
if (GET_CODE (SET_DEST (x)) == REG
&& REGNO (SET_DEST (x)) >= FIRST_PSEUDO_REGISTER
&& ! REG_USERVAR_P (SET_DEST (x))
&& ! REGNO_POINTER_FLAG (REGNO (SET_DEST (x)))
&& ((GET_CODE (SET_SRC (x)) == REG
&& REGNO_POINTER_FLAG (REGNO (SET_SRC (x))))
|| ((GET_CODE (SET_SRC (x)) == PLUS
|| GET_CODE (SET_SRC (x)) == LO_SUM)
&& GET_CODE (XEXP (SET_SRC (x), 1)) == CONST_INT
&& GET_CODE (XEXP (SET_SRC (x), 0)) == REG
&& REGNO_POINTER_FLAG (REGNO (XEXP (SET_SRC (x), 0))))
|| GET_CODE (SET_SRC (x)) == CONST
|| GET_CODE (SET_SRC (x)) == SYMBOL_REF
|| GET_CODE (SET_SRC (x)) == LABEL_REF
|| (GET_CODE (SET_SRC (x)) == HIGH
&& (GET_CODE (XEXP (SET_SRC (x), 0)) == CONST
|| GET_CODE (XEXP (SET_SRC (x), 0)) == SYMBOL_REF
|| GET_CODE (XEXP (SET_SRC (x), 0)) == LABEL_REF))
|| ((GET_CODE (SET_SRC (x)) == PLUS
|| GET_CODE (SET_SRC (x)) == LO_SUM)
&& (GET_CODE (XEXP (SET_SRC (x), 1)) == CONST
|| GET_CODE (XEXP (SET_SRC (x), 1)) == SYMBOL_REF
|| GET_CODE (XEXP (SET_SRC (x), 1)) == LABEL_REF))
|| ((note = find_reg_note (insn, REG_EQUAL, 0)) != 0
&& (GET_CODE (XEXP (note, 0)) == CONST
|| GET_CODE (XEXP (note, 0)) == SYMBOL_REF
|| GET_CODE (XEXP (note, 0)) == LABEL_REF))))
REGNO_POINTER_FLAG (REGNO (SET_DEST (x))) = 1;
/* ... fall through ... */
default:
@ -1627,12 +1619,12 @@ reg_scan_mark_refs (x, uid)
for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
{
if (fmt[i] == 'e')
reg_scan_mark_refs (XEXP (x, i), uid);
reg_scan_mark_refs (XEXP (x, i), insn);
else if (fmt[i] == 'E' && XVEC (x, i) != 0)
{
register int j;
for (j = XVECLEN (x, i) - 1; j >= 0; j--)
reg_scan_mark_refs (XVECEXP (x, i, j), uid);
reg_scan_mark_refs (XVECEXP (x, i, j), insn);
}
}
}