OSDN Git Service

2007-11-17 Richard Guenther <rguenther@suse.de>
authorrguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>
Sat, 17 Nov 2007 14:22:42 +0000 (14:22 +0000)
committerrguenth <rguenth@138bc75d-0d04-0410-961f-82ee72b054a4>
Sat, 17 Nov 2007 14:22:42 +0000 (14:22 +0000)
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.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@130258 138bc75d-0d04-0410-961f-82ee72b054a4

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

index 2bef81f..3151f57 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 1057d26..1c03f30 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 bec1ea5..1386ceb 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;
+}