re PR target/16298 (ICE in output_operand)

PR target/16298
        * config/i386/i386.c (legitimate_constant_p): Rework to not accept
        random codes within CONST.

From-SVN: r86522
This commit is contained in:
Richard Henderson 2004-08-24 14:45:59 -07:00 committed by Richard Henderson
parent c61225e74f
commit 1e19ac749d
2 changed files with 25 additions and 30 deletions

View File

@ -1,3 +1,9 @@
2004-08-24 Richard Henderson <rth@redhat.com>
PR target/16298
* config/i386/i386.c (legitimate_constant_p): Rework to not accept
random codes within CONST.
2004-08-24 James E Wilson <wilson@specifixinc.com>
* Makefile.in (STAGEFEEDBACK_FLAGS_TO_PASS): Remove

View File

@ -4824,54 +4824,43 @@ darwin_local_data_pic (rtx disp)
bool
legitimate_constant_p (rtx x)
{
rtx inner;
switch (GET_CODE (x))
{
case SYMBOL_REF:
/* TLS symbols are not constant. */
if (tls_symbolic_operand (x, Pmode))
return false;
break;
case CONST:
inner = XEXP (x, 0);
x = XEXP (x, 0);
/* Offsets of TLS symbols are never valid.
Discourage CSE from creating them. */
if (GET_CODE (inner) == PLUS
&& tls_symbolic_operand (XEXP (inner, 0), Pmode))
return false;
if (GET_CODE (inner) == PLUS)
if (GET_CODE (x) == PLUS)
{
if (GET_CODE (XEXP (inner, 1)) != CONST_INT)
if (GET_CODE (XEXP (x, 1)) != CONST_INT)
return false;
inner = XEXP (inner, 0);
x = XEXP (x, 0);
}
if (TARGET_MACHO && darwin_local_data_pic (inner))
if (TARGET_MACHO && darwin_local_data_pic (x))
return true;
if (GET_CODE (inner) == MINUS)
{
if (GET_CODE (XEXP (inner, 1)) != CONST_INT)
return false;
inner = XEXP (inner, 0);
}
/* Only some unspecs are valid as "constants". */
if (GET_CODE (inner) == UNSPEC)
switch (XINT (inner, 1))
if (GET_CODE (x) == UNSPEC)
switch (XINT (x, 1))
{
case UNSPEC_TPOFF:
case UNSPEC_NTPOFF:
return local_exec_symbolic_operand (XVECEXP (inner, 0, 0), Pmode);
return local_exec_symbolic_operand (XVECEXP (x, 0, 0), Pmode);
case UNSPEC_DTPOFF:
return local_dynamic_symbolic_operand (XVECEXP (inner, 0, 0), Pmode);
return local_dynamic_symbolic_operand (XVECEXP (x, 0, 0), Pmode);
default:
return false;
}
/* We must have drilled down to a symbol. */
if (!symbolic_operand (x, Pmode))
return false;
/* FALLTHRU */
case SYMBOL_REF:
/* TLS symbols are never valid. */
if (tls_symbolic_operand (x, Pmode))
return false;
break;
default: