re PR target/45820 (FAIL: gcc.c-torture/compile/pr45728.c at -O1 and above)
PR target/45820 * config/pa/pa.c (pa_secondary_reload): Handle symbolic operands earlier. From-SVN: r165128
This commit is contained in:
parent
14cca48176
commit
4435df995a
|
@ -1,3 +1,9 @@
|
|||
2010-10-07 John David Anglin <dave.anglin@nrc-cnrc.gc.ca>
|
||||
|
||||
PR target/45820
|
||||
* config/pa/pa.c (pa_secondary_reload): Handle symbolic operands
|
||||
earlier.
|
||||
|
||||
2010-10-01 Jakub Jelinek <jakub@redhat.com>
|
||||
|
||||
Backport from mainline
|
||||
|
|
|
@ -5699,7 +5699,7 @@ static enum reg_class
|
|||
pa_secondary_reload (bool in_p, rtx x, enum reg_class rclass,
|
||||
enum machine_mode mode, secondary_reload_info *sri)
|
||||
{
|
||||
int is_symbolic, regno;
|
||||
int regno;
|
||||
|
||||
/* Handle the easy stuff first. */
|
||||
if (rclass == R1_REGS)
|
||||
|
@ -5732,6 +5732,23 @@ pa_secondary_reload (bool in_p, rtx x, enum reg_class rclass,
|
|||
return NO_REGS;
|
||||
}
|
||||
|
||||
/* Secondary reloads of symbolic operands require %r1 as a scratch
|
||||
register when we're generating PIC code and when the operand isn't
|
||||
readonly. */
|
||||
if (symbolic_expression_p (x))
|
||||
{
|
||||
if (GET_CODE (x) == HIGH)
|
||||
x = XEXP (x, 0);
|
||||
|
||||
if (flag_pic || !read_only_operand (x, VOIDmode))
|
||||
{
|
||||
gcc_assert (mode == SImode || mode == DImode);
|
||||
sri->icode = (mode == SImode ? CODE_FOR_reload_insi_r1
|
||||
: CODE_FOR_reload_indi_r1);
|
||||
return NO_REGS;
|
||||
}
|
||||
}
|
||||
|
||||
/* Profiling showed the PA port spends about 1.3% of its compilation
|
||||
time in true_regnum from calls inside pa_secondary_reload_class. */
|
||||
if (regno >= FIRST_PSEUDO_REGISTER || GET_CODE (x) == SUBREG)
|
||||
|
@ -5790,48 +5807,7 @@ pa_secondary_reload (bool in_p, rtx x, enum reg_class rclass,
|
|||
if (regno >= 0 && regno < FIRST_PSEUDO_REGISTER
|
||||
&& (REGNO_REG_CLASS (regno) == SHIFT_REGS
|
||||
&& FP_REG_CLASS_P (rclass)))
|
||||
{
|
||||
sri->icode = in_p ? reload_in_optab[mode] : reload_out_optab[mode];
|
||||
return NO_REGS;
|
||||
}
|
||||
|
||||
/* Secondary reloads of symbolic operands require %r1 as a scratch
|
||||
register when we're generating PIC code and when the operand isn't
|
||||
readonly. */
|
||||
if (GET_CODE (x) == HIGH)
|
||||
x = XEXP (x, 0);
|
||||
|
||||
/* Profiling has showed GCC spends about 2.6% of its compilation
|
||||
time in symbolic_operand from calls inside pa_secondary_reload_class.
|
||||
So, we use an inline copy to avoid useless work. */
|
||||
switch (GET_CODE (x))
|
||||
{
|
||||
rtx op;
|
||||
|
||||
case SYMBOL_REF:
|
||||
is_symbolic = !SYMBOL_REF_TLS_MODEL (x);
|
||||
break;
|
||||
case LABEL_REF:
|
||||
is_symbolic = 1;
|
||||
break;
|
||||
case CONST:
|
||||
op = XEXP (x, 0);
|
||||
is_symbolic = (((GET_CODE (XEXP (op, 0)) == SYMBOL_REF
|
||||
&& !SYMBOL_REF_TLS_MODEL (XEXP (op, 0)))
|
||||
|| GET_CODE (XEXP (op, 0)) == LABEL_REF)
|
||||
&& GET_CODE (XEXP (op, 1)) == CONST_INT);
|
||||
break;
|
||||
default:
|
||||
is_symbolic = 0;
|
||||
break;
|
||||
}
|
||||
|
||||
if (is_symbolic && (flag_pic || !read_only_operand (x, VOIDmode)))
|
||||
{
|
||||
gcc_assert (mode == SImode || mode == DImode);
|
||||
sri->icode = (mode == SImode ? CODE_FOR_reload_insi_r1
|
||||
: CODE_FOR_reload_indi_r1);
|
||||
}
|
||||
sri->icode = in_p ? reload_in_optab[mode] : reload_out_optab[mode];
|
||||
|
||||
return NO_REGS;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue