From f242e7690e6e838ec12e2d09fe1b5fc7929e20da Mon Sep 17 00:00:00 2001 From: "James A. Morrison" Date: Wed, 20 Apr 2005 04:32:41 +0000 Subject: [PATCH] fold-const.c (fold_binary): Fold ~(X ^ Y) to ~X ^ Y or X ^ ~Y if ~X or ~Y simplify. 2005-04-19 James A. Morrison * fold-const.c (fold_binary): Fold ~(X ^ Y) to ~X ^ Y or X ^ ~Y if ~X or ~Y simplify. From-SVN: r98435 --- gcc/ChangeLog | 5 +++++ gcc/fold-const.c | 14 ++++++++++++++ gcc/testsuite/ChangeLog | 1 + gcc/testsuite/gcc.dg/fold-xor-2.c | 16 ++++++++++++++++ 4 files changed, 36 insertions(+) create mode 100644 gcc/testsuite/gcc.dg/fold-xor-2.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 237ebcd..f4737d7 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,10 @@ 2005-04-19 James A. Morrison + * fold-const.c (fold_binary): Fold ~(X ^ Y) to ~X ^ Y or X ^ ~Y if + ~X or ~Y simplify. + +2005-04-19 James A. Morrison + * fold-const (fold_binary): Fold ~X ^ ~ Y to X ^ Y. 2005-04-20 Michael Pogue diff --git a/gcc/fold-const.c b/gcc/fold-const.c index 2c90d0c..2ed556b 100644 --- a/gcc/fold-const.c +++ b/gcc/fold-const.c @@ -7015,6 +7015,20 @@ fold_unary (enum tree_code code, tree type, tree op0) || (TREE_CODE (arg0) == PLUS_EXPR && integer_all_onesp (TREE_OPERAND (arg0, 1))))) return fold_build1 (NEGATE_EXPR, type, TREE_OPERAND (arg0, 0)); + /* Convert ~(X ^ Y) to ~X ^ Y or X ^ ~Y if ~X or ~Y simplify. */ + else if (TREE_CODE (arg0) == BIT_XOR_EXPR + && (tem = fold_unary (BIT_NOT_EXPR, type, + fold_convert (type, + TREE_OPERAND (arg0, 0))))) + return fold_build2 (BIT_XOR_EXPR, type, tem, + fold_convert (type, TREE_OPERAND (arg0, 1))); + else if (TREE_CODE (arg0) == BIT_XOR_EXPR + && (tem = fold_unary (BIT_NOT_EXPR, type, + fold_convert (type, + TREE_OPERAND (arg0, 1))))) + return fold_build2 (BIT_XOR_EXPR, type, + fold_convert (type, TREE_OPERAND (arg0, 0)), tem); + return NULL_TREE; case TRUTH_NOT_EXPR: diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 1782fed..c7d9f2e 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,6 +1,7 @@ 2005-04-19 James A. Morrison * gcc.dg/fold-xor-1.c: New test. + * gcc.dg/fold-xor-2.c: New test. 2005-04-19 James E. Wilson diff --git a/gcc/testsuite/gcc.dg/fold-xor-2.c b/gcc/testsuite/gcc.dg/fold-xor-2.c new file mode 100644 index 0000000..40c2c5d --- /dev/null +++ b/gcc/testsuite/gcc.dg/fold-xor-2.c @@ -0,0 +1,16 @@ +/* { dg-do compile } */ +/* { dg-options "-fdump-tree-generic" } */ +int f (int a, int b) { + return ~(a ^ -(b + 1)); +} + +int g (int a, int b) { + return b ^ a; +} + +unsigned int h (unsigned int a, unsigned int b) { + return ~(-(b + 1) ^ a); +} + +/* { dg-final { scan-tree-dump-times "b \\^ a" 3 "generic" } } */ +/* { dg-final { cleanup-tree-dump "generic" } } */ -- 2.7.4