aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/fold-const.c12
2 files changed, 14 insertions, 4 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 081455f..8a73665 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2005-11-29 Andrew Pinski <pinskia@physics.uc.edu>
+
+ * fold-const.c (negate_expr_p): Return true for BIT_NOT_EXPR.
+ (fold_unary) <case NEGATE_EXPR>: Move -(~a) transformation to ...
+ (negate_expr): Here.
+
2005-11-29 Ben Elliston <bje@au.ibm.com>
* config/i386/i386.h (FORCE_PREFERRED_STACK_BOUNDARY_IN_MAIN):
diff --git a/gcc/fold-const.c b/gcc/fold-const.c
index 2d80e66..2718af1 100644
--- a/gcc/fold-const.c
+++ b/gcc/fold-const.c
@@ -953,6 +953,8 @@ negate_expr_p (tree t)
/* Check that -CST will not overflow type. */
return may_negate_without_overflow_p (t);
+ case BIT_NOT_EXPR:
+ return INTEGRAL_TYPE_P (type);
case REAL_CST:
case NEGATE_EXPR:
@@ -1052,6 +1054,12 @@ negate_expr (tree t)
switch (TREE_CODE (t))
{
+ /* Convert - (~A) to A + 1. */
+ case BIT_NOT_EXPR:
+ if (INTEGRAL_TYPE_P (type))
+ return fold_build2 (PLUS_EXPR, type, TREE_OPERAND (t, 0),
+ build_int_cst (type, 1));
+
case INTEGER_CST:
tem = fold_negate_const (t, type);
if (! TREE_OVERFLOW (tem)
@@ -7030,10 +7038,6 @@ fold_unary (enum tree_code code, tree type, tree op0)
case NEGATE_EXPR:
if (negate_expr_p (arg0))
return fold_convert (type, negate_expr (arg0));
- /* Convert - (~A) to A + 1. */
- if (INTEGRAL_TYPE_P (type) && TREE_CODE (arg0) == BIT_NOT_EXPR)
- return fold_build2 (PLUS_EXPR, type, TREE_OPERAND (arg0, 0),
- build_int_cst (type, 1));
return NULL_TREE;
case ABS_EXPR: