From 105f72b0a8bd8fe5cbc440cbc413411fecf5b3f3 Mon Sep 17 00:00:00 2001 From: rguenth Date: Wed, 3 Aug 2011 13:33:28 +0000 Subject: [PATCH] 2011-08-03 Richard Guenther PR middle-end/49958 * fold-const.c (fold_binary_loc): Only associate (+ (+ (* a b) c) (* d e)) as (+ (+ (* a b) (* d e)) c) if overflow wraps. * gcc.dg/torture/pr49958.c: New testcase. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@177270 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/ChangeLog | 7 +++++++ gcc/fold-const.c | 13 +++++++------ gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/gcc.dg/torture/pr49958.c | 11 +++++++++++ 4 files changed, 30 insertions(+), 6 deletions(-) create mode 100644 gcc/testsuite/gcc.dg/torture/pr49958.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 72902da..886b360 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2011-08-03 Richard Guenther + + PR middle-end/49958 + * fold-const.c (fold_binary_loc): Only associate + (+ (+ (* a b) c) (* d e)) as (+ (+ (* a b) (* d e)) c) if + overflow wraps. + 2011-08-03 Alan Modra PR rtl-optimization/49941 diff --git a/gcc/fold-const.c b/gcc/fold-const.c index 8ad806f..0cdf682 100644 --- a/gcc/fold-const.c +++ b/gcc/fold-const.c @@ -9711,12 +9711,13 @@ fold_binary_loc (location_t loc, /* Reassociate (plus (plus (mult) (foo)) (mult)) as (plus (plus (mult) (mult)) (foo)) so that we can take advantage of the factoring cases below. */ - if (((TREE_CODE (arg0) == PLUS_EXPR - || TREE_CODE (arg0) == MINUS_EXPR) - && TREE_CODE (arg1) == MULT_EXPR) - || ((TREE_CODE (arg1) == PLUS_EXPR - || TREE_CODE (arg1) == MINUS_EXPR) - && TREE_CODE (arg0) == MULT_EXPR)) + if (TYPE_OVERFLOW_WRAPS (type) + && (((TREE_CODE (arg0) == PLUS_EXPR + || TREE_CODE (arg0) == MINUS_EXPR) + && TREE_CODE (arg1) == MULT_EXPR) + || ((TREE_CODE (arg1) == PLUS_EXPR + || TREE_CODE (arg1) == MINUS_EXPR) + && TREE_CODE (arg0) == MULT_EXPR))) { tree parg0, parg1, parg, marg; enum tree_code pcode; diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index e16b1a0..1e70bbd 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,10 @@ 2011-08-03 Richard Guenther + PR middle-end/49958 + * gcc.dg/torture/pr49958.c: New testcase. + +2011-08-03 Richard Guenther + PR tree-optimization/49938 * g++.dg/torture/pr49938.C: New testcase. diff --git a/gcc/testsuite/gcc.dg/torture/pr49958.c b/gcc/testsuite/gcc.dg/torture/pr49958.c new file mode 100644 index 0000000..de689bc --- /dev/null +++ b/gcc/testsuite/gcc.dg/torture/pr49958.c @@ -0,0 +1,11 @@ +/* { dg-do run } */ +/* { dg-options "-fstrict-overflow" } */ + +extern void abort (void); +int foo (int i, int j, int o, int m) { return i*o + 1 + j*m > 1; } +int main() +{ + if (foo (- __INT_MAX__ - 1, -1, 1, 1)) + abort (); + return 0; +} -- 2.7.4