Commit f5470689 by J"orn Rennecke Committed by Joern Rennecke

reload1.c (reload_reg_free_for_value_p): New arguments out and reloadnum.

	* reload1.c (reload_reg_free_for_value_p): New arguments out and
	reloadnum.  Changed all callers.

From-SVN: r20210
parent 9b91d8f4
Wed Jun 3 20:00:04 1998 J"orn Rennecke <amylaar@cygnus.co.uk>
* reload1.c (reload_reg_free_for_value_p): New arguments out and
reloadnum. Changed all callers.
1998-06-03 Ulrich Drepper <drepper@cygnus.com> 1998-06-03 Ulrich Drepper <drepper@cygnus.com>
* system.h: Add _() and N_() macros in preparation for gettext. * system.h: Add _() and N_() macros in preparation for gettext.
......
...@@ -378,7 +378,7 @@ static void clear_reload_reg_in_use PROTO((int, int, enum reload_type, ...@@ -378,7 +378,7 @@ static void clear_reload_reg_in_use PROTO((int, int, enum reload_type,
enum machine_mode)); enum machine_mode));
static int reload_reg_free_p PROTO((int, int, enum reload_type)); static int reload_reg_free_p PROTO((int, int, enum reload_type));
static int reload_reg_free_before_p PROTO((int, int, enum reload_type)); static int reload_reg_free_before_p PROTO((int, int, enum reload_type));
static int reload_reg_free_for_value_p PROTO((int, int, enum reload_type, rtx)); static int reload_reg_free_for_value_p PROTO((int, int, enum reload_type, rtx, rtx, int));
static int reload_reg_reaches_end_p PROTO((int, int, enum reload_type)); static int reload_reg_reaches_end_p PROTO((int, int, enum reload_type));
static int allocate_reload_reg PROTO((int, rtx, int, int)); static int allocate_reload_reg PROTO((int, rtx, int, int));
static void choose_reload_regs PROTO((rtx, rtx)); static void choose_reload_regs PROTO((rtx, rtx));
...@@ -4983,15 +4983,23 @@ int reload_spill_index[MAX_RELOADS]; ...@@ -4983,15 +4983,23 @@ int reload_spill_index[MAX_RELOADS];
/* Return 1 if the value in reload reg REGNO, as used by a reload /* Return 1 if the value in reload reg REGNO, as used by a reload
needed for the part of the insn specified by OPNUM and TYPE, needed for the part of the insn specified by OPNUM and TYPE,
may be used to load VALUE into it. may be used to load VALUE into it.
Other read-only reloads with the same value do not conflict.
Other read-only reloads with the same value do not conflict
unless OUT is non-zero and these other reloads have to live while
output reloads live.
RELOADNUM is the number of the reload we want to load this value for;
a reload does not conflict with itself.
The caller has to make sure that there is no conflict with the return The caller has to make sure that there is no conflict with the return
register. */ register. */
static int static int
reload_reg_free_for_value_p (regno, opnum, type, value) reload_reg_free_for_value_p (regno, opnum, type, value, out, reloadnum)
int regno; int regno;
int opnum; int opnum;
enum reload_type type; enum reload_type type;
rtx value; rtx value, out;
int reloadnum;
{ {
int time1; int time1;
int i; int i;
...@@ -5048,39 +5056,53 @@ reload_reg_free_for_value_p (regno, opnum, type, value) ...@@ -5048,39 +5056,53 @@ reload_reg_free_for_value_p (regno, opnum, type, value)
if (reg && GET_CODE (reg) == REG if (reg && GET_CODE (reg) == REG
&& ((unsigned) regno - true_regnum (reg) && ((unsigned) regno - true_regnum (reg)
<= HARD_REGNO_NREGS (REGNO (reg), GET_MODE (reg)) - 1U) <= HARD_REGNO_NREGS (REGNO (reg), GET_MODE (reg)) - 1U)
&& (! reload_in[i] || ! rtx_equal_p (reload_in[i], value) && i != reloadnum)
|| reload_out[i]))
{ {
int time2; if (out
switch (reload_when_needed[i]) && reload_when_needed[i] != RELOAD_FOR_INPUT
&& reload_when_needed[i] != RELOAD_FOR_INPUT_ADDRESS
&& reload_when_needed[i] != RELOAD_FOR_INPADDR_ADDRESS)
return 0;
if (! reload_in[i] || ! rtx_equal_p (reload_in[i], value)
|| reload_out[i])
{ {
case RELOAD_FOR_OTHER_ADDRESS: int time2;
time2 = 0; switch (reload_when_needed[i])
break; {
case RELOAD_FOR_INPADDR_ADDRESS: case RELOAD_FOR_OTHER_ADDRESS:
time2 = reload_opnum[i] * 4 + 1; time2 = 0;
break; break;
case RELOAD_FOR_INPUT_ADDRESS: case RELOAD_FOR_INPADDR_ADDRESS:
time2 = reload_opnum[i] * 4 + 2; time2 = reload_opnum[i] * 4 + 1;
break; break;
case RELOAD_FOR_INPUT: case RELOAD_FOR_INPUT_ADDRESS:
time2 = reload_opnum[i] * 4 + 3; time2 = reload_opnum[i] * 4 + 2;
break; break;
case RELOAD_FOR_OUTPUT: case RELOAD_FOR_INPUT:
/* All RELOAD_FOR_OUTPUT reloads become live just after the time2 = reload_opnum[i] * 4 + 3;
instruction is executed. */ break;
time2 = MAX_RECOG_OPERANDS * 4; case RELOAD_FOR_OUTPUT:
break; /* All RELOAD_FOR_OUTPUT reloads become live just after the
/* The first RELOAD_FOR_OUTPUT_ADDRESS reload conflicts with the instruction is executed. */
RELOAD_FOR_OUTPUT reloads, so assign it the same time value. */ time2 = MAX_RECOG_OPERANDS * 4;
case RELOAD_FOR_OUTPUT_ADDRESS: break;
time2 = MAX_RECOG_OPERANDS * 4 + reload_opnum[i]; /* The first RELOAD_FOR_OUTPUT_ADDRESS reload conflicts with the
break; RELOAD_FOR_OUTPUT reloads, so assign it the same time value. */
default: case RELOAD_FOR_OUTPUT_ADDRESS:
time2 = 0; time2 = MAX_RECOG_OPERANDS * 4 + reload_opnum[i];
break;
case RELOAD_OTHER:
if (! reload_in[i] || rtx_equal_p (reload_in[i], value))
{
time2 = MAX_RECOG_OPERANDS * 4;
break;
}
default:
time2 = 0;
}
if (time1 >= time2)
return 0;
} }
if (time1 >= time2)
return 0;
} }
} }
return 1; return 1;
...@@ -5160,14 +5182,15 @@ allocate_reload_reg (r, insn, last_reload, noerror) ...@@ -5160,14 +5182,15 @@ allocate_reload_reg (r, insn, last_reload, noerror)
if ((reload_reg_free_p (spill_regs[i], reload_opnum[r], if ((reload_reg_free_p (spill_regs[i], reload_opnum[r],
reload_when_needed[r]) reload_when_needed[r])
|| (reload_in[r] && ! reload_out[r] || (reload_in[r]
/* We check reload_reg_used to make sure we /* We check reload_reg_used to make sure we
don't clobber the return register. */ don't clobber the return register. */
&& ! TEST_HARD_REG_BIT (reload_reg_used, spill_regs[i]) && ! TEST_HARD_REG_BIT (reload_reg_used, spill_regs[i])
&& reload_reg_free_for_value_p (spill_regs[i], && reload_reg_free_for_value_p (spill_regs[i],
reload_opnum[r], reload_opnum[r],
reload_when_needed[r], reload_when_needed[r],
reload_in[r]))) reload_in[r],
reload_out[r], r)))
&& TEST_HARD_REG_BIT (reg_class_contents[class], spill_regs[i]) && TEST_HARD_REG_BIT (reg_class_contents[class], spill_regs[i])
&& HARD_REGNO_MODE_OK (spill_regs[i], reload_mode[r]) && HARD_REGNO_MODE_OK (spill_regs[i], reload_mode[r])
/* Look first for regs to share, then for unshared. But /* Look first for regs to share, then for unshared. But
...@@ -5634,7 +5657,8 @@ choose_reload_regs (insn, avoid_return_reg) ...@@ -5634,7 +5657,8 @@ choose_reload_regs (insn, avoid_return_reg)
reload_when_needed[r])) reload_when_needed[r]))
|| reload_reg_free_for_value_p (i, reload_opnum[r], || reload_reg_free_for_value_p (i, reload_opnum[r],
reload_when_needed[r], reload_when_needed[r],
reload_in[r]))) reload_in[r],
reload_out[r], r)))
{ {
/* If a group is needed, verify that all the subsequent /* If a group is needed, verify that all the subsequent
registers still have their values intact. */ registers still have their values intact. */
...@@ -5741,7 +5765,8 @@ choose_reload_regs (insn, avoid_return_reg) ...@@ -5741,7 +5765,8 @@ choose_reload_regs (insn, avoid_return_reg)
|| reload_reg_free_for_value_p (regno, || reload_reg_free_for_value_p (regno,
reload_opnum[r], reload_opnum[r],
reload_when_needed[r], reload_when_needed[r],
reload_in[r]))) reload_in[r],
reload_out[r], r)))
|| ! TEST_HARD_REG_BIT (reg_class_contents[(int) reload_reg_class[r]], || ! TEST_HARD_REG_BIT (reg_class_contents[(int) reload_reg_class[r]],
regno))) regno)))
equiv = 0; equiv = 0;
...@@ -5924,7 +5949,8 @@ choose_reload_regs (insn, avoid_return_reg) ...@@ -5924,7 +5949,8 @@ choose_reload_regs (insn, avoid_return_reg)
|| reload_reg_free_for_value_p (true_regnum (reload_reg_rtx[r]), || reload_reg_free_for_value_p (true_regnum (reload_reg_rtx[r]),
reload_opnum[r], reload_opnum[r],
reload_when_needed[r], reload_when_needed[r],
reload_in[r]))) reload_in[r],
reload_out[r], r)))
reload_inherited[r] = 0; reload_inherited[r] = 0;
/* If we can inherit a RELOAD_FOR_INPUT, then we do not need its related /* If we can inherit a RELOAD_FOR_INPUT, then we do not need its related
RELOAD_FOR_INPUT_ADDRESS / RELOAD_FOR_INPADDR_ADDRESS reloads. RELOAD_FOR_INPUT_ADDRESS / RELOAD_FOR_INPADDR_ADDRESS reloads.
......
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