summaryrefslogtreecommitdiff
path: root/gcc/local-alloc.c
diff options
context:
space:
mode:
authordj <dj@138bc75d-0d04-0410-961f-82ee72b054a4>2001-11-15 03:02:24 +0000
committerdj <dj@138bc75d-0d04-0410-961f-82ee72b054a4>2001-11-15 03:02:24 +0000
commit66c6aab237d94ccf396515b35872e4c74ee39cd4 (patch)
treefc5ff2b3569ac8524c310ed350940c212918d81a /gcc/local-alloc.c
parent13f9ea8de2dfb691dd6ad8fc6c0e3d245b161cb4 (diff)
downloadgcc-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.c15
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.