From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-ej1-x62f.google.com (mail-ej1-x62f.google.com [IPv6:2a00:1450:4864:20::62f]) by sourceware.org (Postfix) with ESMTPS id 344163857C42 for ; Thu, 14 Jul 2022 06:52:54 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 344163857C42 Received: by mail-ej1-x62f.google.com with SMTP id l23so1696949ejr.5 for ; Wed, 13 Jul 2022 23:52:54 -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=oBdcAm6zuzgU+mgLpzM9nhxDi4/KMWVtCpIkhdOMS1Y=; b=AB92Q+ohRcEuEKL6tcGoxu4yvZT1UqzMkewzcu2Ee1xsG3aQCTkepuHEx4ypBZSSBh 7Vf/SuCNEZTNhcQaFPF7tFEdvOyxqH6N5GHi2y74LHQiYeBEcyAxN0274y5G8/LmnJCA OgavEoc9wuFnRCY2BOlyaJ4XARXzJ0R28g4QPs6SXKA/xFnXvw+5cebNFP6CVb5tYk9O DxJ2eHBF2MfYKNJM8tkmm+ym867r7I8IpcSNWWvPRPXMgosNIFxcLi/PwyXlWu24WJiv 1E//I7RZl9gm3S3Mb0bQKEo97y7wdR9spPqOshjkhJ4m4VaGSxZ3rRTv0mAMNANlwFdK GCIA== X-Gm-Message-State: AJIora+QmrPFmHfFcVOx9l0g9ZCXZh2Q9rTJJPkZem3pa8AJPUHd+89f zfdWabrHAk/mfQZ68fSDjJ/eoD/oEWuGIpPaCS8= X-Google-Smtp-Source: AGRyM1ujfhmvtCCGtBC4MQNXDOwSsiAPZcpK1KTr0RYDFLnTU/qFH0KNgu1xbL7HPkSPxkQhvqZJP61mHpfJ3NDqYuk= X-Received: by 2002:a17:907:7209:b0:72b:924b:60a8 with SMTP id dr9-20020a170907720900b0072b924b60a8mr7534414ejc.442.1657781572933; Wed, 13 Jul 2022 23:52:52 -0700 (PDT) MIME-Version: 1.0 References: <20220713192420.3126654-1-sfeifer@redhat.com> In-Reply-To: From: Richard Biener Date: Thu, 14 Jul 2022 08:52:40 +0200 Message-ID: Subject: Re: [PATCH] match.pd: Add new abs pattern [PR94290] To: Andrew Pinski Cc: Sam Feifer , GCC Patches Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable X-Spam-Status: No, score=-8.3 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 06:52:56 -0000 On Wed, Jul 13, 2022 at 9:36 PM Andrew Pinski via Gcc-patches wrote: > > 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 opt= imizes (x >=3D 0 ? x : 0) + (x <=3D 0 ? -x : 0) to just abs(x). I had to wr= ite a second simplification in match.pd to handle the commutative property = 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 other si= mplification 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. Note :s will be ineffective since the result is "simple", I think it is OK to do this simplification even when the max are not dead after the transform. > > 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 simpli= fication. > > * 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/test= suite/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.dg/pr= 94290-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/pr94= 290.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 > >