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]

[PATCH] Fix SPARC movdf ICE


Hi!

The following testcase ICEs on SPARC at -O2. The problem is that SPARC
movdf_* insns allow '*r' <- '*rFo' constraints, but when reload does
anything with it and in turn calls gen_movdf, we ICE because it cannot be
validized any more, although sparc.md has splitters which will build the
constant in general registers and won't need the DF constant in memory.
Commited.

2001-11-09  Jakub Jelinek  <jakub@redhat.com>

	* config/sparc/sparc.md (movdf): Avoid calling validize_mem during
	or after reload.

	* gcc.c-torture/compile/20011109-1.c: New test.

--- gcc/config/sparc/sparc.md.jj	Wed Oct 24 21:25:07 2001
+++ gcc/config/sparc/sparc.md	Fri Nov  9 15:28:04 2001
@@ -3255,6 +3255,11 @@
 	  && fp_zero_operand (operands[1], DFmode))
 	goto movdf_is_ok;
 
+      /* We are able to build any DF constant in integer registers.  */
+      if (REGNO (operands[0]) < 32
+	  && (reload_completed || reload_in_progress))
+	goto movdf_is_ok;
+
       operands[1] = validize_mem (force_const_mem (GET_MODE (operands[0]),
                                                    operands[1]));
     }
--- gcc/testsuite/gcc.c-torture/compile/20011109-1.c.jj	Fri Nov  9 15:15:34 2001
+++ gcc/testsuite/gcc.c-torture/compile/20011109-1.c	Fri Nov  9 15:12:42 2001
@@ -0,0 +1,51 @@
+typedef struct { short x[4]; } S;
+typedef struct { unsigned int a, b, c; S *d; } T;
+
+S *(*foo) (T *, int, int, int, int);
+unsigned short *(*bar)(const T *);
+unsigned short baz(T *,const int);
+
+T *die (void)
+{
+  typedef struct { unsigned int a, b, e; double f, g; } U;
+
+  char h[8], i[2053], j[2053];
+  double k, l, m;
+  U n;
+  T *o;
+  unsigned short p;
+  int q, r;
+  long s;
+  unsigned short *t;
+  S *u;
+  unsigned char *v, *w;
+  unsigned int x;
+
+  o = 0;
+  for (x = 0; x < n.e; x++)
+    {
+      l = 1.0;
+      if (n.g - n.f <= 1.0)
+	l = ((1 << o->c) - 1) / (n.g - n.f);
+      v = w;
+      for (r = o->b - 1; r >= 0; r--)
+	{
+	  u = foo (o, 0, r, o->a, 1);
+	  if (!u)
+	    break;
+	  t = bar (o);
+	  for (q = 0; q < (int) o->a; q++)
+	    {
+	      h[0] = *v;
+	      s = *v++;
+	      k = (double) s;
+	      m = l*k;
+	      p = m < 0 ? 0 : m > (1 << o->c) - 1 ? (1 << o->c) - 1 : m + 0.5;
+	      p = baz (o,p);
+	      t[q] = p;
+	      *u++ = o->d[p];
+	    }
+	}
+    }
+  return o;
+}

	Jakub


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