diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index f6d95d3d98a433323e0dd2f8871620ec94214726..81d0b997c41400fa37a445bbbca48717fd66899a 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2004-12-31  Hans-Peter Nilsson  <hp@bitrange.com>
+
+	PR target/18701
+	* combine.c (gen_lowpart_for_combine): When stripping SUBREG of
+	MEM, adjust imode and isize.
+
 2004-12-30  Richard Henderson  <rth@redhat.com>
 
 	* config/ia64/ia64.c (hfa_element_mode): Return false for 
diff --git a/gcc/combine.c b/gcc/combine.c
index 800e65ea1006b6c4ad4ea5db3a8872a57d841d8a..61b93dd30489d2c7b34350e3bd607cb896d1b0bc 100644
--- a/gcc/combine.c
+++ b/gcc/combine.c
@@ -9355,8 +9355,16 @@ gen_lowpart_for_combine (enum machine_mode omode, rtx x)
   if (GET_CODE (x) == SUBREG && MEM_P (SUBREG_REG (x)))
     {
       x = SUBREG_REG (x);
-      if (GET_MODE (x) == omode)
+
+      /* For use in case we fall down into the address adjustments
+	 further below, we need to adjust the known mode and size of
+	 x; imode and isize, since we just adjusted x.  */
+      imode = GET_MODE (x);
+
+      if (imode == omode)
 	return x;
+
+      isize = GET_MODE_SIZE (imode);
     }
 
   result = gen_lowpart_common (omode, x);