reload.c (push_secondary_reload): Revert last change.

* reload.c (push_secondary_reload): Revert last change.
        If we use a reload_in/out pattern, make the when the same
        as the primary reload.
        (find_reloads): Likewise.

From-SVN: r35746
This commit is contained in:
Richard Henderson 2000-08-16 09:53:02 -07:00 committed by Richard Henderson
parent d84c563442
commit 3198926404
2 changed files with 47 additions and 24 deletions

View File

@ -1,3 +1,10 @@
2000-08-16 Richard Henderson <rth@cygnus.com>
* reload.c (push_secondary_reload): Revert last change.
If we use a reload_in/out pattern, make the when the same
as the primary reload.
(find_reloads): Likewise.
2000-08-16 Manfred Hollstein <manfredh@redhat.com>
* configure.in (libstdcxx-v3): Fix test.

View File

@ -375,13 +375,13 @@ push_secondary_reload (in_p, x, opnum, optional, reload_class, reload_mode,
in operand 1. Outputs should have an initial "=", which we must
skip. */
char insn_letter, t_letter;
char insn_letter
= insn_data[(int) icode].operand[!in_p].constraint[in_p];
enum reg_class insn_class
= (insn_letter == 'r' ? GENERAL_REGS
: REG_CLASS_FROM_LETTER ((unsigned char) insn_letter));
insn_letter = insn_data[(int) icode].operand[!in_p].constraint[in_p];
class = (insn_letter == 'r' ? GENERAL_REGS
: REG_CLASS_FROM_LETTER ((unsigned char) insn_letter));
if (class == NO_REGS
if (insn_class == NO_REGS
|| (in_p
&& insn_data[(int) icode].operand[!in_p].constraint[0] != '=')
/* The scratch register's constraint must start with "=&". */
@ -389,12 +389,20 @@ push_secondary_reload (in_p, x, opnum, optional, reload_class, reload_mode,
|| insn_data[(int) icode].operand[2].constraint[1] != '&')
abort ();
t_letter = insn_data[(int) icode].operand[2].constraint[2];
t_mode = insn_data[(int) icode].operand[2].mode;
t_class = (t_letter == 'r' ? GENERAL_REGS
: REG_CLASS_FROM_LETTER ((unsigned char) t_letter));
t_icode = icode;
icode = CODE_FOR_nothing;
if (reg_class_subset_p (reload_class, insn_class))
mode = insn_data[(int) icode].operand[2].mode;
else
{
char t_letter = insn_data[(int) icode].operand[2].constraint[2];
class = insn_class;
t_mode = insn_data[(int) icode].operand[2].mode;
t_class = (t_letter == 'r' ? GENERAL_REGS
: REG_CLASS_FROM_LETTER ((unsigned char) t_letter));
t_icode = icode;
icode = CODE_FOR_nothing;
}
secondary_type = in_p ? RELOAD_FOR_INPUT : RELOAD_FOR_OUTPUT;
}
/* This case isn't valid, so fail. Reload is allowed to use the same
@ -404,14 +412,15 @@ push_secondary_reload (in_p, x, opnum, optional, reload_class, reload_mode,
silently generating incorrect code later.
The convention is that secondary input reloads are valid only if the
secondary class is different from the reload class. If you have such
a case, you can not use secondary reloads, you must work around the
problem some other way.
secondary_class is different from class. If you have such a case, you
can not use secondary reloads, you must work around the problem some
other way.
Allow this when a tertiary reload is used; i.e. assume that the
generated code handles this case. */
Allow this when MODE is not reload_mode and assume that the generated
code handles this case (it does on the Alpha, which is the only place
this currently happens). */
if (in_p && class == reload_class && t_class == NO_REGS)
if (in_p && class == reload_class && mode == reload_mode)
abort ();
/* If we need a tertiary reload, see if we have one we can reuse or else
@ -3909,8 +3918,11 @@ find_reloads (insn, replace, ind_levels, live_known, reload_reg_p)
for (i = 0; i < n_reloads; i++)
{
if (rld[i].secondary_p
&& rld[i].when_needed == operand_type[rld[i].opnum])
rld[i].when_needed = address_type[rld[i].opnum];
&& rld[i].when_needed == operand_type[rld[i].opnum]
&& (operand_reloadnum[rld[i].opnum] < 0
|| (rld[operand_reloadnum[rld[i].opnum]].secondary_in_icode == -1
&& rld[operand_reloadnum[rld[i].opnum]].secondary_out_icode == -1)))
rld[i].when_needed = address_type[rld[i].opnum];
if ((rld[i].when_needed == RELOAD_FOR_INPUT_ADDRESS
|| rld[i].when_needed == RELOAD_FOR_OUTPUT_ADDRESS
@ -3929,13 +3941,15 @@ find_reloads (insn, replace, ind_levels, live_known, reload_reg_p)
int secondary_in_reload = rld[i].secondary_in_reload;
rld[secondary_in_reload].when_needed
= RELOAD_FOR_OPADDR_ADDR;
= (rld[i].secondary_in_icode == -1
? RELOAD_FOR_OPADDR_ADDR
: RELOAD_FOR_OPERAND_ADDRESS);
/* If there's a tertiary reload we have to change it also. */
if (secondary_in_reload > 0
&& rld[secondary_in_reload].secondary_in_reload != -1)
rld[rld[secondary_in_reload].secondary_in_reload].when_needed
= RELOAD_FOR_OPADDR_ADDR;
= rld[secondary_in_reload].when_needed;
}
if ((rld[i].when_needed == RELOAD_FOR_OUTPUT_ADDRESS
@ -3945,13 +3959,15 @@ find_reloads (insn, replace, ind_levels, live_known, reload_reg_p)
int secondary_out_reload = rld[i].secondary_out_reload;
rld[secondary_out_reload].when_needed
= RELOAD_FOR_OPADDR_ADDR;
= (rld[i].secondary_out_icode == -1
? RELOAD_FOR_OPADDR_ADDR
: RELOAD_FOR_OPERAND_ADDRESS);
/* If there's a tertiary reload we have to change it also. */
if (secondary_out_reload
&& rld[secondary_out_reload].secondary_out_reload != -1)
rld[rld[secondary_out_reload].secondary_out_reload].when_needed
= RELOAD_FOR_OPADDR_ADDR;
= rld[secondary_out_reload].when_needed;
}
if (rld[i].when_needed == RELOAD_FOR_INPADDR_ADDRESS