This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[PATCH] i386 ICE fix
- To: rth at cygnus dot com, jh at suse dot cz
- Subject: [PATCH] i386 ICE fix
- From: Jakub Jelinek <jakub at redhat dot com>
- Date: Thu, 20 Jul 2000 15:45:28 +0200
- Cc: gcc-patches at gcc dot gnu dot org
- Reply-To: Jakub Jelinek <jakub at redhat dot com>
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