From 32f2ce029997a7d1d4be975ddafd7dcf6574d49c Mon Sep 17 00:00:00 2001
From: Hans-Peter Nilsson <hp@bitrange.com>
Date: Fri, 31 Dec 2004 16:24:48 +0000
Subject: [PATCH] re PR target/18701 (mmix-knuth-mmixware gcc.c-torture/execute
 failures: 20010224-1.c, 20020216-1.c, 20040218-1.c, 20040709-2.c)

	PR target/18701
	* combine.c (gen_lowpart_for_combine): When stripping SUBREG of
	MEM, adjust imode and isize.

From-SVN: r92760
---
 gcc/ChangeLog |  6 ++++++
 gcc/combine.c | 10 +++++++++-
 2 files changed, 15 insertions(+), 1 deletion(-)

diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index f6d95d3d98a4..81d0b997c414 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 800e65ea1006..61b93dd30489 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);
-- 
GitLab