diff options
author | Richard Kenner <kenner@gcc.gnu.org> | 1993-03-02 18:59:33 -0500 |
---|---|---|
committer | Richard Kenner <kenner@gcc.gnu.org> | 1993-03-02 18:59:33 -0500 |
commit | be8dcd745fe101829bcdb446ec3ac45fe8da13ae (patch) | |
tree | f513a311a9d499601d38eac8f4aeed3e7b27037d /gcc | |
parent | 78c02237e257cb8b6f92c92add5166a807f6d375 (diff) | |
download | gcc-be8dcd745fe101829bcdb446ec3ac45fe8da13ae.zip gcc-be8dcd745fe101829bcdb446ec3ac45fe8da13ae.tar.gz gcc-be8dcd745fe101829bcdb446ec3ac45fe8da13ae.tar.bz2 |
(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
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/regclass.c | 106 |
1 files changed, 49 insertions, 57 deletions
diff --git a/gcc/regclass.c b/gcc/regclass.c index 80d008a..7c5a256 100644 --- a/gcc/regclass.c +++ b/gcc/regclass.c @@ -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); } } } |