Message ID | 00ce01d8ab06$19113060$4b339120$@nextmovesoftware.com |
---|---|
State | New, archived |
Headers |
Return-Path: <gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org> Delivered-To: ouuuleilei@gmail.com Received: by 2002:a05:6a10:20da:b0:2d3:3019:e567 with SMTP id n26csp1724836pxc; Mon, 8 Aug 2022 02:06:38 -0700 (PDT) X-Google-Smtp-Source: AA6agR5dSUOQHbw0KYKUkRNMct3NFl+Fhu6CzYMWqXSoO+eBK0F6qFagpwcGEIDTiZMJ24oY36ge X-Received: by 2002:a05:6402:270e:b0:43d:e3e1:847a with SMTP id y14-20020a056402270e00b0043de3e1847amr17248235edd.130.1659949598469; Mon, 08 Aug 2022 02:06:38 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1659949598; cv=none; d=google.com; s=arc-20160816; b=wGjbWimYmCZGHyZ7rMWlCgeTUlCf/cYQRRYlZMxhyC+xHQUJdkMl4YWyCDy7pqRBjP 2VBBrToxCC00YJwJ3IJByzuaxuQzCa+9J+MDB/aVI05/890mF8tBeFuVi1GtPQhhn/1E BA5vS8lNqJ9CLUubxMaTv9FdGxFMBBLsoHgVkjJ0f3DpkBSTwxELIp78QAky3Fkbfcm9 mXCYpJlBbh66nOTAI4j8Ecce0+aJNQNfJVi3hY1D8M0WKNHriN0X1v5Lsl2NaMLzvFk3 rg3QPCgdtVs3PombMTzQ4Zmmx9fNZT8Fb2qKT6UnQGC9CseeMdBGAqmpYL3pUJzR4cwD HCxQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:cc:list-subscribe:list-help:list-post:list-archive :list-unsubscribe:list-id:precedence:content-language:thread-index :mime-version:message-id:date:subject:to:from:dkim-signature :dmarc-filter:delivered-to; bh=34VzJP3ilk3PBPE+Dk+RC2r8zCOX18RBvm44XvPQpHQ=; b=aGudSqVr5W/48aoTyt+5nO7J7yaZ7rPwd562hr1WGI6eu9JwEYsRcEXWyQ2YT/K/jJ IBILhGjIJODRrNfF2aiL1cUaUucD7CUkmZR2hi3hEkNvgH1Gdr3Is6BkZwBJixYJtc2C H/8u7AgPidU4voHiqVEs+jAy2iZByapYHI++vPdoG0LLgj18H8Yv5dORuaEZlgmeRXAL 9XLKrV/3mxmkIKqCnoKvVgm3kzvgqNbK7tlDnPEWkZQ7Hp8MwpqAzvJtTP0W1PF+R0nu X1f7EZ92Sul5PSWP5YK2REQf3WuA1XPYg0J2XFminIu7QQktpI1blw2YqtqfOVqD7FHE 70MQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=fail header.i=@nextmovesoftware.com header.s=default header.b=aEUIEwpg; spf=pass (google.com: domain of gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org designates 2620:52:3:1:0:246e:9693:128c as permitted sender) smtp.mailfrom="gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org" Received: from sourceware.org (server2.sourceware.org. [2620:52:3:1:0:246e:9693:128c]) by mx.google.com with ESMTPS id x11-20020a50ba8b000000b0043ddc200046si6026873ede.454.2022.08.08.02.06.38 for <ouuuleilei@gmail.com> (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 08 Aug 2022 02:06:38 -0700 (PDT) Received-SPF: pass (google.com: domain of gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org designates 2620:52:3:1:0:246e:9693:128c as permitted sender) client-ip=2620:52:3:1:0:246e:9693:128c; Authentication-Results: mx.google.com; dkim=fail header.i=@nextmovesoftware.com header.s=default header.b=aEUIEwpg; spf=pass (google.com: domain of gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org designates 2620:52:3:1:0:246e:9693:128c as permitted sender) smtp.mailfrom="gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org" Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 92CCC3858287 for <ouuuleilei@gmail.com>; Mon, 8 Aug 2022 09:06:33 +0000 (GMT) X-Original-To: gcc-patches@gcc.gnu.org Delivered-To: gcc-patches@gcc.gnu.org Received: from server.nextmovesoftware.com (server.nextmovesoftware.com [162.254.253.69]) by sourceware.org (Postfix) with ESMTPS id 6BD0038582B3 for <gcc-patches@gcc.gnu.org>; 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 <roger@nextmovesoftware.com>) id 1oKyi9-00085T-ML; Mon, 08 Aug 2022 05:06:09 -0400 From: "Roger Sayle" <roger@nextmovesoftware.com> To: <gcc-patches@gcc.gnu.org> 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 <gcc-patches.gcc.gnu.org> List-Unsubscribe: <https://gcc.gnu.org/mailman/options/gcc-patches>, <mailto:gcc-patches-request@gcc.gnu.org?subject=unsubscribe> List-Archive: <https://gcc.gnu.org/pipermail/gcc-patches/> List-Post: <mailto:gcc-patches@gcc.gnu.org> List-Help: <mailto:gcc-patches-request@gcc.gnu.org?subject=help> List-Subscribe: <https://gcc.gnu.org/mailman/listinfo/gcc-patches>, <mailto:gcc-patches-request@gcc.gnu.org?subject=subscribe> Cc: 'Andrew Pinski' <apinski@marvell.com> Errors-To: gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org Sender: "Gcc-patches" <gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org> X-getmail-retrieved-from-mailbox: =?utf-8?q?INBOX?= X-GMAIL-THRID: =?utf-8?q?1740583310340636158?= X-GMAIL-MSGID: =?utf-8?q?1740583310340636158?= |
Series |
PR tree-optimization/64992: (B << 2) != 0 is B when B is Boolean.
|
|
Commit Message
Roger Sayle
Aug. 8, 2022, 9:06 a.m. UTC
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 <roger@nextmovesoftware.com> 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 --
Comments
On Mon, Aug 8, 2022 at 11:06 AM Roger Sayle <roger@nextmovesoftware.com> wrote: > > > 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? +/* (X << C) != 0 can be simplified to X, when X is zero_one_valued_p. */ +(simplify + (ne (lshift zero_one_valued_p@0 INTEGER_CST@1) integer_zerop@2) + (if (tree_fits_shwi_p (@1) + && tree_to_shwi (@1) > 0 + && tree_to_shwi (@1) < TYPE_PRECISION (TREE_TYPE (@0))) + (convert @0))) while we deliberately do not fold int << 34 since the result is undefined there is IMHO no reason to not fold the above for any (even non-constant) shift value. We have guards with TYPE_OVERFLOW_SANITIZED in some cases but I think that's not appropriate here, there's one flag_sanitize check, maybe there's a special bit for SHIFT overflow we can use. Why is (X << 0) != 0 excempt in the condition? > > 2022-08-08 Roger Sayle <roger@nextmovesoftware.com> > > 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 > -- >
Hi Richard, > -----Original Message----- > From: Richard Biener <richard.guenther@gmail.com> > Sent: 08 August 2022 12:49 > Subject: Re: [PATCH] PR tree-optimization/64992: (B << 2) != 0 is B when B is > Boolean. > > On Mon, Aug 8, 2022 at 11:06 AM Roger Sayle > <roger@nextmovesoftware.com> wrote: > > > > 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? > > +/* (X << C) != 0 can be simplified to X, when X is zero_one_valued_p. > +*/ (simplify > + (ne (lshift zero_one_valued_p@0 INTEGER_CST@1) integer_zerop@2) > + (if (tree_fits_shwi_p (@1) > + && tree_to_shwi (@1) > 0 > + && tree_to_shwi (@1) < TYPE_PRECISION (TREE_TYPE (@0))) > + (convert @0))) > > while we deliberately do not fold int << 34 since the result is undefined there is > IMHO no reason to not fold the above for any (even non-constant) shift value. > We have guards with TYPE_OVERFLOW_SANITIZED in some cases but I think > that's not appropriate here, there's one flag_sanitize check, maybe there's a > special bit for SHIFT overflow we can use. Why is (X << 0) != 0 excempt in the > condition? In this case, I think it makes more sense to err on the side of caution, and avoid changing the observable behaviour of programs, even in cases were the behaviour is officially undefined. For many targets, (1<<x) != 0 is indeed always true for any value of x, but a counter example are x86's SSE shifts, where shifts beyond the size of the vector result in zero. With STV, this means that (1<<258) != 0 has a different value if performed as scalar vs. performed as vector. Worse, one may end up with examples, where based upon optimization level, we see different results as shift operands become propagated constants in some paths, but was variable shifts others. Hence my personal preference is "first, do no harm" and limit this transformation to the safe 0 <= X < MODE_PRECISION (mode). Then given we'd like to avoid negative shifts, and therefore need to test against zero, my second preference is "0 < X" over "0 <= X". If the RTL contains a shift by zero, something strange is already going on (these should be caught optimized elsewhere), and it's better to leave these issues visible in the RTL, than paper over any "latent" mistakes. I fully I agree that this optimization could be more aggressive, but that isn't required to resolve this PR, and resolving PR64992 only to open the door for follow-up "unexpected behavior" PRs isn't great progress. Thoughts? Ok for mainline? > > 2022-08-08 Roger Sayle <roger@nextmovesoftware.com> > > > > 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, Roger --
On Sat, Aug 13, 2022 at 12:35 AM Roger Sayle <roger@nextmovesoftware.com> wrote: > > Hi Richard, > > > -----Original Message----- > > From: Richard Biener <richard.guenther@gmail.com> > > Sent: 08 August 2022 12:49 > > Subject: Re: [PATCH] PR tree-optimization/64992: (B << 2) != 0 is B when B is > > Boolean. > > > > On Mon, Aug 8, 2022 at 11:06 AM Roger Sayle > > <roger@nextmovesoftware.com> wrote: > > > > > > 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? > > > > +/* (X << C) != 0 can be simplified to X, when X is zero_one_valued_p. > > +*/ (simplify > > + (ne (lshift zero_one_valued_p@0 INTEGER_CST@1) integer_zerop@2) > > + (if (tree_fits_shwi_p (@1) > > + && tree_to_shwi (@1) > 0 > > + && tree_to_shwi (@1) < TYPE_PRECISION (TREE_TYPE (@0))) > > + (convert @0))) > > > > while we deliberately do not fold int << 34 since the result is undefined there is > > IMHO no reason to not fold the above for any (even non-constant) shift value. > > We have guards with TYPE_OVERFLOW_SANITIZED in some cases but I think > > that's not appropriate here, there's one flag_sanitize check, maybe there's a > > special bit for SHIFT overflow we can use. Why is (X << 0) != 0 excempt in the > > condition? > > In this case, I think it makes more sense to err on the side of caution, and > avoid changing the observable behaviour of programs, even in cases were > the behaviour is officially undefined. For many targets, (1<<x) != 0 is indeed > always true for any value of x, but a counter example are x86's SSE shifts, > where shifts beyond the size of the vector result in zero. With STV, this > means that (1<<258) != 0 has a different value if performed as scalar vs. > performed as vector. Worse, one may end up with examples, where based > upon optimization level, we see different results as shift operands become > propagated constants in some paths, but was variable shifts others. > > Hence my personal preference is "first, do no harm" and limit this > transformation to the safe 0 <= X < MODE_PRECISION (mode). > Then given we'd like to avoid negative shifts, and therefore need to > test against zero, my second preference is "0 < X" over "0 <= X". > If the RTL contains a shift by zero, something strange is already going on > (these should be caught optimized elsewhere), and it's better to leave > these issues visible in the RTL, than paper over any "latent" mistakes. > > I fully I agree that this optimization could be more aggressive, but that > isn't required to resolve this PR, and resolving PR64992 only to open > the door for follow-up "unexpected behavior" PRs isn't great progress. > > Thoughts? Ok for mainline? OK - can you add a comment reflecting the above? An improvement might be to allow non-constant operands but test sth like expr_in_range (@1, 1, TYPE_PRECISION (...)) we already have expr_not_equal_to, expr_in_range could be done with value_range vr; if (get_global_range_query ()->range_of_expr (vr, @0) && vr.kind () == VR_RANGE) { wide_int wmin0 = vr.lower_bound (); wide_int wmax0 = vr.upper_bound (); ... there's a bunch of range_of_expr uses, I didn't check closely but some might fit a new expr_in_range utility. That can be done as followup (if you like). Btw, I wonder if bit-CCP would have not simplified the shift-by-constant compared to zero as well? If so, does that behave the same with respect to 0 or out of bound shifts? Richard. > > > > 2022-08-08 Roger Sayle <roger@nextmovesoftware.com> > > > > > > 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, > Roger > -- > >
diff --git a/gcc/match.pd b/gcc/match.pd index f82f94a..ef6d8e2 100644 --- a/gcc/match.pd +++ b/gcc/match.pd @@ -1900,6 +1900,22 @@ DEFINE_INT_AND_FLOAT_ROUND_FN (RINT) && TYPE_PRECISION (type) <= TYPE_PRECISION (TREE_TYPE (@0))) (mult (convert @1) (convert @2)))) +/* (X << C) != 0 can be simplified to X, when X is zero_one_valued_p. */ +(simplify + (ne (lshift zero_one_valued_p@0 INTEGER_CST@1) integer_zerop@2) + (if (tree_fits_shwi_p (@1) + && tree_to_shwi (@1) > 0 + && tree_to_shwi (@1) < TYPE_PRECISION (TREE_TYPE (@0))) + (convert @0))) + +/* (X << C) == 0 can be simplified to X == 0, when X is zero_one_valued_p. */ +(simplify + (eq (lshift zero_one_valued_p@0 INTEGER_CST@1) integer_zerop@2) + (if (tree_fits_shwi_p (@1) + && tree_to_shwi (@1) > 0 + && tree_to_shwi (@1) < TYPE_PRECISION (TREE_TYPE (@0))) + (eq @0 @2))) + /* Convert ~ (-A) to A - 1. */ (simplify (bit_not (convert? (negate @0))) diff --git a/gcc/testsuite/gcc.dg/pr64992.c b/gcc/testsuite/gcc.dg/pr64992.c new file mode 100644 index 0000000..43fbcf7 --- /dev/null +++ b/gcc/testsuite/gcc.dg/pr64992.c @@ -0,0 +1,7 @@ +/* { dg-do compile } */ +/* { dg-options "-O2 -fdump-tree-optimized" } */ + +_Bool foo(_Bool x) { return (x << 2) != 0; } +_Bool bar(_Bool x) { return (x << 2) == 0; } + +/* { dg-final { scan-tree-dump-not " << " "optimized" } } */