From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-lf1-x134.google.com (mail-lf1-x134.google.com [IPv6:2a00:1450:4864:20::134]) by sourceware.org (Postfix) with ESMTPS id 4C0883858D32 for ; Mon, 18 Sep 2023 07:08:59 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 4C0883858D32 Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=gmail.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=gmail.com Received: by mail-lf1-x134.google.com with SMTP id 2adb3069b0e04-501eec0a373so6661591e87.3 for ; Mon, 18 Sep 2023 00:08:59 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1695020938; x=1695625738; darn=gcc.gnu.org; h=content-transfer-encoding:cc:to:subject:message-id:date:from :in-reply-to:references:mime-version:from:to:cc:subject:date :message-id:reply-to; bh=qmxUnlguOoc5qqyK/EAkBYbAQIZzvwBqW85bA0gEyA0=; b=FfTqQcZ8Ovn4DUWzujMeI1hHfrYYzaPtJC8XsnzPgqUIpLIlpVDnmWRpS8Nlp+WGVj 0wHqdAZD49IOYAZO1ic+EH4O3bBOusdUC8K2JaxcyATj5PWgH2NL3K4qUHcOKNSzoKdT xNHo3DiQ/bbxrVEN8I3CTnbnZ3LZWh10Qv6h5VmOTgCYTtKAL/WR2NqrjCpqvLbi0Wkd /I+F72BpNKd2y3msiYNIFe+G74oso5LdfPXvEau3udiqloXqDRcKENlTg8xRbrhQdkHu jhCVPoqGwMSgNaJM2D3EJK4Av6ST2pzn6rRkYkF6RkTzrsvJMRL7pLB/MEnyzpN6PuG9 sRJA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1695020938; x=1695625738; h=content-transfer-encoding:cc:to:subject:message-id:date:from :in-reply-to:references:mime-version:x-gm-message-state:from:to:cc :subject:date:message-id:reply-to; bh=qmxUnlguOoc5qqyK/EAkBYbAQIZzvwBqW85bA0gEyA0=; b=JwU7a+B1t4fDPbqPFk/jK35ODCzCyu6H1p3VTvdXQhU8ActYZ0Blr9/1egrH2CD3wv hHJeIn5k5gLApdCBSv8zJlgpWe1wXKCWZVFbRADdBBBZQpnAzuBjf5g2aQD1risFCM5s Ti6lQH4ymwvL9nEXQ3PINTpfGFkCHlGm0cyhVx99mwC8qGQ1dod8rrLqxXGogmfjsYD1 wTQ62BqygGHTFixyXeIdywyAUhGwcH3YIjzK9GTUmArEb89out9orxzmAaZwu2tWCUmu 2auRNLucDmf9ov6hRLbixRX4Cnqzo8v8Fkl2ZLD4X59FXC4yojORYxHCXMPuWt++EivQ g7pQ== X-Gm-Message-State: AOJu0YwZpuWvz5bbOmoJiUmto8LGwXiVou5in0G3xa3+qQCYPPwq7umI Ve/+uVw+Fdz9cAtzC+WqEAh4q8/anp3HUzXD4pA= X-Google-Smtp-Source: AGHT+IGDy3orumDP9LRkmn+EdSOY+cDrDmXpLOFbD3RvEUU3AMu2N8Ml0r/teOo/hIi0dmO0xqVMxlH0pIM/U2mE4Kk= X-Received: by 2002:a05:6512:1050:b0:500:91ac:c0b5 with SMTP id c16-20020a056512105000b0050091acc0b5mr8357569lfb.30.1695020937531; Mon, 18 Sep 2023 00:08:57 -0700 (PDT) MIME-Version: 1.0 References: <20230916054920.1653864-1-apinski@marvell.com> In-Reply-To: <20230916054920.1653864-1-apinski@marvell.com> From: Richard Biener Date: Mon, 18 Sep 2023 09:08:45 +0200 Message-ID: Subject: Re: [PATCH] MATCH: Add simplifications for `(a * zero_one) ==/!= CST` To: Andrew Pinski Cc: gcc-patches@gcc.gnu.org Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable X-Spam-Status: No, score=-7.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 autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org List-Id: On Sat, Sep 16, 2023 at 7:50=E2=80=AFAM Andrew Pinski via Gcc-patches wrote: > > Transforming `(a * b@[0,1]) !=3D 0` into `((cast)b) & a !=3D 0` that isn't strictly a simplification (one more op), and your alternate transform is even worse in this regard. > will produce better code as a lot of the time b is defined > by a comparison. what if not? How does it simplify then? > Also since canonicalize `a & -zero_one` into `a * zero_one` we > start to lose information when doing comparisons against 0. > In the case of PR 110992, we lose that `a !=3D 0` on the branch How so? Ranger should be happy with both forms, no? > and then don't do a jump threading like we should. > > OK? Bootstrapped and tested on x86_64-linux-gnu with no regressions. > > PR tree-optimization/110992 > > gcc/ChangeLog: > > * match.pd (`a * zero_one !=3D/=3D=3D CST`): New pattern. > > gcc/testsuite/ChangeLog: > > * gcc.dg/tree-ssa/vrp116.c: Update test to avoid the > extra comparison. > * gcc.c-torture/execute/pr110992-1.c: New test. > * gcc.dg/tree-ssa/pr110992-1.c: New test. > * gcc.dg/tree-ssa/pr110992-2.c: New test. > --- > gcc/match.pd | 15 +++++++ > .../gcc.c-torture/execute/pr110992-1.c | 43 +++++++++++++++++++ > gcc/testsuite/gcc.dg/tree-ssa/pr110992-1.c | 21 +++++++++ > gcc/testsuite/gcc.dg/tree-ssa/pr110992-2.c | 17 ++++++++ > gcc/testsuite/gcc.dg/tree-ssa/vrp116.c | 2 +- > 5 files changed, 97 insertions(+), 1 deletion(-) > create mode 100644 gcc/testsuite/gcc.c-torture/execute/pr110992-1.c > create mode 100644 gcc/testsuite/gcc.dg/tree-ssa/pr110992-1.c > create mode 100644 gcc/testsuite/gcc.dg/tree-ssa/pr110992-2.c > > diff --git a/gcc/match.pd b/gcc/match.pd > index 39c9c81966a..97405e6a5c3 100644 > --- a/gcc/match.pd > +++ b/gcc/match.pd > @@ -2197,6 +2197,21 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT) > (if (INTEGRAL_TYPE_P (type)) > (bit_and @0 @1))) > > +/* (a * b@[0,1]) =3D=3D CST > + -> > + CST =3D=3D 0 ? (a =3D=3D CST | b =3D=3D 0) : (a =3D=3D CST & b != =3D 0) > + (a * b@[0,1]) !=3D CST > + -> > + CST !=3D 0 ? (a !=3D CST | b =3D=3D 0) : (a !=3D CST & b !=3D 0) = */ > +(for cmp (ne eq) > + (simplify > + (cmp (mult:cs @0 zero_one_valued_p@1) INTEGER_CST@2) > + (if ((cmp =3D=3D EQ_EXPR) ^ (wi::to_wide (@2) !=3D 0)) > + (bit_ior > + (cmp @0 @2) > + (convert (bit_xor @1 { build_one_cst (TREE_TYPE (@1)); }))) > + (bit_and (cmp @0 @2) (convert @1))))) > + > (for cmp (tcc_comparison) > icmp (inverted_tcc_comparison) > /* Fold (((a < b) & c) | ((a >=3D b) & d)) into (a < b ? c : d) & 1. *= / > diff --git a/gcc/testsuite/gcc.c-torture/execute/pr110992-1.c b/gcc/tests= uite/gcc.c-torture/execute/pr110992-1.c > new file mode 100644 > index 00000000000..edb7eb75ef2 > --- /dev/null > +++ b/gcc/testsuite/gcc.c-torture/execute/pr110992-1.c > @@ -0,0 +1,43 @@ > +#define CST 5 > +#define OP !=3D > +#define op_eq =3D=3D > +#define op_ne !=3D > + > +#define function(vol,op, cst) \ > +__attribute__((noipa)) \ > +_Bool func_##op##_##cst##_##vol(vol int a, vol _Bool b) \ > +{ \ > + vol int d =3D (a * b); \ > + return d op_##op cst; \ > +} > + > +#define funcdefs(op,cst) \ > +function(,op,cst) \ > +function(volatile,op,cst) > + > +#define funcs(f) \ > +f(eq,0) \ > +f(eq,1) \ > +f(eq,5) \ > +f(ne,0) \ > +f(ne,1) \ > +f(ne,5) > + > +funcs(funcdefs) > + > +#define test(op,cst) \ > +do { \ > + if(func_##op##_##cst##_(a,b) !=3D func_##op##_##cst##_volatile(a,b))\ > + __builtin_abort(); \ > +} while(0); > + > +int main(void) > +{ > + for(int a =3D -10; a <=3D 10; a++) > + { > + _Bool b =3D 0; > + funcs(test) > + b =3D 1; > + funcs(test) > + } > +} > diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr110992-1.c b/gcc/testsuite/g= cc.dg/tree-ssa/pr110992-1.c > new file mode 100644 > index 00000000000..825fd63f84c > --- /dev/null > +++ b/gcc/testsuite/gcc.dg/tree-ssa/pr110992-1.c > @@ -0,0 +1,21 @@ > +/* { dg-do compile } */ > +/* { dg-options "-O3 -fdump-tree-optimized" } */ > +static unsigned b; > +static short c =3D 4; > +void foo(void); > +static short(a)(short d, short g) { return d * g; } > +void e(); > +static char f() { > + b =3D 0; > + return 0; > +} > +int main() { > + int h =3D b; > + if ((short)(a(c && e, 65535) & h)) { > + foo(); > + h || f(); > + } > +} > + > +/* There should be no calls to foo left. */ > +/* { dg-final { scan-tree-dump-not " foo " "optimized" } } */ > diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr110992-2.c b/gcc/testsuite/g= cc.dg/tree-ssa/pr110992-2.c > new file mode 100644 > index 00000000000..6082949a218 > --- /dev/null > +++ b/gcc/testsuite/gcc.dg/tree-ssa/pr110992-2.c > @@ -0,0 +1,17 @@ > +/* { dg-do compile } */ > +/* { dg-options "-O3 -fdump-tree-optimized" } */ > +static unsigned b; > +static short c =3D 4; > +void foo(void); > +int main() { > + int h =3D b; > + int d =3D c !=3D 0; > + if (h*d) { > + foo(); > + if (!h) b =3D 20; > + } > +} > + > + > +/* There should be no calls to foo left. */ > +/* { dg-final { scan-tree-dump-not " foo " "optimized" } } */ > diff --git a/gcc/testsuite/gcc.dg/tree-ssa/vrp116.c b/gcc/testsuite/gcc.d= g/tree-ssa/vrp116.c > index 9e68a774aee..16b31e320a0 100644 > --- a/gcc/testsuite/gcc.dg/tree-ssa/vrp116.c > +++ b/gcc/testsuite/gcc.dg/tree-ssa/vrp116.c > @@ -6,7 +6,7 @@ f (int m1, int m2, int c) > { > int d =3D m1 > m2; > int e =3D d * c; > - return e ? m1 : m2; > + return e; > } > > /* { dg-final { scan-tree-dump-times "\\? c_\[0-9\]\\(D\\) : 0" 1 "optim= ized" } } */ > -- > 2.31.1 >