From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail3-relais-sop.national.inria.fr (mail3-relais-sop.national.inria.fr [192.134.164.104]) by sourceware.org (Postfix) with ESMTPS id BAAF33861035 for ; Tue, 11 May 2021 08:11:28 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.3.2 sourceware.org BAAF33861035 Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=inria.fr Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=marc.glisse@inria.fr IronPort-HdrOrdr: =?us-ascii?q?A9a23=3AXW3CJqPH+X23EcBcTtyjsMiBIKoaSvp037BL?= =?us-ascii?q?7TETdfU7SL38qynDppomPHzP6Ar5JktQ++xoUZPoKRi3yXcS2+gs1NyZMDUO1l?= =?us-ascii?q?HEEGgb1+Tf/wE=3D?= X-IronPort-AV: E=Sophos;i="5.82,290,1613430000"; d="scan'208";a="381112945" Received: from 85-171-189-19.rev.numericable.fr (HELO hippo) ([85.171.189.19]) by mail3-relais-sop.national.inria.fr with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 11 May 2021 10:11:27 +0200 Date: Tue, 11 May 2021 10:11:23 +0200 (CEST) From: Marc Glisse Reply-To: gcc-patches@gcc.gnu.org To: Jakub Jelinek cc: gcc-patches@gcc.gnu.org, Jonathan Wakely , Richard Biener Subject: Re: [PATCH] match.pd: Optimize (x & y) == x into (x & ~y) == 0 [PR94589] In-Reply-To: <20210511073405.GE1179226@tucnak> Message-ID: References: <20210504074413.GI1179226@tucnak> <20210505165227.GT1179226@tucnak> <20210506102230.GY1179226@tucnak> <4139aa5f-e3c3-c1ce-7fc3-a1e41a4d4c20@hippo.saclay.inria.fr> <20210511073405.GE1179226@tucnak> MIME-Version: 1.0 Content-Type: text/plain; charset=US-ASCII; format=flowed X-Spam-Status: No, score=-2.2 required=5.0 tests=BAYES_00, KAM_DMARC_STATUS, RCVD_IN_MSPIKE_H3, RCVD_IN_MSPIKE_WL, SPF_HELO_NONE, SPF_PASS, TXREP autolearn=ham autolearn_force=no version=3.4.2 X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) 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: Tue, 11 May 2021 08:11:30 -0000 On Tue, 11 May 2021, Jakub Jelinek via Gcc-patches wrote: > On Thu, May 06, 2021 at 09:42:41PM +0200, Marc Glisse wrote: >> We can probably do it in 2 steps, first something like >> >> (for cmp (eq ne) >> (simplify >> (cmp (bit_and:c @0 @1) @0) >> (cmp (@0 (bit_not! @1)) { build_zero_cst (TREE_TYPE (@0)); }))) >> >> to get rid of the double use, and then simplify X&C==0 to X<=~C if C is a >> mask 111...000 (I thought we already had a function to detect such masks, or >> the 000...111, but I can't find them anymore). > > Ok, here is the first step then. > Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk? > > Or should it have cmp:c too given that == and != are commutative too? Ah, yes, you are right, good point on the cmp:c, thank you. > 2021-05-11 Jakub Jelinek > Marc Glisse > > PR tree-optimization/94589 > * match.pd ((X & Y) == Y -> (X & ~Y) == 0, ^ X? > (X | Y) == Y -> (X & ~Y) == 0): New GIMPLE simplifications. > > * gcc.dg/tree-ssa/pr94589-1.c: New test. > > --- gcc/match.pd.jj 2021-04-27 14:46:56.583716888 +0200 > +++ gcc/match.pd 2021-05-10 22:31:49.726870421 +0200 > @@ -4764,6 +4764,18 @@ (define_operator_list COND_TERNARY > (cmp:c (bit_xor:c @0 @1) @0) > (cmp @1 { build_zero_cst (TREE_TYPE (@1)); })) > > +#if GIMPLE > + /* (X & Y) == X becomes (X & ~Y) == 0. */ > + (simplify > + (cmp (bit_and:c @0 @1) @0) > + (cmp (bit_and @0 (bit_not! @1)) { build_zero_cst (TREE_TYPE (@0)); })) > + > + /* (X | Y) == Y becomes (X & ~Y) == 0. */ > + (simplify > + (cmp (bit_ior:c @0 @1) @1) > + (cmp (bit_and @0 (bit_not! @1)) { build_zero_cst (TREE_TYPE (@0)); })) > +#endif > + > /* (X ^ C1) op C2 can be rewritten as X op (C1 ^ C2). */ > (simplify > (cmp (convert?@3 (bit_xor @0 INTEGER_CST@1)) INTEGER_CST@2) > --- gcc/testsuite/gcc.dg/tree-ssa/pr94589-1.c.jj 2021-05-10 22:36:10.574130179 +0200 > +++ gcc/testsuite/gcc.dg/tree-ssa/pr94589-1.c 2021-05-10 22:36:17.789054362 +0200 > @@ -0,0 +1,21 @@ > +/* PR tree-optimization/94589 */ > +/* { dg-do compile } */ > +/* { dg-options "-O2 -fdump-tree-optimized" } */ > + > +int > +foo (int x) > +{ > + return (x & 23) == x; > +/* { dg-final { scan-tree-dump " & -24;" "optimized" } } */ > +/* { dg-final { scan-tree-dump-not " & 23;" "optimized" } } */ > +/* { dg-final { scan-tree-dump " == 0" "optimized" } } */ > +} > + > +int > +bar (int x) > +{ > + return (x | 137) != 137; > +/* { dg-final { scan-tree-dump " & -138;" "optimized" } } */ > +/* { dg-final { scan-tree-dump-not " \\| 137;" "optimized" } } */ > +/* { dg-final { scan-tree-dump " != 0" "optimized" } } */ > +} > > > Jakub -- Marc Glisse