match.pd: Optimize (x < 0) != (y < 0) into (x ^ y) < 0 [PR94718]
authorJakub Jelinek <jakub@redhat.com>
Mon, 4 May 2020 09:03:32 +0000 (11:03 +0200)
committerJakub Jelinek <jakub@redhat.com>
Mon, 4 May 2020 09:03:32 +0000 (11:03 +0200)
The following patch (on top of the two other PR94718 patches) performs the
actual optimization requested in the PR.

2020-05-04  Jakub Jelinek  <jakub@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/ChangeLog
gcc/match.pd
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/tree-ssa/pr94718-4.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/tree-ssa/pr94718-5.c [new file with mode: 0644]

index 036a40303087d0bb627b901054fec642018e534b..fae7ece376a525b5fc0d1686669b38cbdf4fe675 100644 (file)
@@ -1,5 +1,8 @@
 2020-05-04  Jakub Jelinek  <jakub@redhat.com>
 
+       PR tree-optimization/94718
+       * match.pd ((X < 0) != (Y < 0) into (X ^ Y) < 0): New simplification.
+
        PR tree-optimization/94718
        * match.pd (bitop (convert @0) (convert? @1)): For GIMPLE, if we can,
        replace two nop conversions on bit_{and,ior,xor} argument
index 929be14e8b7dfdd2ce9545bd9cee953cb99d32ec..9c1e23984d600089370ca59880bf0889383a3278 100644 (file)
@@ -4358,6 +4358,30 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT)
   (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)))))
+/* (X < 0) == (Y >= 0) into (X ^ Y) < 0.
+   (X < 0) != (Y >= 0) into (X ^ Y) >= 0.  */
+(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)
index 09979b5749c7fad642d4ce81395943beab03b52d..2fedff399fb7cfeb8e7eca2e6bec5c7837f1dadf 100644 (file)
@@ -1,5 +1,9 @@
 2020-05-04  Jakub Jelinek  <jakub@redhat.com>
 
+       PR tree-optimization/94718
+       * gcc.dg/tree-ssa/pr94718-4.c: New test.
+       * gcc.dg/tree-ssa/pr94718-5.c: New test.
+
        PR tree-optimization/94718
        * gcc.dg/tree-ssa/pr94718-3.c: New test.
 
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr94718-4.c b/gcc/testsuite/gcc.dg/tree-ssa/pr94718-4.c
new file mode 100644 (file)
index 0000000..8b9c109
--- /dev/null
@@ -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;
+}
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr94718-5.c b/gcc/testsuite/gcc.dg/tree-ssa/pr94718-5.c
new file mode 100644 (file)
index 0000000..4bd3732
--- /dev/null
@@ -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;
+}