Hi!

The following patch (on top of the two other PR94718 patches) performs the
actual optimization requested in the PR.

Bootstrapped/regtested on x86_64-linux and i686-linux, ok for stage1?

2020-04-30  Jakub Jelinek  <ja...@redhat.com>

        PR tree-optimization/94718
        * match.pd ((X < 0) != (Y < 0) into (X ^ Y) < 0): New simplification.

        * gcc.dg/tree-ssa/pr94718-4.c: New test.
        * gcc.dg/tree-ssa/pr94718-5.c: New test.

--- gcc/match.pd.jj     2020-04-30 12:43:10.473982154 +0200
+++ gcc/match.pd        2020-04-30 13:10:11.305134082 +0200
@@ -4358,6 +4358,28 @@ (define_operator_list COND_TERNARY
   (cmp (bit_and:cs @0 @2) (bit_and:cs @1 @2))
   (cmp (bit_and (bit_xor @0 @1) @2) { build_zero_cst (TREE_TYPE (@2)); })))
 
+/* (X < 0) != (Y < 0) into (X ^ Y) < 0.
+   (X >= 0) != (Y >= 0) into (X ^ Y) < 0.
+   (X < 0) == (Y < 0) into (X ^ Y) >= 0.
+   (X >= 0) == (Y >= 0) into (X ^ Y) >= 0.  */
+(for cmp (eq ne)
+     ncmp (ge lt)
+ (for sgncmp (ge lt)
+  (simplify
+   (cmp (sgncmp @0 integer_zerop@2) (sgncmp @1 integer_zerop))
+   (if (ANY_INTEGRAL_TYPE_P (TREE_TYPE (@0))
+       && !TYPE_UNSIGNED (TREE_TYPE (@0))
+       && types_match (@0, @1))
+    (ncmp (bit_xor @0 @1) @2)))))
+(for cmp (eq ne)
+     ncmp (lt ge)
+ (simplify
+  (cmp:c (lt @0 integer_zerop@2) (ge @1 integer_zerop))
+   (if (ANY_INTEGRAL_TYPE_P (TREE_TYPE (@0))
+       && !TYPE_UNSIGNED (TREE_TYPE (@0))
+       && types_match (@0, @1))
+    (ncmp (bit_xor @0 @1) @2))))
+
 /* If we have (A & C) == C where C is a power of 2, convert this into
    (A & C) != 0.  Similarly for NE_EXPR.  */
 (for cmp (eq ne)
--- gcc/testsuite/gcc.dg/tree-ssa/pr94718-4.c.jj        2020-04-30 
12:56:00.552606387 +0200
+++ gcc/testsuite/gcc.dg/tree-ssa/pr94718-4.c   2020-04-30 13:12:57.320699373 
+0200
@@ -0,0 +1,61 @@
+/* PR tree-optimization/94718 */
+/* { dg-do compile } */
+/* { dg-options "-O2 -fno-ipa-icf -fdump-tree-optimized" } */
+/* { dg-final { scan-tree-dump-times "= \[xy]_\[0-9]+\\\(D\\\) \\^ 
\[xy]_\[0-9]+\\\(D\\\);" 8 "optimized" } } */
+/* { dg-final { scan-tree-dump-times "\[0-9]+ < 0;" 8 "optimized" } } */
+
+int
+f1 (int x, int y)
+{
+  return (x < 0) != (y < 0);
+}
+
+int
+f2 (int x, int y)
+{
+  return (x >= 0) != (y >= 0);
+}
+
+int
+f3 (int x, int y)
+{
+  return (x < 0) == (y >= 0);
+}
+
+int
+f4 (int x, int y)
+{
+  return (x >= 0) == (y < 0);
+}
+
+int
+f5 (int x, int y)
+{
+  int s = (x < 0);
+  int t = (y < 0);
+  return s != t;
+}
+
+int
+f6 (int x, int y)
+{
+  int s = (x >= 0);
+  int t = (y >= 0);
+  return s != t;
+}
+
+int
+f7 (int x, int y)
+{
+  int s = (x < 0);
+  int t = (y >= 0);
+  return s == t;
+}
+
+int
+f8 (int x, int y)
+{
+  int s = (x >= 0);
+  int t = (y < 0);
+  return s == t;
+}
--- gcc/testsuite/gcc.dg/tree-ssa/pr94718-5.c.jj        2020-04-30 
13:01:44.893558240 +0200
+++ gcc/testsuite/gcc.dg/tree-ssa/pr94718-5.c   2020-04-30 13:14:00.434768470 
+0200
@@ -0,0 +1,61 @@
+/* PR tree-optimization/94718 */
+/* { dg-do compile } */
+/* { dg-options "-O2 -fno-ipa-icf -fdump-tree-optimized" } */
+/* { dg-final { scan-tree-dump-times "= \[xy]_\[0-9]+\\\(D\\\) \\^ 
\[xy]_\[0-9]+\\\(D\\\);" 8 "optimized" } } */
+/* { dg-final { scan-tree-dump-times "\[0-9]+ >= 0;" 8 "optimized" } } */
+
+int
+f1 (int x, int y)
+{
+  return (x < 0) == (y < 0);
+}
+
+int
+f2 (int x, int y)
+{
+  return (x >= 0) == (y >= 0);
+}
+
+int
+f3 (int x, int y)
+{
+  return (x < 0) != (y >= 0);
+}
+
+int
+f4 (int x, int y)
+{
+  return (x >= 0) != (y < 0);
+}
+
+int
+f5 (int x, int y)
+{
+  int s = (x < 0);
+  int t = (y < 0);
+  return s == t;
+}
+
+int
+f6 (int x, int y)
+{
+  int s = (x >= 0);
+  int t = (y >= 0);
+  return s == t;
+}
+
+int
+f7 (int x, int y)
+{
+  int s = (x < 0);
+  int t = (y >= 0);
+  return s != t;
+}
+
+int
+f8 (int x, int y)
+{
+  int s = (x >= 0);
+  int t = (y < 0);
+  return s != t;
+}

        Jakub

Reply via email to