diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index a15eb81ea562671c88eda5c42b649b8ba2159308..34b7610b6358c44fc8f48cc62232a38154fc7642 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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,
diff --git a/gcc/config/mips/mips.c b/gcc/config/mips/mips.c
index 03356671ddb6a4192abeb980aa4a0794112bfa8a..48c391590b95f11b2c4649a20e2ecf74c54b7dff 100644
--- a/gcc/config/mips/mips.c
+++ b/gcc/config/mips/mips.c
@@ -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.  */
diff --git a/gcc/recog.c b/gcc/recog.c
index 01bc1f3a373af1556e8d3d439eea51e80f15f0de..26ff03021898a4ffc0e62cbc5d0c4907122ef5e1 100644
--- a/gcc/recog.c
+++ b/gcc/recog.c
@@ -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.  */