integrate.c (get_hard_reg_initial_reg): New.

* 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.

From-SVN: r47037
This commit is contained in:
DJ Delorie 2001-11-14 22:02:24 -05:00 committed by DJ Delorie
parent 6345b6810a
commit 902197eb4f
4 changed files with 42 additions and 1 deletions

View file

@ -1,3 +1,10 @@
2001-11-14 DJ Delorie <dj@redhat.com>
* 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.
2001-11-14 Kaveh R. Ghazi <ghazi@caip.rutgers.edu>
* m68k/linux.h: Include <linux.h> not "linux.h" to avoid infinite

View file

@ -2963,6 +2963,24 @@ output_inline_function (fndecl)
/* Functions to keep track of the values hard regs had at the start of
the function. */
rtx
get_hard_reg_initial_reg (fun, reg)
struct function *fun;
rtx reg;
{
struct initial_value_struct *ivs = fun->hard_reg_initial_vals;
int i;
if (ivs == 0)
return NULL_RTX;
for (i = 0; i < ivs->num_entries; i++)
if (rtx_equal_p (ivs->entries[i].pseudo, reg))
return ivs->entries[i].hard_reg;
return NULL_RTX;
}
rtx
has_func_hard_reg_initial_val (fun, reg)
struct function *fun;

View file

@ -140,6 +140,9 @@ extern rtx get_func_hard_reg_initial_val PARAMS ((struct function *, rtx));
extern rtx has_func_hard_reg_initial_val PARAMS ((struct function *, rtx));
/* Likewise, but for common cases. */
extern rtx has_hard_reg_initial_val PARAMS ((enum machine_mode, int));
/* If a pseudo represents an initial hard reg (or expression), return
it, else return NULL_RTX. */
extern rtx get_hard_reg_initial_reg PARAMS ((struct function *, rtx));
/* This is for GC. */
extern void mark_hard_reg_initial_vals PARAMS ((struct function *));
/* Called from rest_of_compilation. */

View file

@ -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.