]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR rtl-optimization/13674 (ICE in reload_cse_simplify_operands, at postreload...
authorDavid Edelsohn <edelsohn@gnu.org>
Fri, 7 Jan 2005 15:30:13 +0000 (15:30 +0000)
committerDavid Edelsohn <dje@gcc.gnu.org>
Fri, 7 Jan 2005 15:30:13 +0000 (10:30 -0500)
PR target/13674
* config/rs6000/rs6000.c (rs6000_legitimize_reload_address):
Convert non-word aligned offset address using ld/std into
indirect address.

From-SVN: r93052

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

index 0f08d7eac1f934ede5fc047eb7ab513ebb32d3aa..aa0bbffcc3fabb2f274749a77d29355d4348b4e1 100644 (file)
@@ -1,3 +1,10 @@
+2005-01-07  David Edelsohn  <edelsohn@gnu.org>
+
+       PR target/13674
+       * config/rs6000/rs6000.c (rs6000_legitimize_reload_address):
+       Convert non-word aligned offset address using ld/std into
+       indirect address.
+
 2005-01-07  Richard Henderson  <rth@redhat.com>
 
        * config/i386/i386.md (sse_loadhps splitter): Fix operand number typo.
index bf340dcb28bdda07b2fde57d57d563436ea94c75..baf4a8e73687e4d38088fd6172007bd2b797d6c6 100644 (file)
@@ -3809,6 +3809,26 @@ rs6000_legitimize_reload_address (rtx x, enum machine_mode mode,
       return x;
     }
 #endif
+
+  /* Force ld/std non-word aligned offset into base register by wrapping
+     in offset 0.  */
+  if (GET_CODE (x) == PLUS
+      && GET_CODE (XEXP (x, 0)) == REG
+      && REGNO (XEXP (x, 0)) < 32
+      && REG_MODE_OK_FOR_BASE_P (XEXP (x, 0), mode)
+      && GET_CODE (XEXP (x, 1)) == CONST_INT
+      && (INTVAL (XEXP (x, 1)) & 3) != 0
+      && GET_MODE_SIZE (mode) >= UNITS_PER_WORD
+      && TARGET_POWERPC64)
+    {
+      x = gen_rtx_PLUS (GET_MODE (x), x, GEN_INT (0));
+      push_reload (XEXP (x, 0), NULL_RTX, &XEXP (x, 0), NULL,
+                  BASE_REG_CLASS, GET_MODE (x), VOIDmode, 0, 0,
+                  opnum, (enum reload_type) type);
+      *win = 1;
+      return x;
+    }
+
   if (GET_CODE (x) == PLUS
       && GET_CODE (XEXP (x, 0)) == REG
       && REGNO (XEXP (x, 0)) < FIRST_PSEUDO_REGISTER
@@ -3844,6 +3864,7 @@ rs6000_legitimize_reload_address (rtx x, enum machine_mode mode,
       *win = 1;
       return x;
     }
+
 #if TARGET_MACHO
   if (GET_CODE (x) == SYMBOL_REF
       && DEFAULT_ABI == ABI_DARWIN
@@ -3874,6 +3895,7 @@ rs6000_legitimize_reload_address (rtx x, enum machine_mode mode,
       return x;
     }
 #endif
+
   if (TARGET_TOC
       && constant_pool_expr_p (x)
       && ASM_OUTPUT_SPECIAL_POOL_ENTRY_P (get_pool_constant (x), mode))