diff options
author | Richard Biener <rguenther@suse.de> | 2013-01-04 10:45:37 +0000 |
---|---|---|
committer | Richard Biener <rguenth@gcc.gnu.org> | 2013-01-04 10:45:37 +0000 |
commit | 3068819a3af2da9cdab935d39b952912b1f63325 (patch) | |
tree | 002d1787e93d0fc5c2e65f699f5d251bbf4f31ad | |
parent | db59befb099fc4d20a2a60f9eaa6b1fb8a9e85c7 (diff) | |
download | gcc-3068819a3af2da9cdab935d39b952912b1f63325.zip gcc-3068819a3af2da9cdab935d39b952912b1f63325.tar.gz gcc-3068819a3af2da9cdab935d39b952912b1f63325.tar.bz2 |
re PR middle-end/55863 (Fails to fold (i + 2) - (i + 1) to 1)
2013-01-04 Richard Biener <rguenther@suse.de>
PR middle-end/55863
* fold-const.c (split_tree): Undo -X - 1 to ~X folding for
reassociation.
* gcc.dg/fold-reassoc-2.c: New testcase.
From-SVN: r194899
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/fold-const.c | 7 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/fold-reassoc-2.c | 14 |
4 files changed, 32 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index f0b8348..11ead21 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2013-01-04 Richard Biener <rguenther@suse.de> + + PR middle-end/55863 + * fold-const.c (split_tree): Undo -X - 1 to ~X folding for + reassociation. + 2013-01-03 John David Anglin <dave.anglin@nrc-cnrc.gc.ca> PR target/53789 diff --git a/gcc/fold-const.c b/gcc/fold-const.c index 4f384a7..7e619d6 100644 --- a/gcc/fold-const.c +++ b/gcc/fold-const.c @@ -821,6 +821,13 @@ split_tree (tree in, enum tree_code code, tree *conp, tree *litp, if (neg_var_p) var = negate_expr (var); } + else if (TREE_CODE (in) == BIT_NOT_EXPR + && code == PLUS_EXPR) + { + /* -X - 1 is folded to ~X, undo that here. */ + *minus_litp = build_one_cst (TREE_TYPE (in)); + var = negate_expr (TREE_OPERAND (in, 0)); + } else if (TREE_CONSTANT (in)) *conp = in; else diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 2594b26..a4f4685 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2013-01-04 Richard Biener <rguenther@suse.de> + + PR middle-end/55863 + * gcc.dg/fold-reassoc-2.c: New testcase. + 2013-01-04 Tobias Burnus <burnus@net-b.de> PR fortran/55763 diff --git a/gcc/testsuite/gcc.dg/fold-reassoc-2.c b/gcc/testsuite/gcc.dg/fold-reassoc-2.c new file mode 100644 index 0000000..e2dd100 --- /dev/null +++ b/gcc/testsuite/gcc.dg/fold-reassoc-2.c @@ -0,0 +1,14 @@ +/* { dg-do compile } */
+/* { dg-options "-O -fdump-tree-original" } */
+
+int foo (int i)
+{
+ return (i + 2) - (i + 1);
+}
+int bar (int i)
+{
+ return (i + 2) + ~i;
+}
+
+/* { dg-final { scan-tree-dump "return 1;" "original" } } */
+/* { dg-final { cleanup-tree-dump "original" } } */
|