From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-lj1-x236.google.com (mail-lj1-x236.google.com [IPv6:2a00:1450:4864:20::236]) by sourceware.org (Postfix) with ESMTPS id 760FE3858D38 for ; Wed, 1 Feb 2023 07:58:47 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 760FE3858D38 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-lj1-x236.google.com with SMTP id h4so743919lja.2 for ; Tue, 31 Jan 2023 23:58:47 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:from:to:cc:subject:date:message-id:reply-to; bh=JbrsnK+sGmTCIeRoDcAixhSc1tDW30DJtiDJ/DnSezw=; b=oCNR8oqMYCeQeIGGgHUz6z/KpXB6SuW1/QC2K/T6A5xCcGtv2v3uO2tkEu0OKHhcrA fhayQJFTMlOlFOOCc5fbNru5bGimh2c+Y2eIULXYNMz2TOnHnqalTE0brzbW3tBt367Y GQD7/UBSDNwcwMTVo5eM/t1jEcGoVFwM1RzIPZcDZiodnRdvpasEb5L+jCtkkCpFEdXY NzWrQDo/bI3qKR2m4EhsDjhPu8FYL8F3xw319f1dRrmFG+g2e1/686cent/ZLPJfLSGy wdUijJV0yNg4coBEW80ZJYWW3g/YaoS6li7Tnk6LHT4hixaicIlykiGOgpMK6v5Nr2Se 97pg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=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=JbrsnK+sGmTCIeRoDcAixhSc1tDW30DJtiDJ/DnSezw=; b=GyKUOKMwndMITkyoXAyr5ppCwMHd8Vf0UMvKDERcjpdewFnCV1I5QGntD4MfkQbgJj luGO+CGe6OhfkwM4Q2z+NxDf6I+Jqv1yPQEI6mRTGia1z+aEudiefy6CR+vjnU78Ejfn IEQ6YkCZFQ5uYPYhFgQjdkq5brbbpCKdR/2AYUVTqZdXRchzEQJE0JiWI04MFQUnl4jd cUyRlIeny+a2EdXBkLqpsnAVvRJnRwtAmSJiPFWlCqnOlcv27d1JfTWv06BdGmP+/dNl mu8LU3lCLDZX+XfLt66LdGjGAj9FH2rOhCu4fL+ZjNGRbfNN1ogDemuww6XzA8EHZ4yP 4swA== X-Gm-Message-State: AO0yUKUP/p943xTTMQvB60DA/p32iY3LMYg6TK8tPAoaIRAdAAxLzJ1s enVunFT5DRYFWshpwn6+HVkK6Tb66EnxJvJR0b7K8Hcy X-Google-Smtp-Source: AK7set/rPDaINp/LxkaBZzVE+wd/h7M1GBRYkRH9QeVQnGvJs1/T29aDTGDU8f4rIi4tf+OkCqMc48N2ochaxqsB9qU= X-Received: by 2002:a2e:910b:0:b0:28e:1ca4:b62 with SMTP id m11-20020a2e910b000000b0028e1ca40b62mr162420ljg.97.1675238325577; Tue, 31 Jan 2023 23:58:45 -0800 (PST) MIME-Version: 1.0 References: <20230201012919.1301588-1-apinski@marvell.com> In-Reply-To: <20230201012919.1301588-1-apinski@marvell.com> From: Richard Biener Date: Wed, 1 Feb 2023 08:58:33 +0100 Message-ID: Subject: Re: [PATCH] Simplify "1 - bool_val" to "bool_val ^ 1" To: Andrew Pinski Cc: gcc-patches@gcc.gnu.org Content-Type: text/plain; charset="UTF-8" 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 Wed, Feb 1, 2023 at 2:30 AM Andrew Pinski via Gcc-patches wrote: > > For bool values, it is easier to deal with > xor 1 rather than having 1 - a. This is because > we are more likely to simplify the xor further in many > cases. > > This is a special case for (MASK - b) where MASK > is a powerof2 - 1 and b <= MASK but only for bool > ranges ([0,1]) as that is the main case where the > difference comes into play. > > Note this is enabled for gimple folding only > as the ranges are only know while doing gimple > folding and cfun is not always set when fold is called. Can we robustify ssa_name_has_boolean_range_p instead? I see it's called even from GENERIC folding in match.pd already. Otherwise OK. Thanks, Richard. > > OK? Bootstrapped and tested on x86_64-linux-gnu with no > regressions. > > gcc/ChangeLog: > > PR tree-optimization/108355 I think this should be 108354? > PR tree-optimization/96921 > * match.pd: Add pattern for "1 - bool_val". > > gcc/testsuite/ChangeLog: > > PR tree-optimization/108355 > PR tree-optimization/96921 > * gcc.dg/tree-ssa/bool-minus-1.c: New test. > * gcc.dg/tree-ssa/bool-minus-2.c: New test. > * gcc.dg/tree-ssa/pr108354-1.c: New test. > --- > gcc/match.pd | 13 ++++++++ > gcc/testsuite/gcc.dg/tree-ssa/bool-minus-1.c | 11 +++++++ > gcc/testsuite/gcc.dg/tree-ssa/bool-minus-2.c | 33 ++++++++++++++++++++ > gcc/testsuite/gcc.dg/tree-ssa/pr108354-1.c | 26 +++++++++++++++ > 4 files changed, 83 insertions(+) > create mode 100644 gcc/testsuite/gcc.dg/tree-ssa/bool-minus-1.c > create mode 100644 gcc/testsuite/gcc.dg/tree-ssa/bool-minus-2.c > create mode 100644 gcc/testsuite/gcc.dg/tree-ssa/pr108354-1.c > > diff --git a/gcc/match.pd b/gcc/match.pd > index f605b798c44..c9e8bebede2 100644 > --- a/gcc/match.pd > +++ b/gcc/match.pd > @@ -1732,6 +1732,19 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT) > (if (!FIXED_POINT_TYPE_P (type)) > (plus @0 (negate @1)))) > > +#if GIMPLE > +/* 1 - a is a ^ 1 if a had a bool range. */ > +/* This is only enabled for gimple as sometimes > + cfun is not set for the function which contains > + the SSA_NAME (e.g. while IPA passes are happening, > + fold might be called). */ > +(simplify > + (minus integer_onep@0 SSA_NAME@1) > + (if (INTEGRAL_TYPE_P (type) > + && ssa_name_has_boolean_range (@1)) > + (bit_xor @1 @0))) > +#endif > + > /* Other simplifications of negation (c.f. fold_negate_expr_1). */ > (simplify > (negate (mult:c@0 @1 negate_expr_p@2)) > diff --git a/gcc/testsuite/gcc.dg/tree-ssa/bool-minus-1.c b/gcc/testsuite/gcc.dg/tree-ssa/bool-minus-1.c > new file mode 100644 > index 00000000000..e434ff9507a > --- /dev/null > +++ b/gcc/testsuite/gcc.dg/tree-ssa/bool-minus-1.c > @@ -0,0 +1,11 @@ > +/* { dg-options "-O2 -fdump-tree-optimized" } */ > +_Bool > +foo (_Bool a) > +{ > + int c = 1 - a; > + return c; > +} > + > +/* { dg-final { scan-tree-dump-times "1 - " 0 "optimized" } } */ > +/* { dg-final { scan-tree-dump-times "~a" 1 "optimized" } } */ > + > diff --git a/gcc/testsuite/gcc.dg/tree-ssa/bool-minus-2.c b/gcc/testsuite/gcc.dg/tree-ssa/bool-minus-2.c > new file mode 100644 > index 00000000000..b77d36c1d3c > --- /dev/null > +++ b/gcc/testsuite/gcc.dg/tree-ssa/bool-minus-2.c > @@ -0,0 +1,33 @@ > +/* { dg-options "-O2 -fdump-tree-optimized" } */ > +_Bool > +foo (_Bool a, _Bool b) > +{ > + int c = 1 - a; > + int d = 1 - b; > + int e = c & d; > + return 1 - e; > +} > + > +_Bool > +bar (_Bool a, _Bool b) > +{ > + int c = 1 - a; > + int d = 1 - b; > + _Bool e = c & d; > + return 1 - e; > +} > + > +_Bool > +baz (_Bool a, _Bool b) > +{ > + _Bool c = 1 - a; > + _Bool d = 1 - b; > + _Bool e = c & d; > + return 1 - e; > +} > + > +/* { dg-final { scan-tree-dump-times "1 - " 0 "optimized" } } */ > +/* { dg-final { scan-tree-dump-times "~a" 0 "optimized" } } */ > +/* { dg-final { scan-tree-dump-times "~b" 0 "optimized" } } */ > +/* { dg-final { scan-tree-dump-times "a_\[0-9\]+.D. \\\| b_\[0-9\]+.D." 3 "optimized" } } */ > + > diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr108354-1.c b/gcc/testsuite/gcc.dg/tree-ssa/pr108354-1.c > new file mode 100644 > index 00000000000..60d1dbc281e > --- /dev/null > +++ b/gcc/testsuite/gcc.dg/tree-ssa/pr108354-1.c > @@ -0,0 +1,26 @@ > +/* { dg-options "-O2 -fdump-tree-optimized" } */ > + > +int b; > +int *c; > +int e; > +static int *f = &e; > +int g; > +void foo(); > +short(a)(short h, short i) { return h - i; } > +int(d)(int h) { return h == 83647 ? 0 : -h; } > +int main() { > + short j; > + int *k = &e, *l = &b; > + *f = 0 == c; > + j = a(0 != 2, *k); > + if (d(j ^ (0 == l || *k)) != *k) > + ; > + else > + foo(); > + c = &g; > +} > + > +/* { dg-final { scan-tree-dump-times " 1 - " 0 "optimized" } } */ > +/* There should be no calls to foo. */ > +/* { dg-final { scan-tree-dump-times "foo " 0 "optimized" } } */ > + > -- > 2.17.1 >