diff options
author | dj <dj@138bc75d-0d04-0410-961f-82ee72b054a4> | 2001-11-15 03:02:24 +0000 |
---|---|---|
committer | dj <dj@138bc75d-0d04-0410-961f-82ee72b054a4> | 2001-11-15 03:02:24 +0000 |
commit | 66c6aab237d94ccf396515b35872e4c74ee39cd4 (patch) | |
tree | fc5ff2b3569ac8524c310ed350940c212918d81a /gcc/local-alloc.c | |
parent | 13f9ea8de2dfb691dd6ad8fc6c0e3d245b161cb4 (diff) | |
download | gcc-66c6aab237d94ccf396515b35872e4c74ee39cd4.tar.gz |
* integrate.c (get_hard_reg_initial_reg): New.
* integrate.h (get_hard_reg_initial_reg): Prototype.
* local-alloc.c (block_alloc): Don't tie pseudos that
represent call-saved hard regs' initial values.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@47037 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/local-alloc.c')
-rw-r--r-- | gcc/local-alloc.c | 15 |
1 files changed, 14 insertions, 1 deletions
diff --git a/gcc/local-alloc.c b/gcc/local-alloc.c index 7de721e8f09..1c45ae4f069 100644 --- a/gcc/local-alloc.c +++ b/gcc/local-alloc.c @@ -74,6 +74,7 @@ Software Foundation, 59 Temple Place - Suite 330, Boston, MA #include "output.h" #include "toplev.h" #include "except.h" +#include "integrate.h" /* Next quantity number available for allocation. */ @@ -1216,7 +1217,7 @@ block_alloc (b) { int i, q; rtx insn; - rtx note; + rtx note, hard_reg; int insn_number = 0; int insn_count = 0; int max_uid = get_max_uid (); @@ -1340,6 +1341,18 @@ block_alloc (b) while (GET_CODE (r1) == PLUS || GET_CODE (r1) == MULT) r1 = XEXP (r1, 0); + /* Avoid making a call-saved register unnecessarily + clobbered. */ + hard_reg = get_hard_reg_initial_reg (cfun, r1); + if (hard_reg != NULL_RTX) + { + if (GET_CODE (hard_reg) == REG + && REGNO (hard_reg) >= 0 + && REGNO (hard_reg) < FIRST_PSEUDO_REGISTER + && ! call_used_regs[REGNO (hard_reg)]) + continue; + } + if (GET_CODE (r0) == REG || GET_CODE (r0) == SUBREG) { /* We have two priorities for hard register preferences. |