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] i386 ICE fix


Hi!

The attached testcase ICEs because a split which requires Q_REGS
is done on %esi register.
This patch also removes :SI in the splitter above it, so that it matches
both SImode and HImode (that is tested in the condition).
Bootstrap pending, ok to commit if it succeeds and no regressions come up?

2000-07-20  Jakub Jelinek  <jakub@redhat.com>

	* config/i386/i386.md (andsi_1+1): Allow HImode.
	(andsi_1+2): Require q_regs_operand.

	* gcc.dg/20000720-1.c: New test.

--- gcc/config/i386/i386.md.jj	Thu Jul 20 09:27:20 2000
+++ gcc/config/i386/i386.md	Thu Jul 20 15:02:09 2000
@@ -5000,8 +5000,8 @@
   "operands[1] = gen_lowpart (HImode, operands[0]);")
 
 (define_split
-  [(set (match_operand:SI 0 "q_regs_operand" "")
-	(and:SI (match_dup 0)
+  [(set (match_operand 0 "q_regs_operand" "")
+	(and (match_dup 0)
 		(const_int -256)))
    (clobber (reg:CC 17))]
   "(optimize_size || !TARGET_PARTIAL_REG_STALL)
@@ -5010,7 +5010,7 @@
   "operands[1] = gen_lowpart (QImode, operands[0]);")
 
 (define_split
-  [(set (match_operand 0 "register_operand" "")
+  [(set (match_operand 0 "q_regs_operand" "")
 	(and (match_dup 0)
 	     (const_int -65281)))
    (clobber (reg:CC 17))]
--- gcc/testsuite/gcc.dg/20000720-1.c.jj	Thu Jul 20 15:04:43 2000
+++ gcc/testsuite/gcc.dg/20000720-1.c	Thu Jul 20 15:06:54 2000
@@ -0,0 +1,39 @@
+/* { dg-do compile { target i?86-*-* } } */
+/* { dg-options "-mpreferred-stack-boundary=2 -march=i586 -O2 -fomit-frame-pointer" } */
+
+extern void *foo(void *a, const void *b, unsigned c);
+
+extern inline void *
+bar(void *a, const void *b, unsigned c)
+{
+  int d0, d1, d2;
+  __asm__ __volatile__(
+    "" :
+    "=&c" (d0), "=&D" (d1), "=&S" (d2) :
+    "0" (c/4), "q" (c), "1" (a), "2" (b) :
+    "memory");
+  return a;
+}
+
+typedef struct {
+  unsigned char a;
+  unsigned b : 2;
+  unsigned c : 4;
+  unsigned d : 2;
+} *baz;
+
+static int
+dead(unsigned short *v, char *w, unsigned char *x, int y, int z)
+{
+  int i = 0;
+  unsigned short j = *v;
+
+  while (y > 0) {
+    ((baz)x)->a = j;
+    ((baz)x)->b = 0;
+    ((baz)x)->c = 0;
+    ((baz)x)->d = 0;
+    __builtin_constant_p(i) ? foo(x, w, i) : bar(x, w, i);
+  }
+  return z - y;
+}

	Jakub

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