re PR middle-end/32559 (ICE with vector arithmetic)
PR middle-end/32559 * fold-const.c (fold-binary) [PLUS_EXPR]: Convert ~X + X to 1 or X + ~X to 1 only for INTEGRAL_TYPE_P type. testsuite/ChangeLog: PR middle-end/32559 * gcc.dg/pr32559.c: New test. From-SVN: r126164
This commit is contained in:
parent
344c77be01
commit
c22f6d33be
|
@ -1,3 +1,9 @@
|
|||
2007-07-01 Uros Bizjak <ubizjak@gmail.com>
|
||||
|
||||
PR middle-end/32559
|
||||
* fold-const.c (fold-binary) [PLUS_EXPR]: Convert ~X + X to 1 or
|
||||
X + ~X to 1 only for INTEGRAL_TYPE_P type.
|
||||
|
||||
2007-06-30 Joseph Myers <joseph@codesourcery.com>
|
||||
|
||||
* configure.ac: Check for .gnu_attribute on MIPS.
|
||||
|
@ -137,7 +143,7 @@
|
|||
|
||||
2006-06-30 Jan Hubicka <jh@suse.cz>
|
||||
|
||||
* loop-unroll.c (unroll_loop_runtime_iterations): Unshare newly emit
|
||||
* loop-unroll.c (unroll_loop_runtime_iterations): Unshare newly emit
|
||||
code.
|
||||
|
||||
2006-06-30 Thomas Neumann <tneumann@users.sourceforge.net>
|
||||
|
|
|
@ -9270,27 +9270,13 @@ fold_binary (enum tree_code code, tree type, tree op0, tree op1)
|
|||
return fold_build2 (MINUS_EXPR, type,
|
||||
fold_convert (type, arg1),
|
||||
fold_convert (type, TREE_OPERAND (arg0, 0)));
|
||||
/* Convert ~A + 1 to -A. */
|
||||
if (INTEGRAL_TYPE_P (type)
|
||||
&& TREE_CODE (arg0) == BIT_NOT_EXPR
|
||||
&& integer_onep (arg1))
|
||||
return fold_build1 (NEGATE_EXPR, type, TREE_OPERAND (arg0, 0));
|
||||
|
||||
/* Handle (A1 * C1) + (A2 * C2) with A1, A2 or C1, C2 being the
|
||||
same or one. */
|
||||
if ((TREE_CODE (arg0) == MULT_EXPR
|
||||
|| TREE_CODE (arg1) == MULT_EXPR)
|
||||
&& (!FLOAT_TYPE_P (type) || flag_unsafe_math_optimizations))
|
||||
{
|
||||
tree tem = fold_plusminus_mult_expr (code, type, arg0, arg1);
|
||||
if (tem)
|
||||
return tem;
|
||||
}
|
||||
|
||||
if (! FLOAT_TYPE_P (type))
|
||||
if (INTEGRAL_TYPE_P (type))
|
||||
{
|
||||
if (integer_zerop (arg1))
|
||||
return non_lvalue (fold_convert (type, arg0));
|
||||
/* Convert ~A + 1 to -A. */
|
||||
if (TREE_CODE (arg0) == BIT_NOT_EXPR
|
||||
&& integer_onep (arg1))
|
||||
return fold_build1 (NEGATE_EXPR, type, TREE_OPERAND (arg0, 0));
|
||||
|
||||
/* ~X + X is -1. */
|
||||
if (TREE_CODE (arg0) == BIT_NOT_EXPR
|
||||
|
@ -9319,6 +9305,23 @@ fold_binary (enum tree_code code, tree type, tree op0, tree op1)
|
|||
return omit_one_operand (type, t1, arg0);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* Handle (A1 * C1) + (A2 * C2) with A1, A2 or C1, C2 being the
|
||||
same or one. */
|
||||
if ((TREE_CODE (arg0) == MULT_EXPR
|
||||
|| TREE_CODE (arg1) == MULT_EXPR)
|
||||
&& (!FLOAT_TYPE_P (type) || flag_unsafe_math_optimizations))
|
||||
{
|
||||
tree tem = fold_plusminus_mult_expr (code, type, arg0, arg1);
|
||||
if (tem)
|
||||
return tem;
|
||||
}
|
||||
|
||||
if (! FLOAT_TYPE_P (type))
|
||||
{
|
||||
if (integer_zerop (arg1))
|
||||
return non_lvalue (fold_convert (type, arg0));
|
||||
|
||||
/* If we are adding two BIT_AND_EXPR's, both of which are and'ing
|
||||
with a constant, and the two constants have no bits in common,
|
||||
|
|
|
@ -1,3 +1,9 @@
|
|||
2007-067-01 Uros Bizjak <ubizjak@gmail.com>
|
||||
Volker Reichelt <reichelt@netcologne.de>
|
||||
|
||||
PR middle-end/32559
|
||||
* gcc.dg/pr32559.c: New test.
|
||||
|
||||
2007-07-01 Uros Bizjak <ubizjak@gmail.com>
|
||||
|
||||
PR tree-optimization/25371
|
||||
|
|
|
@ -0,0 +1,9 @@
|
|||
/* { dg-do compile } */
|
||||
/* { dg-options "" } */
|
||||
|
||||
int __attribute__((vector_size (8))) v;
|
||||
|
||||
void foo()
|
||||
{
|
||||
v += ~v;
|
||||
}
|
Loading…
Reference in New Issue