recog.c (offsettable_address_p): Handle LO_SUM case.
authorRichard Kenner <kenner@vlsi1.ultra.nyu.edu>
Tue, 10 Jul 2001 22:09:10 +0000 (22:09 +0000)
committerRichard Kenner <kenner@gcc.gnu.org>
Tue, 10 Jul 2001 22:09:10 +0000 (18:09 -0400)
* recog.c (offsettable_address_p): Handle LO_SUM case.
* config/mips/mips.c (double_memory_operand): Use adjust_address_nv
instead of plus_constant.

From-SVN: r43912

gcc/ChangeLog
gcc/config/mips/mips.c
gcc/recog.c

index a15eb81..34b7610 100644 (file)
@@ -1,3 +1,9 @@
+Tue Jul 10 07:27:53 2001  Richard Kenner  <kenner@vlsi1.ultra.nyu.edu>
+
+       * recog.c (offsettable_address_p): Handle LO_SUM case.
+       * config/mips/mips.c (double_memory_operand): Use adjust_address_nv
+       instead of plus_constant.
+       
 2001-07-10  Stephane Carrez  <Stephane.Carrez@worldnet.fr>
 
        * reload1.c (merge_assigned_reloads): After a RELOAD_OTHER merge,
index 0335667..48c3915 100644 (file)
@@ -838,8 +838,6 @@ double_memory_operand (op, mode)
      rtx op;
      enum machine_mode mode;
 {
-  rtx addr;
-
   if (GET_CODE (op) != MEM
       || ! memory_operand (op, mode))
     {
@@ -939,14 +937,12 @@ double_memory_operand (op, mode)
   /* Make sure that 4 added to the address is a valid memory address.
      This essentially just checks for overflow in an added constant.  */
 
-  addr = XEXP (op, 0);
-
-  if (CONSTANT_ADDRESS_P (addr))
+  if (CONSTANT_ADDRESS_P (XEXP (op, 0)))
     return 1;
 
-  return memory_address_p ((GET_MODE_CLASS (mode) == MODE_INT
-                           ? SImode : SFmode),
-                          plus_constant (addr, 4));
+  op = adjust_address_nv (op, GET_MODE_CLASS (mode) == MODE_INT
+                         ? SImode : SFmode, 4);
+  return memory_address_p (XEXP (op, 0));
 }
 
 /* Return nonzero if the code of this rtx pattern is EQ or NE.  */
index 01bc1f3..26ff030 100644 (file)
@@ -1963,9 +1963,13 @@ offsettable_address_p (strictp, mode, y)
   /* The offset added here is chosen as the maximum offset that
      any instruction could need to add when operating on something
      of the specified mode.  We assume that if Y and Y+c are
-     valid addresses then so is Y+d for all 0<d<c.  */
-
-  z = plus_constant (y, mode_sz - 1);
+     valid addresses then so is Y+d for all 0<d<c.  adjust_address will
+     go inside a LO_SUM here, so we do so as well.  */
+  if (GET_CODE (y) == LO_SUM)
+    z = gen_rtx_LO_SUM (GET_MODE (y), XEXP (y, 0),
+                       plus_constant (XEXP (y, 1), mode_sz - 1));
+  else
+    z = plus_constant (y, mode_sz - 1);
 
   /* Use QImode because an odd displacement may be automatically invalid
      for any wider mode.  But it should be valid for a single byte.  */