Commit 40f84775 by James A. Morrison

fold-const.c (fold): Fold -(~A) to A + 1.

2005-02-15  James A. Morrison  <phython@gcc.gnu.org>

        * fold-const.c (fold): Fold -(~A) to A + 1.  Fold ~(-A) to A - 1.
        Fold ~(A - 1) and ~(A + -1) to -A.

From-SVN: r95074
parent 14be52a2
2005-02-15 James A. Morrison <phython@gcc.gnu.org>
* fold-const.c (fold): Fold -(~A) to A + 1. Fold ~(-A) to A - 1.
Fold ~(A - 1) and ~(A + -1) to -A.
2005-02-15 James A. Morrison <phython@gcc.gnu.org>
PR pch/14940
PR target/19300
* config/host-linux.c (linux_gt_pch_use_address): Copy from
......
......@@ -6931,6 +6931,10 @@ fold (tree expr)
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 t;
case ABS_EXPR:
......@@ -6985,6 +6989,17 @@ fold (tree expr)
return fold_not_const (arg0, type);
else if (TREE_CODE (arg0) == BIT_NOT_EXPR)
return TREE_OPERAND (arg0, 0);
/* Convert ~ (-A) to A - 1. */
else if (INTEGRAL_TYPE_P (type) && TREE_CODE (arg0) == NEGATE_EXPR)
return fold (build2 (MINUS_EXPR, type, TREE_OPERAND (arg0, 0),
build_int_cst (type, 1)));
/* Convert ~ (A - 1) or ~ (A + -1) to -A. */
else if (INTEGRAL_TYPE_P (type)
&& ((TREE_CODE (arg0) == MINUS_EXPR
&& integer_onep (TREE_OPERAND (arg0, 1)))
|| (TREE_CODE (arg0) == PLUS_EXPR
&& integer_all_onesp (TREE_OPERAND (arg0, 1)))))
return fold (build1 (NEGATE_EXPR, type, TREE_OPERAND (arg0, 0)));
return t;
case PLUS_EXPR:
......
2005-02-15 James A. Morrison <phython@gcc.gnu.org>
PR tree-optimization/15785
* gcc.dg/pr15785-1.c: New test.
2005-02-15 Alexandre Oliva <aoliva@redhat.com>
PR c++/17788
......
/* { dg-do link } */
extern void link_error ();
void a (int x) {
if (~ (~x) - x)
link_error ();
}
void b (int x) {
if (- (-x) - x)
link_error ();
}
void c (int x) {
if (!(- (~x) - x))
link_error ();
}
void d (int x) {
if (!(~ (-x) - x))
link_error ();
}
void e (int x) {
if (x + ~(x - 1))
link_error ();
}
void f (int x) {
if (x + ~(x + (-1)))
link_error ();
}
int main (int argc, char *argv[]) {
a(argc);
b(argc);
c(argc);
d(argc);
e(argc);
f(argc);
return 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