re PR target/56214 (FAIL: gcc.c-torture/execute/20050121-1.c compilation, ICE)

PR target/56214
	* config/pa/predicates.md (base14_operand): Except for BLKmode, QImode
	and HImode, require all displacements to be an integer multiple of the
	mode size.
	* config/pa/pa.c (pa_legitimate_address_p): For REG+BASE addresses,
	only allow QImode and HImode when reload is in progress and strict is
	true.  Likewise for symbolic addresses.  Use base14_operand to check
	displacements in REG+BASE addresses.

From-SVN: r196122
This commit is contained in:
John David Anglin 2013-02-18 15:21:32 +00:00 committed by John David Anglin
parent fe0b4796ad
commit ceaca33e28
3 changed files with 24 additions and 30 deletions

View File

@ -1,3 +1,14 @@
2013-02-18 John David Anglin <dave.anglin@nrc-cnrc.ca>
PR target/56214
* config/pa/predicates.md (base14_operand): Except for BLKmode, QImode
and HImode, require all displacements to be an integer multiple of their
mode size.
* config/pa/pa.c (pa_legitimate_address_p): For REG+BASE addresses,
only allow QImode and HImode when reload is in progress and strict is
true. Likewise for symbolic addresses. Use base14_operand to check
displacements in REG+BASE addresses.
2013-02-18 Richard Biener <rguenther@suse.de>
PR tree-optimization/56366

View File

@ -10517,21 +10517,13 @@ pa_legitimate_address_p (enum machine_mode mode, rtx x, bool strict)
the majority of accesses will use floating point instructions
that don't support 14-bit offsets. */
if (!INT14_OK_STRICT
&& (GET_MODE_CLASS (mode) == MODE_FLOAT
|| (reload_in_progress
&& strict
&& (mode == SImode || mode == DImode))))
return false;
&& reload_in_progress
&& strict
&& mode != QImode
&& mode != HImode)
return false;
if (INT_14_BITS (index)
&& (mode == BLKmode
|| mode == QImode
|| mode == HImode
/* Displacement must be a multiple of its size. */
|| (INTVAL (index) % GET_MODE_SIZE (mode)) == 0))
return true;
return false;
return base14_operand (index, mode);
}
if (!TARGET_DISABLE_INDEXING
@ -10586,11 +10578,11 @@ pa_legitimate_address_p (enum machine_mode mode, rtx x, bool strict)
return true;
if (!INT14_OK_STRICT
&& (GET_MODE_CLASS (mode) == MODE_FLOAT
|| (reload_in_progress
&& strict
&& (mode == SImode || mode == DImode))))
return false;
&& reload_in_progress
&& strict
&& mode != QImode
&& mode != HImode)
return false;
if (CONSTANT_P (XEXP (x, 1)))
return true;

View File

@ -272,22 +272,13 @@
assumed in the instruction encoding. */
switch (mode)
{
case BLKmode:
case QImode:
case HImode:
return true;
case SImode:
case SFmode:
case SCmode:
return (INTVAL (op) % 4) == 0;
case DImode:
case DFmode:
case DCmode:
return (INTVAL (op) % 8) == 0;
default:
break;
return (INTVAL (op) % GET_MODE_SIZE (mode)) == 0;
}
return false;