From bb56eeca45cf7cb89d5dfe87f302e375219524f3 Mon Sep 17 00:00:00 2001 From: Matthias Klose Date: Thu, 29 Nov 2007 00:32:58 +0000 Subject: [PATCH] backport: re PR middle-end/34130 (the builtin abs() gives wrong result when used in some expression) gcc/ 2007-11-29 Matthias Klose Backport from mainline: 2007-11-17 Richard Guenther PR middle-end/34130 * fold-const.c (extract_muldiv_1): Do not move negative constants inside ABS_EXPR. gcc/testsuite/ 2007-11-29 Matthias Klose Backport from mainline: 2007-11-17 Richard Guenther PR middle-end/34130 * gcc.c-torture/execute/pr34130.c: New testcase. From-SVN: r130507 --- gcc/ChangeLog | 9 +++++++++ gcc/fold-const.c | 3 +++ gcc/testsuite/ChangeLog | 8 ++++++++ gcc/testsuite/gcc.c-torture/execute/pr34130.c | 12 ++++++++++++ 4 files changed, 32 insertions(+) create mode 100644 gcc/testsuite/gcc.c-torture/execute/pr34130.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 8de09945cf25..004fe65d8053 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,12 @@ +2007-11-29 Matthias Klose + + Backport from mainline: + 2007-11-17 Richard Guenther + + PR middle-end/34130 + * fold-const.c (extract_muldiv_1): Do not move negative + constants inside ABS_EXPR. + 2007-11-16 Richard Guenther PR middle-end/34030 diff --git a/gcc/fold-const.c b/gcc/fold-const.c index f031825f7bab..f9e58d275910 100644 --- a/gcc/fold-const.c +++ b/gcc/fold-const.c @@ -5340,6 +5340,9 @@ extract_muldiv_1 (tree t, tree c, enum tree_code code, tree wide_type) } break; } + /* If the constant is negative, we cannot simplify this. */ + if (tree_int_cst_sgn (c) == -1) + break; /* FALLTHROUGH */ case NEGATE_EXPR: if ((t1 = extract_muldiv (op0, c, code, wide_type)) != 0) diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 7efd5b698d96..7b78678753e6 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,11 @@ +2007-11-29 Matthias Klose + + Backport from mainline: + 2007-11-17 Richard Guenther + + PR middle-end/34130 + * gcc.c-torture/execute/pr34130.c: New testcase. + 2007-11-16 Richard Guenther PR middle-end/34030 diff --git a/gcc/testsuite/gcc.c-torture/execute/pr34130.c b/gcc/testsuite/gcc.c-torture/execute/pr34130.c new file mode 100644 index 000000000000..b528ff22b8a1 --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/execute/pr34130.c @@ -0,0 +1,12 @@ +extern void abort (void); +int foo (int i) +{ + return -2 * __builtin_abs(i - 2); +} +int main() +{ + if (foo(1) != -2 + || foo(3) != -2) + abort (); + return 0; +} -- 2.47.2