From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mx2.suse.de (mx2.suse.de [195.135.220.15]) by sourceware.org (Postfix) with ESMTPS id 8D6793987C32 for ; Fri, 15 Jan 2021 19:50:22 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.3.2 sourceware.org 8D6793987C32 Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=suse.de Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=rguenther@suse.de X-Virus-Scanned: by amavisd-new at test-mx.suse.de Received: from relay2.suse.de (unknown [195.135.221.27]) by mx2.suse.de (Postfix) with ESMTP id AD86EADC4; Fri, 15 Jan 2021 19:50:21 +0000 (UTC) Date: Fri, 15 Jan 2021 20:50:20 +0100 User-Agent: K-9 Mail for Android In-Reply-To: <20210115183835.GN1034503@tucnak> References: <20210115183835.GN1034503@tucnak> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Subject: Re: [PATCH] match.pd: Generalize the PR64309 simplifications [PR96669] To: Jakub Jelinek CC: gcc-patches@gcc.gnu.org From: Richard Biener Message-ID: <3A093C96-8989-4882-B774-AD39DDEBCAA4@suse.de> X-Spam-Status: No, score=-5.5 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: Fri, 15 Jan 2021 19:50:24 -0000 On January 15, 2021 7:38:35 PM GMT+01:00, Jakub Jelinek wrote: >Hi! > >The following patch generalizes the PR64309 simplifications, so that >instead >of working only with constants 1 and 1 it works with any two power of >two >constants, and works also for right shift (in that case it rules out >the >first one being negative, as it is arithmetic shift then)=2E > >Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk? Ok=2E=20 Richard=2E=20 >2021-01-15 Jakub Jelinek > > PR tree-optimization/96669 > * match=2Epd (((1 << A) & 1) !=3D 0 -> A =3D=3D 0, > ((1 << A) & 1) =3D=3D 0 -> A !=3D 0): Generalize for 1s replaced by > possibly different power of two constants and to right shift too=2E > > * gcc=2Edg/tree-ssa/pr96669-1=2Ec: New test=2E > >--- gcc/match=2Epd=2Ejj 2021-01-15 14:00:21=2E567135280 +0100 >+++ gcc/match=2Epd 2021-01-15 17:03:49=2E207071209 +0100 >@@ -3117,13 +3117,26 @@ (define_operator_list COND_TERNARY > (op @0 { build_int_cst (TREE_TYPE (@1), low); }))))))) >=20 >=20 >-/* ((1 << A) & 1) !=3D 0 -> A =3D=3D 0 >- ((1 << A) & 1) =3D=3D 0 -> A !=3D 0 */ >+/* Simplify ((C << x) & D) !=3D 0 where C and D are power of two >constants, >+ either to false if D is smaller (unsigned comparison) than C, or to >+ x =3D=3D log2 (D) - log2 (C)=2E Similarly for right shifts=2E */ > (for cmp (ne eq) > icmp (eq ne) > (simplify >- (cmp (bit_and (lshift integer_onep @0) integer_onep) integer_zerop) >- (icmp @0 { build_zero_cst (TREE_TYPE (@0)); }))) >+ (cmp (bit_and (lshift integer_pow2p@1 @0) integer_pow2p@2) >integer_zerop) >+ (with { int c1 =3D wi::clz (wi::to_wide (@1)); >+ int c2 =3D wi::clz (wi::to_wide (@2)); } >+ (if (c1 < c2) >+ { constant_boolean_node (cmp =3D=3D NE_EXPR ? false : true, type); = } >+ (icmp @0 { build_int_cst (TREE_TYPE (@0), c1 - c2); })))) >+ (simplify >+ (cmp (bit_and (rshift integer_pow2p@1 @0) integer_pow2p@2) >integer_zerop) >+ (if (tree_int_cst_sgn (@1) > 0) >+ (with { int c1 =3D wi::clz (wi::to_wide (@1)); >+ int c2 =3D wi::clz (wi::to_wide (@2)); } >+ (if (c1 > c2) >+ { constant_boolean_node (cmp =3D=3D NE_EXPR ? false : true, type);= } >+ (icmp @0 { build_int_cst (TREE_TYPE (@0), c2 - c1); })))))) >=20 > /* (CST1 << A) =3D=3D CST2 -> A =3D=3D ctz (CST2) - ctz (CST1) > (CST1 << A) !=3D CST2 -> A !=3D ctz (CST2) - ctz (CST1) >--- gcc/testsuite/gcc=2Edg/tree-ssa/pr96669-1=2Ec=2Ejj 2021-01-15 >17:12:11=2E067414204 +0100 >+++ gcc/testsuite/gcc=2Edg/tree-ssa/pr96669-1=2Ec 2021-01-15 >17:11:55=2E486589792 +0100 >@@ -0,0 +1,59 @@ >+/* PR tree-optimization/96669 */ >+/* { dg-do compile } */ >+/* { dg-options "-O2 -fdump-tree-original" } */ >+/* { dg-final { scan-tree-dump "return a =3D=3D 0;" "original" } } */ >+/* { dg-final { scan-tree-dump "return 1;" "original" } } */ >+/* { dg-final { scan-tree-dump "return c =3D=3D 3;" "original" } } */ >+/* { dg-final { scan-tree-dump "return d !=3D 1;" "original" } } */ >+/* { dg-final { scan-tree-dump "return e !=3D 0;" "original" } } */ >+/* { dg-final { scan-tree-dump "return f =3D=3D 1;" "original" } } */ >+/* { dg-final { scan-tree-dump "return 0;" "original" } } */ >+/* { dg-final { scan-tree-dump "return h !=3D 1;" "original" } } */ >+ >+int >+f1 (int a) >+{ >+ return ((1 << a) & 1) !=3D 0; >+} >+ >+int >+f2 (int b) >+{ >+ return ((2 << b) & 1) =3D=3D 0; >+} >+ >+int >+f3 (int c) >+{ >+ return ((2 << c) & 16) !=3D 0; >+} >+ >+int >+f4 (int d) >+{ >+ return ((16 << d) & 32) =3D=3D 0; >+} >+ >+int >+f5 (int e) >+{ >+ return ((1 >> e) & 1) =3D=3D 0; >+} >+ >+int >+f6 (int f) >+{ >+ return ((2 >> f) & 1) !=3D 0; >+} >+ >+int >+f7 (int g) >+{ >+ return ((1 >> g) & 2) !=3D 0; >+} >+ >+int >+f8 (int h) >+{ >+ return ((32 >> h) & 16) =3D=3D 0; >+} > > Jakub