re PR rtl-optimization/64316 (ICE in simplify_const_unary_operation after r218503)
authorJakub Jelinek <jakub@redhat.com>
Mon, 15 Dec 2014 20:10:45 +0000 (21:10 +0100)
committerJakub Jelinek <jakub@gcc.gnu.org>
Mon, 15 Dec 2014 20:10:45 +0000 (21:10 +0100)
PR rtl-optimization/64316
* simplify-rtx.c (simplify_relational_operation_1): For
(eq/ne (and x y) x) and (eq/ne (and x y) y) optimizations use
CONST0_RTX instead of const0_rtx.

* gcc.dg/pr64316.c: New test.

From-SVN: r218762

gcc/ChangeLog
gcc/simplify-rtx.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/pr64316.c [new file with mode: 0644]

index 87ee0f9f47574388f4cb839987fc042f1b414456..07aa48c4ba5dc11dd382e1f3510d46edbb5ec4b0 100644 (file)
@@ -1,3 +1,10 @@
+2014-12-15  Jakub Jelinek  <jakub@redhat.com>
+
+       PR rtl-optimization/64316
+       * simplify-rtx.c (simplify_relational_operation_1): For
+       (eq/ne (and x y) x) and (eq/ne (and x y) y) optimizations use
+       CONST0_RTX instead of const0_rtx.
+
 2014-12-15  Vladimir Makarov  <vmakarov@redhat.com>
 
        PR target/62642
index 8ec416e9cc0f0887d93b18f04f23c19facfc87b5..277288a512c593b76ab9d67f91661cc209ddc7cc 100644 (file)
@@ -4561,7 +4561,8 @@ simplify_relational_operation_1 (enum rtx_code code, machine_mode mode,
       rtx not_y = simplify_gen_unary (NOT, cmp_mode, XEXP (op0, 1), cmp_mode);
       rtx lhs = simplify_gen_binary (AND, cmp_mode, not_y, XEXP (op0, 0));
 
-      return simplify_gen_relational (code, mode, cmp_mode, lhs, const0_rtx);
+      return simplify_gen_relational (code, mode, cmp_mode, lhs,
+                                     CONST0_RTX (cmp_mode));
     }
 
   /* Likewise for (eq/ne (and x y) y).  */
@@ -4573,7 +4574,8 @@ simplify_relational_operation_1 (enum rtx_code code, machine_mode mode,
       rtx not_x = simplify_gen_unary (NOT, cmp_mode, XEXP (op0, 0), cmp_mode);
       rtx lhs = simplify_gen_binary (AND, cmp_mode, not_x, XEXP (op0, 1));
 
-      return simplify_gen_relational (code, mode, cmp_mode, lhs, const0_rtx);
+      return simplify_gen_relational (code, mode, cmp_mode, lhs,
+                                     CONST0_RTX (cmp_mode));
     }
 
   /* (eq/ne (bswap x) C1) simplifies to (eq/ne x C2) with C2 swapped.  */
index cdf9ddc5753e13c8262129e44fff130cea2dd652..2299c78e4279d08b17cd0449d4962641bd676e34 100644 (file)
@@ -1,5 +1,8 @@
 2014-12-15  Jakub Jelinek  <jakub@redhat.com>
 
+       PR rtl-optimization/64316
+       * gcc.dg/pr64316.c: New test.
+
        PR rtl-optimization/63804
        * gcc.dg/pr63804.c: New test.
 
diff --git a/gcc/testsuite/gcc.dg/pr64316.c b/gcc/testsuite/gcc.dg/pr64316.c
new file mode 100644 (file)
index 0000000..f478aa6
--- /dev/null
@@ -0,0 +1,42 @@
+/* PR rtl-optimization/64316 */
+/* { dg-do compile } */
+/* { dg-options "-O3" } */
+/* { dg-additional-options "-mavx2" { target { i?86-*-* x86_64-*-* } } } */
+
+struct S
+{
+  unsigned int s;
+  unsigned long w[];
+};
+
+struct S **s;
+
+int
+foo (struct S *x, struct S *y, struct S *z)
+{
+  unsigned int i;
+  unsigned long *a, *b, *c;
+  int r = 0;
+  for (a = x->w, b = y->w, c = z->w, i = 0; i < x->s; i++, a++)
+    {
+      unsigned long d = *b++ & *c++;
+      if (*a != d)
+       {
+         r = 1;
+         *a = d;
+       }
+    }
+  return r;
+}
+
+void
+bar (int x)
+{
+  int p = x - 1;
+  do
+    {
+      foo (s[x], s[x], s[p]);
+      p--;
+    }
+  while (p > 0);
+}