From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from server.nextmovesoftware.com (server.nextmovesoftware.com [162.254.253.69]) by sourceware.org (Postfix) with ESMTPS id 6BD0038582B3 for ; Mon, 8 Aug 2022 09:06:10 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 6BD0038582B3 Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=nextmovesoftware.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=nextmovesoftware.com DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=nextmovesoftware.com; s=default; h=Content-Type:MIME-Version:Message-ID: Date:Subject:Cc:To:From:Sender:Reply-To:Content-Transfer-Encoding:Content-ID: Content-Description:Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc :Resent-Message-ID:In-Reply-To:References:List-Id:List-Help:List-Unsubscribe: List-Subscribe:List-Post:List-Owner:List-Archive; bh=34VzJP3ilk3PBPE+Dk+RC2r8zCOX18RBvm44XvPQpHQ=; b=aEUIEwpgmxjK53QxqKeKJwdui6 1YxjxQiDNayF1a08201bCgXpFeaWkw4yZFueg6fHlXPP5mVFzup08pk2YmnP8qn4DWsgaPEYk+ATz 2A9Y/SB7ox+RV49E5MRdGsSkP+rwEhInD4QzPqp/s4DuJK8xHSqYGIi98axQWupCmnvldD1ejI97X FiVWpjaJ8CH+AgVJlKgR7a/anW55FbjfBD6YCjRCa/olSpYRTyg6dMR2fd6pTC9PprP19Zfe3Q9fU K5O+DLp0bIwI+xS7qw2SnXnXpwhO3JPAjKq+k0bV2v1pf05ZNXypyG/vwU9ro3z0z5HCp4u3Pb1Hk j/144M1w==; Received: from host86-169-41-119.range86-169.btcentralplus.com ([86.169.41.119]:57070 helo=Dell) by server.nextmovesoftware.com with esmtpsa (TLS1.2) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1oKyi9-00085T-ML; Mon, 08 Aug 2022 05:06:09 -0400 From: "Roger Sayle" To: Cc: "'Andrew Pinski'" Subject: [PATCH] PR tree-optimization/64992: (B << 2) != 0 is B when B is Boolean. Date: Mon, 8 Aug 2022 10:06:05 +0100 Message-ID: <00ce01d8ab06$19113060$4b339120$@nextmovesoftware.com> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="----=_NextPart_000_00CF_01D8AB0E.7AD59860" X-Mailer: Microsoft Outlook 16.0 Thread-Index: AdirBaEKwGUos4itTrmBOpbgNtqTfw== Content-Language: en-gb X-AntiAbuse: This header was added to track abuse, please include it with any abuse report X-AntiAbuse: Primary Hostname - server.nextmovesoftware.com X-AntiAbuse: Original Domain - gcc.gnu.org X-AntiAbuse: Originator/Caller UID/GID - [47 12] / [47 12] X-AntiAbuse: Sender Address Domain - nextmovesoftware.com X-Get-Message-Sender-Via: server.nextmovesoftware.com: authenticated_id: roger@nextmovesoftware.com X-Authenticated-Sender: server.nextmovesoftware.com: roger@nextmovesoftware.com X-Source: X-Source-Args: X-Source-Dir: X-Spam-Status: No, score=-10.9 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, RCVD_IN_BARRACUDACENTRAL, 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: Mon, 08 Aug 2022 09:06:11 -0000 This is a multipart message in MIME format. ------=_NextPart_000_00CF_01D8AB0E.7AD59860 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit This patch resolves both PR tree-optimization/64992 and PR tree-optimization/98956 which are missed optimization enhancement request, for which Andrew Pinski already has a proposed solution (related to a fix for PR tree-optimization/98954). Yesterday, I proposed an alternate improved patch for PR98954, which although superior in most respects, alas didn't address this case [which doesn't include a BIT_AND_EXPR], hence this follow-up fix. For many functions, F(B), of a (zero-one) Boolean value B, the expression F(B) != 0 can often be simplified to just B. Hence "(B * 5) != 0" is B, "-B != 0" is B, "bswap(B) != 0" is B, "(B >>r 3) != 0" is B. These are all currently optimized by GCC, with the strange exception of left shifts by a constant (possibly due to the undefined/implementation defined behaviour when the shift constant is larger than the first operand's precision). This patch adds support for this particular case, when the shift constant is valid. This patch has been tested on x86_64-pc-linux-gnu with make bootstrap and make -k check, both with and without --target_board=unix{-m32}, with no new failures. Ok for mainline? 2022-08-08 Roger Sayle gcc/ChangeLog PR tree-optimization/64992 PR tree-optimization/98956 * match.pd (ne (lshift @0 @1) 0): Simplify (X << C) != 0 to X when X is zero_one_valued_p and the shift constant C is valid. (eq (lshift @0 @1) 0): Likewise, simplify (X << C) == 0 to !X when X is zero_one_valued_p and the shift constant C is valid. gcc/testsuite/ChangeLog PR tree-optimization/64992 * gcc.dg/pr64992.c: New test case. Thanks in advance, Roger -- ------=_NextPart_000_00CF_01D8AB0E.7AD59860 Content-Type: text/plain; name="patchfe.txt" Content-Transfer-Encoding: quoted-printable Content-Disposition: attachment; filename="patchfe.txt" diff --git a/gcc/match.pd b/gcc/match.pd=0A= index f82f94a..ef6d8e2 100644=0A= --- a/gcc/match.pd=0A= +++ b/gcc/match.pd=0A= @@ -1900,6 +1900,22 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT)=0A= && TYPE_PRECISION (type) <=3D TYPE_PRECISION (TREE_TYPE (@0)))=0A= (mult (convert @1) (convert @2))))=0A= =0A= +/* (X << C) !=3D 0 can be simplified to X, when X is zero_one_valued_p. = */=0A= +(simplify=0A= + (ne (lshift zero_one_valued_p@0 INTEGER_CST@1) integer_zerop@2)=0A= + (if (tree_fits_shwi_p (@1)=0A= + && tree_to_shwi (@1) > 0=0A= + && tree_to_shwi (@1) < TYPE_PRECISION (TREE_TYPE (@0)))=0A= + (convert @0)))=0A= +=0A= +/* (X << C) =3D=3D 0 can be simplified to X =3D=3D 0, when X is = zero_one_valued_p. */=0A= +(simplify=0A= + (eq (lshift zero_one_valued_p@0 INTEGER_CST@1) integer_zerop@2)=0A= + (if (tree_fits_shwi_p (@1)=0A= + && tree_to_shwi (@1) > 0=0A= + && tree_to_shwi (@1) < TYPE_PRECISION (TREE_TYPE (@0)))=0A= + (eq @0 @2)))=0A= +=0A= /* Convert ~ (-A) to A - 1. */=0A= (simplify=0A= (bit_not (convert? (negate @0)))=0A= diff --git a/gcc/testsuite/gcc.dg/pr64992.c = b/gcc/testsuite/gcc.dg/pr64992.c=0A= new file mode 100644=0A= index 0000000..43fbcf7=0A= --- /dev/null=0A= +++ b/gcc/testsuite/gcc.dg/pr64992.c=0A= @@ -0,0 +1,7 @@=0A= +/* { dg-do compile } */=0A= +/* { dg-options "-O2 -fdump-tree-optimized" } */=0A= +=0A= +_Bool foo(_Bool x) { return (x << 2) !=3D 0; }=0A= +_Bool bar(_Bool x) { return (x << 2) =3D=3D 0; }=0A= +=0A= +/* { dg-final { scan-tree-dump-not " << " "optimized" } } */=0A= ------=_NextPart_000_00CF_01D8AB0E.7AD59860--