From 4caab5ba578a8aba8b704d0ce052de812cda1d9b Mon Sep 17 00:00:00 2001
From: Ulrich Weigand <uweigand@de.ibm.com>
Date: Thu, 12 Mar 2009 14:00:21 +0000
Subject: [PATCH] re PR target/39181 (complex int arguments cause ICE)

	PR target/39181
	* config/spu/spu.c (spu_expand_mov): Handle invalid subregs
	of non-integer mode as well.

From-SVN: r144811
---
 gcc/ChangeLog        | 6 ++++++
 gcc/config/spu/spu.c | 9 ++++-----
 2 files changed, 10 insertions(+), 5 deletions(-)

diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 45380b9acb48..79aff5dd9e48 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2009-03-11  Ulrich Weigand  <Ulrich.Weigand@de.ibm.com>
+
+	PR target/39181
+	* config/spu/spu.c (spu_expand_mov): Handle invalid subregs
+	of non-integer mode as well.
+
 2009-03-11  Adam Nemet  <anemet@caviumnetworks.com>
 
 	* gimplify.c (gimplify_call_expr): Don't set CALL_CANNOT_INLINE_P
diff --git a/gcc/config/spu/spu.c b/gcc/config/spu/spu.c
index c2fbb331b0a1..6e0001b0a05a 100644
--- a/gcc/config/spu/spu.c
+++ b/gcc/config/spu/spu.c
@@ -4114,17 +4114,16 @@ spu_expand_mov (rtx * ops, enum machine_mode mode)
   if (GET_CODE (ops[1]) == SUBREG && !valid_subreg (ops[1]))
     {
       rtx from = SUBREG_REG (ops[1]);
-      enum machine_mode imode = GET_MODE (from);
+      enum machine_mode imode = int_mode_for_mode (GET_MODE (from));
 
       gcc_assert (GET_MODE_CLASS (mode) == MODE_INT
 		  && GET_MODE_CLASS (imode) == MODE_INT
 		  && subreg_lowpart_p (ops[1]));
 
       if (GET_MODE_SIZE (imode) < 4)
-	{
-	  from = gen_rtx_SUBREG (SImode, from, 0);
-	  imode = SImode;
-	}
+	imode = SImode;
+      if (imode != GET_MODE (from))
+	from = gen_rtx_SUBREG (imode, from, 0);
 
       if (GET_MODE_SIZE (mode) < GET_MODE_SIZE (imode))
 	{
-- 
GitLab