From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: by sourceware.org (Postfix, from userid 1251) id 4ADB23858C66; Thu, 12 Jan 2023 21:49:15 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 4ADB23858C66 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gcc.gnu.org; s=default; t=1673560155; bh=BK1+CxOgZU7Jn3jLDQHz5dnRPl6UCeTMMaEWKpajKfQ=; h=From:To:Subject:Date:From; b=Df6OZ85J8gKWDhBX8Y2HK7iWQ0oeyGRfEoLUd9F0MjC1qEf6OfbR6TqjiwnvYQ5ik VCS1SX1UYHUShrPWnkvFre/BXFnLZNN+Ky22e8kvpXOFnc37YeqZ5HPl6ihkjfn2Da NQQSc0PlPqUZNgrlQviyJ8izxdOMyOo7E6vjKLDM= MIME-Version: 1.0 Content-Transfer-Encoding: 7bit Content-Type: text/plain; charset="utf-8" From: Roger Sayle To: gcc-cvs@gcc.gnu.org Subject: [gcc r13-5128] PR tree-optimization/92342: Optimize b & -(a==c) in match.pd X-Act-Checkin: gcc X-Git-Author: Roger Sayle X-Git-Refname: refs/heads/master X-Git-Oldrev: f629f63d2d9d7ad2c43f8e451f0f6e32b5f4d06a X-Git-Newrev: fd1f5373b8647a5da2f7f4b42282e676a4b04d98 Message-Id: <20230112214915.4ADB23858C66@sourceware.org> Date: Thu, 12 Jan 2023 21:49:15 +0000 (GMT) List-Id: https://gcc.gnu.org/g:fd1f5373b8647a5da2f7f4b42282e676a4b04d98 commit r13-5128-gfd1f5373b8647a5da2f7f4b42282e676a4b04d98 Author: Roger Sayle Date: Thu Jan 12 21:47:40 2023 +0000 PR tree-optimization/92342: Optimize b & -(a==c) in match.pd This patch is an update/tweak of Andrew Pinski's two patches for PR tree-optimization/92342, that were originally posted by in November: https://gcc.gnu.org/pipermail/gcc-patches/2021-November/585111.html https://gcc.gnu.org/pipermail/gcc-patches/2021-November/585112.html Technically, the first of those was approved by Richard Biener, though never committed, and my first thought was to simply push it for Andrew, but the review of the second piece expressed concerns over comparisons in non-integral modes, where the result may not be zero-one valued. Indeed both transformations misbehave in the presence of vector mode comparisons (these transformations are already implemented for vec_cond elsewhere in match.pd), so my minor contribution is to limit these new transformations to scalars, by testing that both the operands and results are INTEGRAL_TYPE_P. 2023-01-12 Andrew Pinski Roger Sayle gcc/ChangeLog: PR tree-optimization/92342 * match.pd ((m1 CMP m2) * d -> (m1 CMP m2) ? d : 0): Use tcc_comparison and :c for the multiply. (b & -(a CMP c) -> (a CMP c)?b:0): New pattern. gcc/testsuite/ChangeLog: PR tree-optimization/92342 * gcc.dg/tree-ssa/andnegcmp-1.c: New test. * gcc.dg/tree-ssa/andnegcmp-2.c: New test. * gcc.dg/tree-ssa/multcmp-1.c: New test. * gcc.dg/tree-ssa/multcmp-2.c: New test. Diff: --- gcc/match.pd | 16 +++++++++++++--- gcc/testsuite/gcc.dg/tree-ssa/andnegcmp-1.c | 14 ++++++++++++++ gcc/testsuite/gcc.dg/tree-ssa/andnegcmp-2.c | 14 ++++++++++++++ gcc/testsuite/gcc.dg/tree-ssa/multcmp-1.c | 12 ++++++++++++ gcc/testsuite/gcc.dg/tree-ssa/multcmp-2.c | 12 ++++++++++++ 5 files changed, 65 insertions(+), 3 deletions(-) diff --git a/gcc/match.pd b/gcc/match.pd index d1601567770..56ac743aa6d 100644 --- a/gcc/match.pd +++ b/gcc/match.pd @@ -2076,10 +2076,20 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT) /* (m1 CMP m2) * d -> (m1 CMP m2) ? d : 0 */ (if (!canonicalize_math_p ()) - (for cmp (gt lt ge le) + (for cmp (tcc_comparison) (simplify - (mult (convert (cmp @0 @1)) @2) - (cond (cmp @0 @1) @2 { build_zero_cst (type); })))) + (mult:c (convert (cmp@0 @1 @2)) @3) + (if (INTEGRAL_TYPE_P (type) + && INTEGRAL_TYPE_P (TREE_TYPE (@0))) + (cond @0 @3 { build_zero_cst (type); }))) +/* (-(m1 CMP m2)) & d -> (m1 CMP m2) ? d : 0 */ + (simplify + (bit_and:c (negate (convert (cmp@0 @1 @2))) @3) + (if (INTEGRAL_TYPE_P (type) + && INTEGRAL_TYPE_P (TREE_TYPE (@0))) + (cond @0 @3 { build_zero_cst (type); }))) + ) +) /* For integral types with undefined overflow and C != 0 fold x * C EQ/NE y * C into x EQ/NE y. */ diff --git a/gcc/testsuite/gcc.dg/tree-ssa/andnegcmp-1.c b/gcc/testsuite/gcc.dg/tree-ssa/andnegcmp-1.c new file mode 100644 index 00000000000..6f16783f169 --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-ssa/andnegcmp-1.c @@ -0,0 +1,14 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -fdump-tree-optimized" } */ +/* PR tree-optimization/92342 */ + +int +f (int m1, int m2, int c) +{ + int d = m1 == m2; + d = -d; + int e = d & c; + return e; +} + +/* { dg-final { scan-tree-dump-times "\\? c_\[0-9\]\\(D\\) : 0" 1 "optimized" } } */ diff --git a/gcc/testsuite/gcc.dg/tree-ssa/andnegcmp-2.c b/gcc/testsuite/gcc.dg/tree-ssa/andnegcmp-2.c new file mode 100644 index 00000000000..0e25c8abc39 --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-ssa/andnegcmp-2.c @@ -0,0 +1,14 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -fdump-tree-optimized" } */ +/* PR tree-optimization/92342 */ + +int +f (int m1, int m2, int c) +{ + int d = m1 < m2; + d = -d; + int e = c & d; + return e; +} + +/* { dg-final { scan-tree-dump-times "\\? c_\[0-9\]\\(D\\) : 0" 1 "optimized" } } */ diff --git a/gcc/testsuite/gcc.dg/tree-ssa/multcmp-1.c b/gcc/testsuite/gcc.dg/tree-ssa/multcmp-1.c new file mode 100644 index 00000000000..fb44cacde77 --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-ssa/multcmp-1.c @@ -0,0 +1,12 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -fdump-tree-optimized" } */ + +int +f (int m1, int m2, int c) +{ + int d = m1 == m2; + int e = d * c; + return e; +} + +/* { dg-final { scan-tree-dump-times "\\? c_\[0-9\]\\(D\\) : 0" 1 "optimized" } } */ diff --git a/gcc/testsuite/gcc.dg/tree-ssa/multcmp-2.c b/gcc/testsuite/gcc.dg/tree-ssa/multcmp-2.c new file mode 100644 index 00000000000..be38b2e0044 --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-ssa/multcmp-2.c @@ -0,0 +1,12 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -fdump-tree-optimized" } */ + +int +f (int m1, int m2, int c) +{ + int d = m1 != m2; + int e = c * d; + return e; +} + +/* { dg-final { scan-tree-dump-times "\\? c_\[0-9\]\\(D\\) : 0" 1 "optimized" } } */