]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR middle-end/34130 (the builtin abs() gives wrong result when used in some expres...
authorRichard Guenther <rguenther@suse.de>
Sat, 17 Nov 2007 14:22:42 +0000 (14:22 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Sat, 17 Nov 2007 14:22:42 +0000 (14:22 +0000)
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

gcc/ChangeLog
gcc/fold-const.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.c-torture/execute/pr34130.c [new file with mode: 0644]

index 2bef81feb0d560abfcae7218b0658b20f68c5e08..3151f57deb0615768e7f6aacea75ebfa3d564bf2 100644 (file)
@@ -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
index 1057d2609a195755cc5206b43c450c5fcb8e930f..1c03f30894adb9cc8186b1569abe9da65b9eeaf6 100644 (file)
@@ -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))
index bec1ea53bcdf3171c7241e5d2969bd8d464a394e..1386cebca7d4b9478c8bee72143ac7901aaa34ba 100644 (file)
@@ -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 (file)
index 0000000..b528ff2
--- /dev/null
@@ -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;
+}