From 65afafea5990c20a8357a09bf6748fd38781ad47 Mon Sep 17 00:00:00 2001 From: rguenth Date: Fri, 4 Jan 2013 10:45:37 +0000 Subject: 2013-01-04 Richard Biener 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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@194899 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/ChangeLog | 6 ++++++ gcc/fold-const.c | 7 +++++++ gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/gcc.dg/fold-reassoc-2.c | 14 ++++++++++++++ 4 files changed, 32 insertions(+) create mode 100644 gcc/testsuite/gcc.dg/fold-reassoc-2.c (limited to 'gcc') diff --git a/gcc/ChangeLog b/gcc/ChangeLog index f0b8348ead0..11ead219716 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2013-01-04 Richard Biener + + PR middle-end/55863 + * fold-const.c (split_tree): Undo -X - 1 to ~X folding for + reassociation. + 2013-01-03 John David Anglin PR target/53789 diff --git a/gcc/fold-const.c b/gcc/fold-const.c index 4f384a75344..7e619d6d1e5 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 2594b26508c..a4f4685f3d1 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2013-01-04 Richard Biener + + PR middle-end/55863 + * gcc.dg/fold-reassoc-2.c: New testcase. + 2013-01-04 Tobias Burnus 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 00000000000..e2dd100b71e --- /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" } } */ -- cgit v1.2.1