From 9ccaac1188959d2b35cfa820c46277ebef5f75e0 Mon Sep 17 00:00:00 2001 From: Richard Biener Date: Tue, 28 Oct 2014 11:42:43 +0000 Subject: [PATCH] re PR tree-optimization/63665 (wrong code with signed overflow even with -fwrapv) 2014-10-28 Richard Biener PR middle-end/63665 * fold-const.c (fold_comparison): Properly guard simplifying against INT_MAX/INT_MIN with !TYPE_OVERFLOW_WRAPS. * gcc.dg/pr63665.c: New testcase. From-SVN: r216781 --- gcc/ChangeLog | 6 ++++++ gcc/fold-const.c | 3 ++- gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/gcc.dg/pr63665.c | 18 ++++++++++++++++++ 4 files changed, 31 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/gcc.dg/pr63665.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 536a0007dc0..1f3a0fb0070 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2014-10-28 Richard Biener + + PR middle-end/63665 + * fold-const.c (fold_comparison): Properly guard simplifying + against INT_MAX/INT_MIN with !TYPE_OVERFLOW_WRAPS. + 2014-10-28 Alan Lawrence * expr.c (expand_expr_real_2): Remove code handling VEC_LSHIFT_EXPR. diff --git a/gcc/fold-const.c b/gcc/fold-const.c index 81660706b40..218afa01ab4 100644 --- a/gcc/fold-const.c +++ b/gcc/fold-const.c @@ -8749,7 +8749,8 @@ fold_comparison (location_t loc, enum tree_code code, tree type, /* If the constant operation overflowed this can be simplified as a comparison against INT_MAX/INT_MIN. */ - if (TREE_OVERFLOW (new_const)) + if (TREE_OVERFLOW (new_const) + && !TYPE_OVERFLOW_WRAPS (TREE_TYPE (arg0))) { int const1_sgn = tree_int_cst_sgn (const1); enum tree_code code2 = code; diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index e0759c3bd04..d08d102fa03 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2014-10-28 Richard Biener + + PR middle-end/63665 + * gcc.dg/pr63665.c: New testcase. + 2014-10-28 Yury Gribov * c-c++-common/asan/kasan-recover-1.c: New test. diff --git a/gcc/testsuite/gcc.dg/pr63665.c b/gcc/testsuite/gcc.dg/pr63665.c new file mode 100644 index 00000000000..046ecae7c1d --- /dev/null +++ b/gcc/testsuite/gcc.dg/pr63665.c @@ -0,0 +1,18 @@ +/* { dg-do run } */ +/* { dg-require-effective-target int32plus } */ +/* { dg-options "-O -fno-tree-ccp -fno-tree-fre -fno-tree-copy-prop -fwrapv" } */ + +static inline int +test5 (int x) +{ + int y = 0x80000000; + return x + y; +} + +int +main () +{ + if (test5 (0x80000000) != 0) + __builtin_abort (); + return 0; +} -- 2.30.2