On Thu, 30 Apr 2020, Jakub Jelinek wrote:

> 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)))))

Can you also add a comment for the ones below?  OK with that change.

> +(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
> 
> 

-- 
Richard Biener <rguent...@suse.de>
SUSE Software Solutions Germany GmbH, Maxfeldstrasse 5, 90409 Nuernberg,
Germany; GF: Felix Imendörffer; HRB 36809 (AG Nuernberg)

Reply via email to