From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-io1-xd2c.google.com (mail-io1-xd2c.google.com [IPv6:2607:f8b0:4864:20::d2c]) by sourceware.org (Postfix) with ESMTPS id 5257B3858D37 for ; Thu, 14 Jul 2022 19:54:03 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 5257B3858D37 Received: by mail-io1-xd2c.google.com with SMTP id n7so2302389ioo.7 for ; Thu, 14 Jul 2022 12:54:03 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc:content-transfer-encoding; bh=1FngTYDJw5LQkRJUzpZFHXjDI1kl8td45Brvezujldg=; b=x4Y+Xn1Ai8+H0OwToseGx+DHyMai4gSD1Ljw3TcxLK2IoXXdNMjUl8VuB31TDthK0T 2Rf5n0lKCYqoffbLQwmGquZWQg8BW8NodUa5Ij4LI+woXguQYZJMZcG2yWRkR1Q15UhN e9b/ZoJ73mVUZDWUJRS1tQO6DpzXzVoUvLYLTp9z9vQmDGIoOYe+CC/vEtWS7N6KsHuG IrjCZEwGIK5USZnffljK0MJj7QbRKFQ5pEfKRmeyorahhYZDXRj5sw4mE2MkOZogMIQ9 g1V0oovvusKBeq+JCslkKsy/2KSpoCwhbS4hKc00gts6i83EOF6p0MkMIEIF8nOp9Qrm Q6Ig== X-Gm-Message-State: AJIora8KVNZZ8fq/5KztfpdIV2hnn3PNQQsiro5JU6UDpTjvaQQ5mBfE acGrQLov2kWNVV5irzbGNETriDKap6AKjFW0wH5tgkqG X-Google-Smtp-Source: AGRyM1vsD0L5o6WUMbCazJo35q8mae8RydZrTaQgm3OOF55xge/Oh1+q4d1dcccV+gADxJSk5dofxg3JBBn5ZbmGEPA= X-Received: by 2002:a05:6638:24c8:b0:33c:f519:6ee5 with SMTP id y8-20020a05663824c800b0033cf5196ee5mr5807487jat.207.1657828442376; Thu, 14 Jul 2022 12:54:02 -0700 (PDT) MIME-Version: 1.0 References: <20220713192420.3126654-1-sfeifer@redhat.com> In-Reply-To: From: Andrew Pinski Date: Thu, 14 Jul 2022 12:53:50 -0700 Message-ID: Subject: Re: [PATCH] match.pd: Add new abs pattern [PR94290] To: Sam Feifer Cc: GCC Patches Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable X-Spam-Status: No, score=-7.7 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, FREEMAIL_FROM, GIT_PATCH_0, RCVD_IN_DNSWL_NONE, SPF_HELO_NONE, SPF_PASS, TXREP, T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org X-BeenThere: gcc-patches@gcc.gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gcc-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 14 Jul 2022 19:54:05 -0000 On Thu, Jul 14, 2022 at 12:38 PM Sam Feifer wrote: > > > > On Thu, Jul 14, 2022 at 1:24 PM Andrew Pinski wrote: >> >> On Thu, Jul 14, 2022 at 7:09 AM Sam Feifer wrote: >> > >> > >> > On Wed, Jul 13, 2022 at 3:36 PM Andrew Pinski wrot= e: >> >> >> >> On Wed, Jul 13, 2022 at 12:26 PM Sam Feifer via Gcc-patches >> >> wrote: >> >> > >> >> > This patch is intended to fix a missed optimization in match.pd. It= optimizes (x >=3D 0 ? x : 0) + (x <=3D 0 ? -x : 0) to just abs(x). I had t= o write a second simplification in match.pd to handle the commutative prope= rty as the match was not ocurring otherwise. Additionally, the pattern (x <= =3D 0 ? -x : 0) now gets optimized to max(-x, 0), which helps with the othe= r simplification rule. >> >> >> >> You could use :c for the commutative property instead and that should >> >> simplify things. >> >> That is: >> >> >> >> (simplify >> >> (plus:c (max @0 integer_zerop) (max (negate @0) integer_zerop)) >> >> (abs @0)) >> >> >> >> Also since integer_zerop works on vectors, it seems like you should >> >> add a testcase or two for the vector case. >> >> Also would be useful if you write a testcase that uses different >> >> statements rather than one big one so it gets exercised in the >> >> forwprop case. >> >> Note also if either of the max are used more than just in this >> >> simplification, it could increase the lifetime of @0, maybe you need >> >> to add :s to the max expressions. >> >> >> > >> > Thanks for the feedback. I'm not quite sure what a vector test case wo= uld look like for this. Could I get some guidance on that? >> >> Yes this should produce the pattern at forwprop1 time (with the C++ >> front-end, the C front-end does not support vector selects): >> typedef int __attribute__((vector_size(4*sizeof(int)))) vint; >> >> vint foo(vint x) { >> vint t =3D (x >=3D 0 ? x : 0) ; >> vint xx =3D -x; >> vint t1 =3D (xx >=3D 0 ? xx : 0); >> return t + t1; >> } >> >> int foo(int x) { >> int t =3D (x >=3D 0 ? x : 0) ; >> int xx =3D -x; >> int t1 =3D (xx >=3D 0 ? xx : 0); >> return t + t1; >> } >> >> Thanks, >> Andrew Pinski >> > > Thanks for the help. I'm still having trouble with the vector test, thoug= h. When I try to compile, I get an error saying "used vector type where sca= lar is required", referring to the max expressions. How do I use the max ex= pression with two vectors as the inputs? As I mentioned it only works with the C++ front-end :). The C front-end does not support ?: with vectors types. Thanks, Andrew Pinski > > Thanks > -Sam >> >> >> > >> > Thanks >> > -Sam >> > >> >> >> >> Thanks, >> >> Andrew >> >> >> >> > >> >> > Tests are also included to be added to the testsuite. >> >> > >> >> > Bootstrapped/regtested on x86_64-pc-linux-gnu, ok for trunk? >> >> > >> >> > PR tree-optimization/94290 >> >> > >> >> > gcc/ChangeLog: >> >> > >> >> > * match.pd (x >=3D 0 ? x : 0) + (x <=3D 0 ? -x : 0): New si= mplification. >> >> > * match.pd (x <=3D 0 ? -x : 0): New Simplification. >> >> > >> >> > gcc/testsuite/ChangeLog: >> >> > >> >> > * gcc.c-torture/execute/pr94290-1.c: New test. >> >> > * gcc.dg/pr94290-2.c: New test. >> >> > * gcc.dg/pr94290.c: New test. >> >> > --- >> >> > gcc/match.pd | 15 ++++++ >> >> > .../gcc.c-torture/execute/pr94290-1.c | 16 +++++++ >> >> > gcc/testsuite/gcc.dg/pr94290-2.c | 15 ++++++ >> >> > gcc/testsuite/gcc.dg/pr94290.c | 46 +++++++++++++++= ++++ >> >> > 4 files changed, 92 insertions(+) >> >> > create mode 100644 gcc/testsuite/gcc.c-torture/execute/pr94290-1.c >> >> > create mode 100644 gcc/testsuite/gcc.dg/pr94290-2.c >> >> > create mode 100644 gcc/testsuite/gcc.dg/pr94290.c >> >> > >> >> > diff --git a/gcc/match.pd b/gcc/match.pd >> >> > index 45aefd96688..55ca79d7ac9 100644 >> >> > --- a/gcc/match.pd >> >> > +++ b/gcc/match.pd >> >> > @@ -7848,3 +7848,18 @@ and, >> >> > (if (TYPE_UNSIGNED (TREE_TYPE (@0))) >> >> > (bit_and @0 @1) >> >> > (cond (le @0 @1) @0 (bit_and @0 @1)))))) >> >> > + >> >> > +/* (x >=3D 0 ? x : 0) + (x <=3D 0 ? -x : 0) -> abs x. */ >> >> > +(simplify >> >> > + (plus (max @0 integer_zerop) (max (negate @0) integer_zerop)) >> >> > + (abs @0)) >> >> > + >> >> > +/* (x <=3D 0 ? -x : 0) + (x >=3D 0 ? x : 0) -> abs x. */ >> >> > +(simplify >> >> > + (plus (max (negate @0) integer_zerop) (max @0 integer_zerop) ) >> >> > + (abs @0)) >> >> > + >> >> > +/* (x <=3D 0 ? -x : 0) -> max(-x, 0). */ >> >> > +(simplify >> >> > + (cond (le @0 integer_zerop@1) (negate @0) integer_zerop@1) >> >> > + (max (negate @0) @1)) >> >> > diff --git a/gcc/testsuite/gcc.c-torture/execute/pr94290-1.c b/gcc/= testsuite/gcc.c-torture/execute/pr94290-1.c >> >> > new file mode 100644 >> >> > index 00000000000..93b80d569aa >> >> > --- /dev/null >> >> > +++ b/gcc/testsuite/gcc.c-torture/execute/pr94290-1.c >> >> > @@ -0,0 +1,16 @@ >> >> > +/* PR tree-optimization/94290 */ >> >> > + >> >> > +#include "../../gcc.dg/pr94290.c" >> >> > + >> >> > +int main() { >> >> > + >> >> > + if (foo(0) !=3D 0 >> >> > + || foo(-42) !=3D 42 >> >> > + || foo(42) !=3D 42 >> >> > + || baz(-10) !=3D 10 >> >> > + || baz(-10) !=3D 10) { >> >> > + __builtin_abort(); >> >> > + } >> >> > + >> >> > + return 0; >> >> > +} >> >> > diff --git a/gcc/testsuite/gcc.dg/pr94290-2.c b/gcc/testsuite/gcc.d= g/pr94290-2.c >> >> > new file mode 100644 >> >> > index 00000000000..ea6e55755f5 >> >> > --- /dev/null >> >> > +++ b/gcc/testsuite/gcc.dg/pr94290-2.c >> >> > @@ -0,0 +1,15 @@ >> >> > +/* PR tree-optimization/94290 */ >> >> > +/* { dg-do compile } */ >> >> > +/* { dg-options "-O2 -fdump-tree-optimized" } */ >> >> > + >> >> > +/* Form from PR. */ >> >> > +__attribute__((noipa)) unsigned int foo(int x) { >> >> > + return x <=3D 0 ? -x : 0; >> >> > +} >> >> > + >> >> > +/* Changed order. */ >> >> > +__attribute__((noipa)) unsigned int bar(int x) { >> >> > + return 0 >=3D x ? -x : 0; >> >> > +} >> >> > + >> >> > +/* { dg-final {scan-tree-dump-times " MAX_EXPR " 2 "optimized" } }= */ >> >> > diff --git a/gcc/testsuite/gcc.dg/pr94290.c b/gcc/testsuite/gcc.dg/= pr94290.c >> >> > new file mode 100644 >> >> > index 00000000000..47617c36c02 >> >> > --- /dev/null >> >> > +++ b/gcc/testsuite/gcc.dg/pr94290.c >> >> > @@ -0,0 +1,46 @@ >> >> > +/* PR tree-optimization/94290 */ >> >> > +/* { dg-do compile } */ >> >> > +/* { dg-options "-O2 -fdump-tree-optimized" } */ >> >> > + >> >> > + >> >> > +/* Same form as PR. */ >> >> > +__attribute__((noipa)) unsigned int foo(int x) { >> >> > + return (x >=3D 0 ? x : 0) + (x <=3D 0 ? -x : 0); >> >> > +} >> >> > + >> >> > +/* Signed function. */ >> >> > +__attribute__((noipa)) int bar(int x) { >> >> > + return (x >=3D 0 ? x : 0) + (x <=3D 0 ? -x : 0); >> >> > +} >> >> > + >> >> > +/* Commutative property. */ >> >> > +__attribute__((noipa)) unsigned int baz(int x) { >> >> > + return (x <=3D 0 ? -x : 0) + (x >=3D 0 ? x : 0); >> >> > +} >> >> > + >> >> > +/* Flipped order for max expressions. */ >> >> > +__attribute__((noipa)) unsigned int quux(int x) { >> >> > + return (0 <=3D x ? x : 0) + (0 >=3D x ? -x : 0); >> >> > +} >> >> > + >> >> > +/* Not zero so should not optimize. */ >> >> > +__attribute__((noipa)) unsigned int waldo(int x) { >> >> > + return (x >=3D 4 ? x : 4) + (x <=3D 4 ? -x : 4); >> >> > +} >> >> > + >> >> > +/* Not zero so should not optimize. */ >> >> > +__attribute__((noipa)) unsigned int fred(int x) { >> >> > + return (x >=3D -4 ? x : -4) + (x <=3D -4 ? -x : -4); >> >> > +} >> >> > + >> >> > +/* Incorrect pattern. */ >> >> > +__attribute__((noipa)) unsigned int goo(int x) { >> >> > + return (x <=3D 0 ? x : 0) + (x >=3D 0 ? -x : 0); >> >> > +} >> >> > + >> >> > +/* Incorrect pattern. */ >> >> > +__attribute__((noipa)) int qux(int x) { >> >> > + return (x >=3D 0 ? x : 0) + (x >=3D 0 ? x : 0); >> >> > +} >> >> > + >> >> > +/* { dg-final {scan-tree-dump-times " ABS_EXPR " 4 "optimized" } }= */ >> >> > >> >> > base-commit: 6af530f914801f5e561057da55c41480f28751f7 >> >> > -- >> >> > 2.31.1 >> >> > >> >> >>