]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR target/54093 (ICE in in extract_insn, at recog.c:2129)
authorAlan Modra <amodra@gmail.com>
Sat, 28 Jul 2012 00:04:10 +0000 (09:34 +0930)
committerAlan Modra <amodra@gcc.gnu.org>
Sat, 28 Jul 2012 00:04:10 +0000 (09:34 +0930)
PR target/54093
* config/rs6000/rs6000.c (rs6000_secondary_reload): Limit 32-bit
multi-gpr reload to cases where predicate passes.  Do the same for
64-bit multi-gpr reload.

From-SVN: r189921

gcc/ChangeLog
gcc/config/rs6000/rs6000.c

index bbff917e356917be1e502088b655a6f15e305987..ca2d9419c9661b0449212498e937b03ad0d9fb99 100644 (file)
@@ -1,3 +1,10 @@
+2012-07-28  Alan Modra  <amodra@gmail.com>
+
+       PR target/54093
+       * config/rs6000/rs6000.c (rs6000_secondary_reload): Limit 32-bit
+       multi-gpr reload to cases where predicate passes.  Do the same for
+       64-bit multi-gpr reload.
+
 2012-07-27  Nathan Froyd  <froydnj@gcc.gnu.org>
 
        * expmed.h (alg_hash, alg_hash_used_p, sdiv_pow2_cheap,
index ef7d46fe3823ddcee9386444d356dca22c562271..7bb9840317852fecb1f480b8f02b177a9a7aa55a 100644 (file)
@@ -13582,8 +13582,11 @@ rs6000_secondary_reload (bool in_p,
           && GET_MODE_SIZE (GET_MODE (x)) >= UNITS_PER_WORD)
     {
       rtx off = address_offset (XEXP (x, 0));
+      unsigned int extra = GET_MODE_SIZE (GET_MODE (x)) - UNITS_PER_WORD;
 
-      if (off != NULL_RTX && (INTVAL (off) & 3) != 0)
+      if (off != NULL_RTX
+         && (INTVAL (off) & 3) != 0
+         && (unsigned HOST_WIDE_INT) INTVAL (off) + 0x8000 < 0x10000 - extra)
        {
          if (in_p)
            sri->icode = CODE_FOR_reload_di_load;
@@ -13601,10 +13604,17 @@ rs6000_secondary_reload (bool in_p,
           && GET_MODE_SIZE (GET_MODE (x)) > UNITS_PER_WORD)
     {
       rtx off = address_offset (XEXP (x, 0));
-
+      unsigned int extra = GET_MODE_SIZE (GET_MODE (x)) - UNITS_PER_WORD;
+
+      /* We need a secondary reload only when our legitimate_address_p
+        says the address is good (as otherwise the entire address
+        will be reloaded).  So for mode sizes of 8 and 16 this will
+        be when the offset is in the ranges [0x7ffc,0x7fff] and
+        [0x7ff4,0x7ff7] respectively.  Note that the address we see
+        here may have been manipulated by legitimize_reload_address.  */
       if (off != NULL_RTX
-         && ((unsigned HOST_WIDE_INT) INTVAL (off) + 0x8000
-             >= 0x1000u - (GET_MODE_SIZE (GET_MODE (x)) - UNITS_PER_WORD)))
+         && ((unsigned HOST_WIDE_INT) INTVAL (off) - (0x8000 - extra)
+             < UNITS_PER_WORD))
        {
          if (in_p)
            sri->icode = CODE_FOR_reload_si_load;