re PR rtl-optimization/68376 (wrong code at -O1 and above on x86_64-linux-gnu)
authorJakub Jelinek <jakub@redhat.com>
Thu, 10 Dec 2015 16:11:49 +0000 (17:11 +0100)
committerJakub Jelinek <jakub@gcc.gnu.org>
Thu, 10 Dec 2015 16:11:49 +0000 (17:11 +0100)
PR rtl-optimization/68376
PR rtl-optimization/68670
* ifcvt.c (noce_try_abs): For one_cmpl allow < 0, >= 0
or > -1 conditions regardless of negate, and disallow
all other conditions.

* gcc.c-torture/execute/pr68376-2.c (f5, f6, f7, f8): New
tests.
(main): Call them.
* gcc.dg/pr68670-1.c: New test.
* gcc.dg/pr68670-2.c: New test.

From-SVN: r231526

gcc/ChangeLog
gcc/ifcvt.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.c-torture/execute/pr68376-2.c
gcc/testsuite/gcc.dg/pr68670-1.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/pr68670-2.c [new file with mode: 0644]

index 4cd1567ff84ecbb20750e443c2490bad4b06a6d9..511fd020cfbbb6e060cf3a6dd3bd834c2afdcf29 100644 (file)
@@ -1,3 +1,11 @@
+2015-12-10  Jakub Jelinek  <jakub@redhat.com>
+
+       PR rtl-optimization/68376
+       PR rtl-optimization/68670
+       * ifcvt.c (noce_try_abs): For one_cmpl allow < 0, >= 0
+       or > -1 conditions regardless of negate, and disallow
+       all other conditions.
+
 2015-12-10  Ilya Enkovich  <enkovich.gnu@gmail.com>
 
        * tree-chkp.c (chkp_call_returns_bounds_p): Return true
index 7fb1dabf1d2cad398d099c352f31e35a662be9b8..6164232c0c55fe80dbbadb5e6482ff79a5b0ece0 100644 (file)
@@ -2601,45 +2601,22 @@ noce_try_abs (struct noce_if_info *if_info)
      Note that these rtx constants are known to be CONST_INT, and
      therefore imply integer comparisons.
      The one_cmpl case is more complicated, as we want to handle
-     only x < 0 ? ~x : x or x >= 0 ? ~x : x but not
-     x <= 0 ? ~x : x or x > 0 ? ~x : x, as the latter two
-     have different result for x == 0.  */
+     only x < 0 ? ~x : x or x >= 0 ? x : ~x to one_cmpl_abs (x)
+     and x < 0 ? x : ~x or x >= 0 ? ~x : x to ~one_cmpl_abs (x),
+     but not other cases (x > -1 is equivalent of x >= 0).  */
   if (c == constm1_rtx && GET_CODE (cond) == GT)
-    {
-      if (one_cmpl && negate)
-       return FALSE;
-    }
+    ;
   else if (c == const1_rtx && GET_CODE (cond) == LT)
     {
-      if (one_cmpl && !negate)
+      if (one_cmpl)
        return FALSE;
     }
   else if (c == CONST0_RTX (GET_MODE (b)))
     {
-      if (one_cmpl)
-       switch (GET_CODE (cond))
-         {
-         case GT:
-           if (!negate)
-             return FALSE;
-           break;
-         case GE:
-           /* >= 0 is the same case as above > -1.  */
-           if (negate)
-             return FALSE;
-           break;
-         case LT:
-           if (negate)
-             return FALSE;
-           break;
-         case LE:
-           /* <= 0 is the same case as above < 1.  */
-           if (!negate)
-             return FALSE;
-           break;
-         default:
-           return FALSE;
-         }
+      if (one_cmpl
+         && GET_CODE (cond) != GE
+         && GET_CODE (cond) != LT)
+       return FALSE;
     }
   else
     return FALSE;
index ce44fa30a9f31bcdef031bc01ac93fbc850c04e4..e076b6a65faf6d5d0c5ee09c03cf260f0492bbe4 100644 (file)
@@ -1,3 +1,13 @@
+2015-12-10  Jakub Jelinek  <jakub@redhat.com>
+
+       PR rtl-optimization/68376
+       PR rtl-optimization/68670
+       * gcc.c-torture/execute/pr68376-2.c (f5, f6, f7, f8): New
+       tests.
+       (main): Call them.
+       * gcc.dg/pr68670-1.c: New test.
+       * gcc.dg/pr68670-2.c: New test.
+
 2015-12-10  Marek Polacek  <polacek@redhat.com>
 
        PR c++/68348
index 884571a89233c8a0e01a0bfef1d74d5dd3b30511..963d441b53f5c16052e2fb6f03939df7ccdd5f04 100644 (file)
@@ -26,6 +26,30 @@ f4 (int x)
   return x <= 0 ? x : ~x;
 }
 
+__attribute__((noinline, noclone)) int
+f5 (int x)
+{
+  return x >= 0 ? ~x : x;
+}
+
+__attribute__((noinline, noclone)) int
+f6 (int x)
+{
+  return x >= 0 ? x : ~x;
+}
+
+__attribute__((noinline, noclone)) int
+f7 (int x)
+{
+  return x > 0 ? ~x : x;
+}
+
+__attribute__((noinline, noclone)) int
+f8 (int x)
+{
+  return x > 0 ? x : ~x;
+}
+
 int
 main ()
 {
@@ -37,5 +61,13 @@ main ()
     abort ();
   if (f4 (5) != -6 || f4 (-5) != -5 || f4 (0) != 0)
     abort ();
+  if (f5 (5) != -6 || f5 (-5) != -5 || f5 (0) != -1)
+    abort ();
+  if (f6 (5) != 5 || f6 (-5) != 4 || f6 (0) != 0)
+    abort ();
+  if (f7 (5) != -6 || f7 (-5) != -5 || f7 (0) != 0)
+    abort ();
+  if (f8 (5) != 5 || f8 (-5) != 4 || f8 (0) != -1)
+    abort ();
   return 0;
 }
diff --git a/gcc/testsuite/gcc.dg/pr68670-1.c b/gcc/testsuite/gcc.dg/pr68670-1.c
new file mode 100644 (file)
index 0000000..92c28a0
--- /dev/null
@@ -0,0 +1,5 @@
+/* PR rtl-optimization/68670 */
+/* { dg-do run } */
+/* { dg-options "-O2 -ftracer" } */
+
+#include "../gcc.c-torture/execute/pr68376-1.c"
diff --git a/gcc/testsuite/gcc.dg/pr68670-2.c b/gcc/testsuite/gcc.dg/pr68670-2.c
new file mode 100644 (file)
index 0000000..903e33e
--- /dev/null
@@ -0,0 +1,5 @@
+/* PR rtl-optimization/68670 */
+/* { dg-do run } */
+/* { dg-options "-O2 -ftracer" } */
+
+#include "../gcc.c-torture/execute/pr68376-2.c"