re PR tree-optimization/78305 (Wrong constant folding)
authorRichard Biener <rguenther@suse.de>
Thu, 17 Nov 2016 08:39:33 +0000 (08:39 +0000)
committerRichard Biener <rguenth@gcc.gnu.org>
Thu, 17 Nov 2016 08:39:33 +0000 (08:39 +0000)
2016-11-17  Richard Biener  <rguenther@suse.de>

PR middle-end/78305
* fold-const.c (negate_expr_p): Fix multiplication case.

* gcc.dg/torture/pr78305.c: New testcase.

From-SVN: r242536

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

index c1c5b8bff48f710b02d0735160707871abf62b3a..b8e527aa59a269f58000db0dffff125d096cc0b6 100644 (file)
@@ -1,3 +1,8 @@
+2016-11-17  Richard Biener  <rguenther@suse.de>
+
+       PR middle-end/78305
+       * fold-const.c (negate_expr_p): Fix multiplication case.
+
 2016-11-17  Chung-Lin Tang  <cltang@codesourcery.com>
 
        PR target/78357
index c59741440afb41adf488142e6fd36de33a6cdb4c..f4b2cfa743ef0cccf7f71821e9e714bc469a2dc8 100644 (file)
@@ -450,13 +450,13 @@ negate_expr_p (tree t)
       if (TYPE_UNSIGNED (type))
        break;
       /* INT_MIN/n * n doesn't overflow while negating one operand it does
-         if n is a power of two.  */
+         if n is a (negative) power of two.  */
       if (INTEGRAL_TYPE_P (TREE_TYPE (t))
          && ! TYPE_OVERFLOW_WRAPS (TREE_TYPE (t))
          && ! ((TREE_CODE (TREE_OPERAND (t, 0)) == INTEGER_CST
-                && ! integer_pow2p (TREE_OPERAND (t, 0)))
+                && wi::popcount (wi::abs (TREE_OPERAND (t, 0))) != 1)
                || (TREE_CODE (TREE_OPERAND (t, 1)) == INTEGER_CST
-                   && ! integer_pow2p (TREE_OPERAND (t, 1)))))
+                   && wi::popcount (wi::abs (TREE_OPERAND (t, 1))) != 1)))
        break;
 
       /* Fall through.  */
index abfea5077fb9a097d2c35d1bb9447fa91e714d9b..c142b4b013dde77fcfe458c428124f3c7a892cf1 100644 (file)
@@ -1,3 +1,8 @@
+2016-11-17  Richard Biener  <rguenther@suse.de>
+
+       PR middle-end/78305
+       * gcc.dg/torture/pr78305.c: New testcase.
+
 2016-11-17  Janus Weil  <janus@gcc.gnu.org>
 
        PR fortran/66227
diff --git a/gcc/testsuite/gcc.dg/torture/pr78305.c b/gcc/testsuite/gcc.dg/torture/pr78305.c
new file mode 100644 (file)
index 0000000..ccb8c6f
--- /dev/null
@@ -0,0 +1,14 @@
+/* { dg-require-effective-target int32plus } */
+/* { dg-do run } */
+
+int main ()
+{
+  int a = 2;
+  int b = 1;
+
+  int t = -1 * ( -0x40000000 * a / ( -0x20000000 + b ) )  / -1;
+
+  if (t != 4) __builtin_abort();
+
+  return 0;
+}