re PR target/56214 (FAIL: gcc.c-torture/execute/20050121-1.c compilation, ICE)
authorJohn David Anglin <dave.anglin@nrc-cnrc.gc.ca>
Mon, 18 Feb 2013 15:21:32 +0000 (15:21 +0000)
committerJohn David Anglin <danglin@gcc.gnu.org>
Mon, 18 Feb 2013 15:21:32 +0000 (15:21 +0000)
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

gcc/ChangeLog
gcc/config/pa/pa.c
gcc/config/pa/predicates.md

index 0caa412055f0f848ece38f04ec7c4c399bd0f42e..4b53af801b00699805c35254fe771d21bbe93f77 100644 (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
index 36eba24d6234aa020140b01cd47b7f413f00f6e2..0d39483d908ec1250e97f6833891ac7e46da1886 100644 (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;
-
-         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;
+             && reload_in_progress
+             && strict
+             && mode != QImode
+             && mode != HImode)
+           return false;
 
-         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;
index 8823706026b70e51adc95bf0b1fee3cfc3b9adea..ba105f2e8ccdc62eed0089d36ed35f5d2a73d1c4 100644 (file)
      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;