From 3202dcccb9dec6a008c9f1887fd4a4c75ebc8940 Mon Sep 17 00:00:00 2001 From: Jakub Jelinek Date: Mon, 15 Dec 2014 21:10:45 +0100 Subject: [PATCH] re PR rtl-optimization/64316 (ICE in simplify_const_unary_operation after r218503) 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 | 7 ++++++ gcc/simplify-rtx.c | 6 +++-- gcc/testsuite/ChangeLog | 3 +++ gcc/testsuite/gcc.dg/pr64316.c | 42 ++++++++++++++++++++++++++++++++++ 4 files changed, 56 insertions(+), 2 deletions(-) create mode 100644 gcc/testsuite/gcc.dg/pr64316.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 87ee0f9f475..07aa48c4ba5 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2014-12-15 Jakub Jelinek + + 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 PR target/62642 diff --git a/gcc/simplify-rtx.c b/gcc/simplify-rtx.c index 8ec416e9cc0..277288a512c 100644 --- a/gcc/simplify-rtx.c +++ b/gcc/simplify-rtx.c @@ -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. */ diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index cdf9ddc5753..2299c78e427 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,8 @@ 2014-12-15 Jakub Jelinek + 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 index 00000000000..f478aa61178 --- /dev/null +++ b/gcc/testsuite/gcc.dg/pr64316.c @@ -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); +} -- 2.30.2