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:
parent
6345b6810a
commit
902197eb4f
4 changed files with 42 additions and 1 deletions
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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. */
|
||||
|
|
|
@ -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.
|
||||
|
|
Loading…
Add table
Reference in a new issue