This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[PATCH] Finish off PR15784
- From: ja2morri at csclub dot uwaterloo dot ca (James A. Morrison)
- To: gcc-patches at gcc dot gnu dot org
- Date: 16 Feb 2005 00:23:33 -0500
- Subject: [PATCH] Finish off PR15784
Hi,
This patch adds the last bit of folding that pr15784 was actually
looking for. This has been bootstrapped and regtested on powerpc-linux,
all languages except ada and java. Ok for mainline?
--
Thanks,
Jim
http://www.student.cs.uwaterloo.ca/~ja2morri/
http://phython.blogspot.com
http://open.nit.ca/wiki/?page=jim
/* { dg-do compile } */
/* { dg-options "-fdump-tree-generic" } */
int a (int x) {
return ~x + 1; /* -x */
}
int b (int x) {
return -x -1; /* ~x */
}
int c (int x) {
return -x + (-1); /* ~x */
}
/* { dg-final { scan-tree-dump-times "~x;" 2 "generic" } } */
/* { dg-final { scan-tree-dump "-x;" "generic" } } */
2005-02-16 James A. Morrison <phython@gcc.gnu.org>
* fold-const.c (fold): Fold ~A + 1 to -1. Fold -A - 1
and -1 - A to ~A.
Index: fold-const.c
===================================================================
RCS file: /cvsroot/gcc/gcc/gcc/fold-const.c,v
retrieving revision 1.512
diff -u -p -r1.512 fold-const.c
--- fold-const.c 15 Feb 2005 21:58:10 -0000 1.512
+++ fold-const.c 16 Feb 2005 05:08:38 -0000
@@ -7010,6 +7009,11 @@ fold (tree expr)
if (TREE_CODE (arg0) == NEGATE_EXPR
&& reorder_operands_p (TREE_OPERAND (arg0, 0), arg1))
return fold (build2 (MINUS_EXPR, type, arg1, 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)));
if (TREE_CODE (type) == COMPLEX_TYPE)
{
@@ -7448,6 +7452,16 @@ fold (tree expr)
&& reorder_operands_p (arg0, arg1))
return fold (build2 (MINUS_EXPR, type, negate_expr (arg1),
TREE_OPERAND (arg0, 0)));
+ /* Convert -A - 1 to ~A. */
+ if (INTEGRAL_TYPE_P (type)
+ && TREE_CODE (arg0) == NEGATE_EXPR
+ && integer_onep (arg1))
+ return fold (build1 (BIT_NOT_EXPR, type, TREE_OPERAND (arg0, 0)));
+
+ /* Convert -1 - A to ~A. */
+ if (INTEGRAL_TYPE_P (type)
+ && integer_all_onesp (arg0))
+ return fold (build1 (BIT_NOT_EXPR, type, arg1));
if (TREE_CODE (type) == COMPLEX_TYPE)
{