This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[PATCH] Fix PR target/5740


Hi!

The following testcase ICEd on sparc -m64 at any opt
level, because emit_group_load for CONCAT tried to move from DFmode reg to
DImode reg (dst was (parallel:DC [(reg:DI) (reg:DI)]), src was
(parallel:DC [(reg:DF) (reg:DF)])).
Fixed by handling it the same way as non-CONCAT a few lines below.
Ok to commit?

2002-03-15  Jakub Jelinek  <jakub@redhat.com>

	PR target/5740
	* expr.c (emit_group_load): Use extract_bit_field if
	needed for CONCAT arguments.

--- gcc/testsuite/g++.dg/opt/conj1.C.jj	Fri Mar 15 21:45:13 2002
+++ gcc/testsuite/g++.dg/opt/conj1.C	Fri Mar 15 21:45:08 2002
@@ -0,0 +1,18 @@
+// PR target/5740
+// This testcase ICEd on SPARC -m64 because emit_group_load tried
+// to move a DFmode register into DImode register directly.
+// { dg-do compile }
+// { dg-options "-O2" }
+
+struct C
+{
+  C (double y, double z) { __real__ x = y; __imag__ x = z; }
+  double r () const { return __real__ x; }
+  double i () const { return __imag__ x; }
+  __complex__ double x;
+};
+
+C conj (const C& z)
+{
+  return C (z.r (), -z.i ());
+}
--- gcc/expr.c.jj	Thu Mar 14 16:26:11 2002
+++ gcc/expr.c	Fri Mar 15 21:39:58 2002
@@ -2004,12 +2004,17 @@ emit_group_load (dst, orig_src, ssize)
 	}
       else if (GET_CODE (src) == CONCAT)
 	{
-	  if (bytepos == 0
-	      && bytelen == GET_MODE_SIZE (GET_MODE (XEXP (src, 0))))
-	    tmps[i] = XEXP (src, 0);
-	  else if (bytepos == (HOST_WIDE_INT) GET_MODE_SIZE (GET_MODE (XEXP (src, 0)))
-		   && bytelen == GET_MODE_SIZE (GET_MODE (XEXP (src, 1))))
-	    tmps[i] = XEXP (src, 1);
+	  if ((bytepos == 0
+	       && bytelen == GET_MODE_SIZE (GET_MODE (XEXP (src, 0))))
+	      || (bytepos == (HOST_WIDE_INT) GET_MODE_SIZE (GET_MODE (XEXP (src, 0)))
+		  && bytelen == GET_MODE_SIZE (GET_MODE (XEXP (src, 1)))))
+	    {
+	      tmps[i] = XEXP (src, bytepos != 0);
+	      if (! CONSTANT_P (tmps[i])
+		  && (GET_CODE (tmps[i]) != REG || GET_MODE (tmps[i]) != mode))
+		tmps[i] = extract_bit_field (tmps[i], bytelen * BITS_PER_UNIT,
+					     0, 1, NULL_RTX, mode, mode, ssize);
+	    }
 	  else if (bytepos == 0)
 	    {
 	      rtx mem = assign_stack_temp (GET_MODE (src),

	Jakub


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]