Commit 3202dccc by Jakub Jelinek Committed by Jakub Jelinek

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
parent d8c16744
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
......@@ -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. */
......
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.
......
/* 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);
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment