aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Guenther <rguenther@suse.de>2007-11-17 14:22:42 +0000
committerRichard Biener <rguenth@gcc.gnu.org>2007-11-17 14:22:42 +0000
commita0857153ddb27ba0f64a16c934734421fd2fccfc (patch)
tree4cc0357f812980dd1458b9f0f76df27daf5952c2 /gcc
parentd61ae8dd9925ebc662f09837013e0a03bcc353f5 (diff)
downloadgcc-a0857153ddb27ba0f64a16c934734421fd2fccfc.zip
gcc-a0857153ddb27ba0f64a16c934734421fd2fccfc.tar.gz
gcc-a0857153ddb27ba0f64a16c934734421fd2fccfc.tar.bz2
re PR middle-end/34130 (the builtin abs() gives wrong result when used in some expression)
2007-11-17 Richard Guenther <rguenther@suse.de> PR middle-end/34130 * fold-const.c (extract_muldiv_1): Do not move negative constants inside ABS_EXPR. * gcc.c-torture/execute/pr34130.c: New testcase. From-SVN: r130258
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/fold-const.c3
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.c-torture/execute/pr34130.c12
4 files changed, 26 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 2bef81f..3151f57 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2007-11-17 Richard Guenther <rguenther@suse.de>
+
+ PR middle-end/34130
+ * fold-const.c (extract_muldiv_1): Do not move negative
+ constants inside ABS_EXPR.
+
2007-11-16 Ian Lance Taylor <iant@google.com>
* collect2.c (dump_file): If a demangled symbol is followed by a
diff --git a/gcc/fold-const.c b/gcc/fold-const.c
index 1057d26..1c03f30 100644
--- a/gcc/fold-const.c
+++ b/gcc/fold-const.c
@@ -6095,6 +6095,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, strict_overflow_p))
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index bec1ea5..1386ceb 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2007-11-17 Richard Guenther <rguenther@suse.de>
+
+ PR middle-end/34130
+ * gcc.c-torture/execute/pr34130.c: New testcase.
+
2007-11-17 Francois-Xavier Coudert <fxcoudert@gcc.gnu.org>
PR fortran/34108
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 0000000..b528ff2
--- /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;
+}