Commit 27edb974 by Jakub Jelinek Committed by Jakub Jelinek

re PR tree-optimization/53410 (ICE in build_int_cst_wide, at tree.c:1219)

	PR tree-optimization/53410
	* fold-const.c (fold_binary_loc): Use build_zero_cst (type)
	instead of build_int_cst (type, 0) where vector types might be
	involved. Instead of build_int_cst (type, 1) convert the original
	integer_onep argument to the desired type.

	* gcc.c-torture/compile/pr53410-1.c: New test.
	* gcc.c-torture/compile/pr53410-2.c: New test.

From-SVN: r187715
parent fb639843
2012-05-21 Jakub Jelinek <jakub@redhat.com>
PR tree-optimization/53410
* fold-const.c (fold_binary_loc): Use build_zero_cst (type)
instead of build_int_cst (type, 0) where vector types might be
involved. Instead of build_int_cst (type, 1) convert the original
integer_onep argument to the desired type.
2012-05-21 Michael Matz <matz@suse.de> 2012-05-21 Michael Matz <matz@suse.de>
* genattrtab.c (attr_rtx_cost): Move earlier, start with cost being 1. * genattrtab.c (attr_rtx_cost): Move earlier, start with cost being 1.
......
...@@ -11245,7 +11245,7 @@ fold_binary_loc (location_t loc, ...@@ -11245,7 +11245,7 @@ fold_binary_loc (location_t loc,
&& integer_onep (TREE_OPERAND (arg0, 1)) && integer_onep (TREE_OPERAND (arg0, 1))
&& integer_onep (arg1)) && integer_onep (arg1))
return fold_build2_loc (loc, EQ_EXPR, type, arg0, return fold_build2_loc (loc, EQ_EXPR, type, arg0,
build_int_cst (TREE_TYPE (arg0), 0)); build_zero_cst (TREE_TYPE (arg0)));
/* Fold (X & Y) ^ Y as ~X & Y. */ /* Fold (X & Y) ^ Y as ~X & Y. */
if (TREE_CODE (arg0) == BIT_AND_EXPR if (TREE_CODE (arg0) == BIT_AND_EXPR
...@@ -11355,21 +11355,25 @@ fold_binary_loc (location_t loc, ...@@ -11355,21 +11355,25 @@ fold_binary_loc (location_t loc,
&& integer_onep (TREE_OPERAND (arg0, 1)) && integer_onep (TREE_OPERAND (arg0, 1))
&& integer_onep (arg1)) && integer_onep (arg1))
{ {
tree tem2;
tem = TREE_OPERAND (arg0, 0); tem = TREE_OPERAND (arg0, 0);
return fold_build2_loc (loc, EQ_EXPR, type, tem2 = fold_convert_loc (loc, TREE_TYPE (tem), arg1);
fold_build2_loc (loc, BIT_AND_EXPR, TREE_TYPE (tem), tem, tem2 = fold_build2_loc (loc, BIT_AND_EXPR, TREE_TYPE (tem),
build_int_cst (TREE_TYPE (tem), 1)), tem, tem2);
build_int_cst (TREE_TYPE (tem), 0)); return fold_build2_loc (loc, EQ_EXPR, type, tem2,
build_zero_cst (TREE_TYPE (tem)));
} }
/* Fold ~X & 1 as (X & 1) == 0. */ /* Fold ~X & 1 as (X & 1) == 0. */
if (TREE_CODE (arg0) == BIT_NOT_EXPR if (TREE_CODE (arg0) == BIT_NOT_EXPR
&& integer_onep (arg1)) && integer_onep (arg1))
{ {
tree tem2;
tem = TREE_OPERAND (arg0, 0); tem = TREE_OPERAND (arg0, 0);
return fold_build2_loc (loc, EQ_EXPR, type, tem2 = fold_convert_loc (loc, TREE_TYPE (tem), arg1);
fold_build2_loc (loc, BIT_AND_EXPR, TREE_TYPE (tem), tem, tem2 = fold_build2_loc (loc, BIT_AND_EXPR, TREE_TYPE (tem),
build_int_cst (TREE_TYPE (tem), 1)), tem, tem2);
build_int_cst (TREE_TYPE (tem), 0)); return fold_build2_loc (loc, EQ_EXPR, type, tem2,
build_zero_cst (TREE_TYPE (tem)));
} }
/* Fold !X & 1 as X == 0. */ /* Fold !X & 1 as X == 0. */
if (TREE_CODE (arg0) == TRUTH_NOT_EXPR if (TREE_CODE (arg0) == TRUTH_NOT_EXPR
...@@ -11377,7 +11381,7 @@ fold_binary_loc (location_t loc, ...@@ -11377,7 +11381,7 @@ fold_binary_loc (location_t loc,
{ {
tem = TREE_OPERAND (arg0, 0); tem = TREE_OPERAND (arg0, 0);
return fold_build2_loc (loc, EQ_EXPR, type, tem, return fold_build2_loc (loc, EQ_EXPR, type, tem,
build_int_cst (TREE_TYPE (tem), 0)); build_zero_cst (TREE_TYPE (tem)));
} }
/* Fold (X ^ Y) & Y as ~X & Y. */ /* Fold (X ^ Y) & Y as ~X & Y. */
...@@ -12893,13 +12897,13 @@ fold_binary_loc (location_t loc, ...@@ -12893,13 +12897,13 @@ fold_binary_loc (location_t loc,
if (TREE_CODE (arg0) == BIT_XOR_EXPR if (TREE_CODE (arg0) == BIT_XOR_EXPR
&& operand_equal_p (TREE_OPERAND (arg0, 1), arg1, 0)) && operand_equal_p (TREE_OPERAND (arg0, 1), arg1, 0))
return fold_build2_loc (loc, code, type, TREE_OPERAND (arg0, 0), return fold_build2_loc (loc, code, type, TREE_OPERAND (arg0, 0),
build_int_cst (TREE_TYPE (arg0), 0)); build_zero_cst (TREE_TYPE (arg0)));
/* Likewise (X ^ Y) == X becomes Y == 0. X has no side-effects. */ /* Likewise (X ^ Y) == X becomes Y == 0. X has no side-effects. */
if (TREE_CODE (arg0) == BIT_XOR_EXPR if (TREE_CODE (arg0) == BIT_XOR_EXPR
&& operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0) && operand_equal_p (TREE_OPERAND (arg0, 0), arg1, 0)
&& reorder_operands_p (TREE_OPERAND (arg0, 1), arg1)) && reorder_operands_p (TREE_OPERAND (arg0, 1), arg1))
return fold_build2_loc (loc, code, type, TREE_OPERAND (arg0, 1), return fold_build2_loc (loc, code, type, TREE_OPERAND (arg0, 1),
build_int_cst (TREE_TYPE (arg0), 0)); build_zero_cst (TREE_TYPE (arg0)));
/* (X ^ C1) op C2 can be rewritten as X op (C1 ^ C2). */ /* (X ^ C1) op C2 can be rewritten as X op (C1 ^ C2). */
if (TREE_CODE (arg0) == BIT_XOR_EXPR if (TREE_CODE (arg0) == BIT_XOR_EXPR
...@@ -12987,7 +12991,7 @@ fold_binary_loc (location_t loc, ...@@ -12987,7 +12991,7 @@ fold_binary_loc (location_t loc,
BIT_XOR_EXPR, itype, BIT_XOR_EXPR, itype,
arg00, arg10), arg00, arg10),
arg01), arg01),
build_int_cst (itype, 0)); build_zero_cst (itype));
if (operand_equal_p (arg01, arg10, 0)) if (operand_equal_p (arg01, arg10, 0))
return fold_build2_loc (loc, code, type, return fold_build2_loc (loc, code, type,
...@@ -12996,7 +13000,7 @@ fold_binary_loc (location_t loc, ...@@ -12996,7 +13000,7 @@ fold_binary_loc (location_t loc,
BIT_XOR_EXPR, itype, BIT_XOR_EXPR, itype,
arg00, arg11), arg00, arg11),
arg01), arg01),
build_int_cst (itype, 0)); build_zero_cst (itype));
if (operand_equal_p (arg00, arg11, 0)) if (operand_equal_p (arg00, arg11, 0))
return fold_build2_loc (loc, code, type, return fold_build2_loc (loc, code, type,
...@@ -13005,7 +13009,7 @@ fold_binary_loc (location_t loc, ...@@ -13005,7 +13009,7 @@ fold_binary_loc (location_t loc,
BIT_XOR_EXPR, itype, BIT_XOR_EXPR, itype,
arg01, arg10), arg01, arg10),
arg00), arg00),
build_int_cst (itype, 0)); build_zero_cst (itype));
if (operand_equal_p (arg00, arg10, 0)) if (operand_equal_p (arg00, arg10, 0))
return fold_build2_loc (loc, code, type, return fold_build2_loc (loc, code, type,
...@@ -13014,7 +13018,7 @@ fold_binary_loc (location_t loc, ...@@ -13014,7 +13018,7 @@ fold_binary_loc (location_t loc,
BIT_XOR_EXPR, itype, BIT_XOR_EXPR, itype,
arg01, arg11), arg01, arg11),
arg00), arg00),
build_int_cst (itype, 0)); build_zero_cst (itype));
} }
if (TREE_CODE (arg0) == BIT_XOR_EXPR if (TREE_CODE (arg0) == BIT_XOR_EXPR
...@@ -13492,7 +13496,7 @@ fold_binary_loc (location_t loc, ...@@ -13492,7 +13496,7 @@ fold_binary_loc (location_t loc,
return build2_loc (loc, code == LT_EXPR ? EQ_EXPR : NE_EXPR, type, return build2_loc (loc, code == LT_EXPR ? EQ_EXPR : NE_EXPR, type,
build2 (RSHIFT_EXPR, TREE_TYPE (arg0), arg0, build2 (RSHIFT_EXPR, TREE_TYPE (arg0), arg0,
TREE_OPERAND (arg1, 1)), TREE_OPERAND (arg1, 1)),
build_int_cst (TREE_TYPE (arg0), 0)); build_zero_cst (TREE_TYPE (arg0)));
if ((code == LT_EXPR || code == GE_EXPR) if ((code == LT_EXPR || code == GE_EXPR)
&& TYPE_UNSIGNED (TREE_TYPE (arg0)) && TYPE_UNSIGNED (TREE_TYPE (arg0))
...@@ -13504,7 +13508,7 @@ fold_binary_loc (location_t loc, ...@@ -13504,7 +13508,7 @@ fold_binary_loc (location_t loc,
TREE_OPERAND (TREE_OPERAND (arg1, 0), 1)); TREE_OPERAND (TREE_OPERAND (arg1, 0), 1));
return build2_loc (loc, code == LT_EXPR ? EQ_EXPR : NE_EXPR, type, return build2_loc (loc, code == LT_EXPR ? EQ_EXPR : NE_EXPR, type,
fold_convert_loc (loc, TREE_TYPE (arg0), tem), fold_convert_loc (loc, TREE_TYPE (arg0), tem),
build_int_cst (TREE_TYPE (arg0), 0)); build_zero_cst (TREE_TYPE (arg0)));
} }
return NULL_TREE; return NULL_TREE;
......
2012-05-21 Jakub Jelinek <jakub@redhat.com>
PR tree-optimization/53410
* gcc.c-torture/compile/pr53410-1.c: New test.
* gcc.c-torture/compile/pr53410-2.c: New test.
2012-05-21 H.J. Lu <hongjiu.lu@intel.com> 2012-05-21 H.J. Lu <hongjiu.lu@intel.com>
PR target/53425 PR target/53425
......
/* PR tree-optimization/53410 */
int *a, b, c, d;
void
foo (void)
{
for (; d <= 0; d++)
b &= ((a || d) ^ c) == 1;
}
/* PR tree-optimization/53410 */
typedef int V __attribute__((vector_size (4 * sizeof (int))));
typedef unsigned int W __attribute__((vector_size (4 * sizeof (int))));
void
f1 (V *p)
{
*p = (*p & ((V) { 1, 1, 1, 1 })) ^ ((V) { 1, 1, 1, 1});
}
void
f2 (V *p)
{
*p = (*p ^ ((V) { 1, 1, 1, 1 })) & ((V) { 1, 1, 1, 1});
}
void
f3 (V *p)
{
*p = (~*p) & ((V) { 1, 1, 1, 1 });
}
void
f4 (V *p, V *q)
{
*p = (*p ^ *q) == *q;
}
void
f5 (V *p, V *q)
{
*p = (*p ^ *q) == *p;
}
void
f6 (V *p, V *q, V *r)
{
*p = (*p & *r) == (*q & *r);
}
void
f7 (V *p, V *q, V *r)
{
*p = (*p & *r) == (*r & *q);
}
void
f8 (V *p, V *q, V *r)
{
*p = (*r & *p) == (*q & *r);
}
void
f9 (V *p, V *q, V *r)
{
*p = (*r & *p) == (*r & *q);
}
void
f10 (W *p, W *q)
{
*p = *p < (((const W) { 1U, 1U, 1U, 1U }) << *q);
}
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