Commit fc1296b7 by Andrew MacLeod Committed by Andrew Macleod

regclass.c (call_really_used_regs): New array for registers which are actually used by a call.


2001-08-01  Andrew MacLeod  <amacleod@redhat.com>

	* regclass.c (call_really_used_regs): New array for registers which
	are actually used by a call.
	(init_reg_sets_1): Initialize regs_invalidated_by_call with the
	new array.
	(fix_register): Set call_really_used too.
	* config/ia64/ia64.h (CALL_REALLY_USED_REGISTERS): Initialize.
	* doc/tm.texi (CALL_REALLY_USED_REGISTERS): Document.

From-SVN: r44558
parent b38b083a
2001-08-01 Andrew MacLeod <amacleod@redhat.com>
* regclass.c (call_really_used_regs): New array for registers which
are actually used by a call.
(init_reg_sets_1): Initialize regs_invalidated_by_call with the
new array.
(fix_register): Set call_really_used too.
* config/ia64/ia64.h (CALL_REALLY_USED_REGISTERS): Initialize.
* doc/tm.texi (CALL_REALLY_USED_REGISTERS): Document.
2001-08-01 Richard Henderson <rth@redhat.com> 2001-08-01 Richard Henderson <rth@redhat.com>
* read-rtl.c (read_name): Consider \r whitespace. * read-rtl.c (read_name): Consider \r whitespace.
......
...@@ -633,6 +633,45 @@ while (0) ...@@ -633,6 +633,45 @@ while (0)
1, 1, 1, 1, 1, 0, 1 \ 1, 1, 1, 1, 1, 0, 1 \
} }
/* Like `CALL_USED_REGISTERS' but used to overcome a historical
problem which makes CALL_USED_REGISTERS *always* include
all the FIXED_REGISTERS. Until this problem has been
resolved this macro can be used to overcome this situation.
In particular, block_propagate() requires this list
be acurate, or we can remove registers which should be live.
This macro is used in regs_invalidated_by_call ()*/
#define CALL_REALLY_USED_REGISTERS \
{ /* General registers. */ \
1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, \
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, \
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \
0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, \
/* Floating-point registers. */ \
1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, \
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, \
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, \
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, \
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, \
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, \
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, \
/* Predicate registers. */ \
1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, \
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, \
/* Branch registers. */ \
1, 0, 0, 0, 0, 0, 1, 1, \
/*FP RA CCV UNAT PFS LC EC */ \
0, 0, 1, 1, 1, 0, 0 \
}
/* Define this macro if the target machine has register windows. This C /* Define this macro if the target machine has register windows. This C
expression returns the register number as seen by the called function expression returns the register number as seen by the called function
corresponding to the register number OUT as seen by the calling function. corresponding to the register number OUT as seen by the calling function.
......
...@@ -1700,6 +1700,17 @@ If a register has 0 in @code{CALL_USED_REGISTERS}, the compiler ...@@ -1700,6 +1700,17 @@ If a register has 0 in @code{CALL_USED_REGISTERS}, the compiler
automatically saves it on function entry and restores it on function automatically saves it on function entry and restores it on function
exit, if the register is used within the function. exit, if the register is used within the function.
@findex CALL_REALLY_USED_REGISTERS
@item CALL_REALLY_USED_REGISTERS
@cindex call-used register
@cindex call-clobbered register
@cindex call-saved register
Like @code{CALL_USED_REGISTERS} except this macro doesn't require
that the entire set of @code{FIXED_REGISTERS} be included.
(@code{CALL_USED_REGISTERS} must be a superset of @code{FIXED_REGISTERS}).
This macro is optional. If not specified, it defaults to the value
of @code{CALL_USED_REGISTERS}.
@findex HARD_REGNO_CALL_PART_CLOBBERED @findex HARD_REGNO_CALL_PART_CLOBBERED
@item HARD_REGNO_CALL_PART_CLOBBERED (@var{regno}, @var{mode}) @item HARD_REGNO_CALL_PART_CLOBBERED (@var{regno}, @var{mode})
@cindex call-used register @cindex call-used register
......
...@@ -94,6 +94,18 @@ HARD_REG_SET losing_caller_save_reg_set; ...@@ -94,6 +94,18 @@ HARD_REG_SET losing_caller_save_reg_set;
/* Data for initializing the above. */ /* Data for initializing the above. */
static char initial_call_used_regs[] = CALL_USED_REGISTERS; static char initial_call_used_regs[] = CALL_USED_REGISTERS;
/* This is much like call_used_regs, except it doesn't have to
be a superset of FIXED_REGISTERS. This vector indicates
what is really call clobbered, and is used when defining
regs_invalidated_by_call. */
char call_really_used_regs[] =
#ifdef CALL_REALLY_USED_REGISTERS
CALL_REALLY_USED_REGISTERS;
#else
CALL_USED_REGISTERS;
#endif
/* Indexed by hard register number, contains 1 for registers that are /* Indexed by hard register number, contains 1 for registers that are
fixed use or call used registers that cannot hold quantities across fixed use or call used registers that cannot hold quantities across
...@@ -464,7 +476,7 @@ init_reg_sets_1 () ...@@ -464,7 +476,7 @@ init_reg_sets_1 ()
else if (i == PIC_OFFSET_TABLE_REGNUM && flag_pic) else if (i == PIC_OFFSET_TABLE_REGNUM && flag_pic)
; ;
#endif #endif
else if (call_used_regs[i] || global_regs[i]) else if (call_really_used_regs[i] || global_regs[i])
SET_HARD_REG_BIT (regs_invalidated_by_call, i); SET_HARD_REG_BIT (regs_invalidated_by_call, i);
} }
...@@ -747,6 +759,8 @@ fix_register (name, fixed, call_used) ...@@ -747,6 +759,8 @@ fix_register (name, fixed, call_used)
{ {
fixed_regs[i] = fixed; fixed_regs[i] = fixed;
call_used_regs[i] = call_used; call_used_regs[i] = call_used;
if (fixed == 0)
call_really_used_regs[i] = call_used;
} }
} }
else else
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment