From patchwork Mon Jan 30 09:50:37 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Richard Biener X-Patchwork-Id: 50203 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:adf:eb09:0:0:0:0:0 with SMTP id s9csp2092929wrn; Mon, 30 Jan 2023 01:51:40 -0800 (PST) X-Google-Smtp-Source: AK7set+33M0X29DAsJtx185iXcpvKVDl7EqS0hFoUpS0iilZ6y5Wy/QXLvLcMENNGP5pg0sG3KLJ X-Received: by 2002:a17:906:b812:b0:880:3129:d84a with SMTP id dv18-20020a170906b81200b008803129d84amr10152521ejb.60.1675072300802; Mon, 30 Jan 2023 01:51:40 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1675072300; cv=none; d=google.com; s=arc-20160816; b=kJkTE0ROPrKuYxPKRVhaVfEVJsfw10CDY3l8aVejFFaytk9mDrbhSvdYzjd8M67fGr fPBXflHgboB0oBakPTQXXXSDHwopaoTfjbh1hmGAgkYpKARePLZitPEqhT++PMISuCen stVWfEzsUg82OxHd355XjdcIJPp4wJmxqk2huyGP+4H2TGH8BGQ5KbqcVrL8ChalDsLU hvq6ESrOmwD3mxDOZBE5ORNmVYKgIJo5mIbhItHPoNpsIB/FFCDpPRBSWZ7LvXLnxMsW 37wd2MkHh7j6eJ5m12Fcnt2toRrT1M7rfwzLQHh3Y+Q5YqVS0YtpmjKDg1eyBaxXMMfp OMoA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:reply-to:from:list-subscribe:list-help:list-post :list-archive:list-unsubscribe:list-id:precedence:message-id :mime-version:subject:to:date:dmarc-filter:delivered-to :dkim-signature:dkim-filter; bh=81+PRYijJl4QJBlFhLR00Nj2yk5dVDgkk3Ehx5LsHBM=; b=Qwz13BfpCL0nfD9CmRb/riij6Jdb3tdpjFAWFvf9eodmuj2Bf6Yvdmnka6ltYuMVHb hgW13H2gXPNXFooCTZxNOYQs4YtyBACCJ4BAyllS1wqDgZ8sK0YSL3KJqZu6aUwEHYOY iEPKqBlepWTUztgbApOSsvQyJaWlSWJxyrl0ijLzGAOgfyp38OhkoYHCitRi5Mw27jdo eXf947COCIdu3gMUOT/3q1RGXOEDYEHxWpmBC5cixITCPJhvFoXeng8QazjTzB9a8O2X sRAIohcjsZxKd3bUO6AWTY40WCVi+qRE2rVd6xX5W4jAVqZIC3aqMfu3Civ0hqEaB/Xu cGBA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gcc.gnu.org header.s=default header.b=htNwhLMF; spf=pass (google.com: domain of gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org designates 8.43.85.97 as permitted sender) smtp.mailfrom="gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=gnu.org Received: from sourceware.org (ip-8-43-85-97.sourceware.org. [8.43.85.97]) by mx.google.com with ESMTPS id vs18-20020a170907139200b008787f5b185fsi11081757ejb.874.2023.01.30.01.51.40 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 30 Jan 2023 01:51:40 -0800 (PST) Received-SPF: pass (google.com: domain of gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org designates 8.43.85.97 as permitted sender) client-ip=8.43.85.97; Authentication-Results: mx.google.com; dkim=pass header.i=@gcc.gnu.org header.s=default header.b=htNwhLMF; spf=pass (google.com: domain of gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org designates 8.43.85.97 as permitted sender) smtp.mailfrom="gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=gnu.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 274CC385558F for ; Mon, 30 Jan 2023 09:51:25 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 274CC385558F DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gcc.gnu.org; s=default; t=1675072285; bh=81+PRYijJl4QJBlFhLR00Nj2yk5dVDgkk3Ehx5LsHBM=; h=Date:To:Subject:List-Id:List-Unsubscribe:List-Archive:List-Post: List-Help:List-Subscribe:From:Reply-To:From; b=htNwhLMFwd65HICxD5X0Oe93PGzjMVM+Z1XtkVr92s0qJ1K9qWWwNuhm08PCDzlKt 05KjPif/uL5+Uts69ZJ0mfw3xFYuOqCXkWbAx2ukJ4Uhx1BNQsG/2Lv5qgMVCa26xF oXrN+q2ufmFdlvKSBwYeTGZhM1vBW+j9JGfMh6zM= X-Original-To: gcc-patches@gcc.gnu.org Delivered-To: gcc-patches@gcc.gnu.org Received: from smtp-out2.suse.de (smtp-out2.suse.de [195.135.220.29]) by sourceware.org (Postfix) with ESMTPS id 82DEA3858D32 for ; Mon, 30 Jan 2023 09:50:39 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 82DEA3858D32 Received: from imap2.suse-dmz.suse.de (imap2.suse-dmz.suse.de [192.168.254.74]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (P-521) server-digest SHA512) (No client certificate requested) by smtp-out2.suse.de (Postfix) with ESMTPS id 4961E1FE0D for ; Mon, 30 Jan 2023 09:50:38 +0000 (UTC) Received: from imap2.suse-dmz.suse.de (imap2.suse-dmz.suse.de [192.168.254.74]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (P-521) server-digest SHA512) (No client certificate requested) by imap2.suse-dmz.suse.de (Postfix) with ESMTPS id 3665C13444 for ; Mon, 30 Jan 2023 09:50:38 +0000 (UTC) Received: from dovecot-director2.suse.de ([192.168.254.65]) by imap2.suse-dmz.suse.de with ESMTPSA id UAorDO6S12NFdgAAMHmgww (envelope-from ) for ; Mon, 30 Jan 2023 09:50:38 +0000 Date: Mon, 30 Jan 2023 10:50:37 +0100 (CET) To: gcc-patches@gcc.gnu.org Subject: [PATCH] tree-optimization/108574 - wrong-code with PRE PHI node processing MIME-Version: 1.0 Message-Id: <20230130095038.3665C13444@imap2.suse-dmz.suse.de> X-Spam-Status: No, score=-11.8 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, 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 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-Patchwork-Original-From: Richard Biener via Gcc-patches From: Richard Biener Reply-To: Richard Biener Errors-To: gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org Sender: "Gcc-patches" X-getmail-retrieved-from-mailbox: =?utf-8?q?INBOX?= X-GMAIL-THRID: =?utf-8?q?1756440612663320157?= X-GMAIL-MSGID: =?utf-8?q?1756440612663320157?= The PR108523 was too optimistic in replacing the same value with an equivalence from a possibly not taken edge. The following rectifies this and instead refrains from using the equivalence in the problematic cases. Bootstrapped and tested on x86_64-unknown-linux-gnu, pushed. PR tree-optimization/108574 * tree-ssa-sccvn.cc (visit_phi): Instead of swapping sameval and def, ignore the equivalence if there's the danger of oscillating between two values. * gcc.dg/torture/pr108574-1.c: New testcase. * gcc.dg/torture/pr108574-2.c: Likewise. * gcc.dg/torture/pr108574-3.c: Likewise. --- gcc/testsuite/gcc.dg/torture/pr108574-1.c | 19 ++++++++++++++++ gcc/testsuite/gcc.dg/torture/pr108574-2.c | 25 +++++++++++++++++++++ gcc/testsuite/gcc.dg/torture/pr108574-3.c | 27 +++++++++++++++++++++++ gcc/tree-ssa-sccvn.cc | 11 +++++---- 4 files changed, 76 insertions(+), 6 deletions(-) create mode 100644 gcc/testsuite/gcc.dg/torture/pr108574-1.c create mode 100644 gcc/testsuite/gcc.dg/torture/pr108574-2.c create mode 100644 gcc/testsuite/gcc.dg/torture/pr108574-3.c diff --git a/gcc/testsuite/gcc.dg/torture/pr108574-1.c b/gcc/testsuite/gcc.dg/torture/pr108574-1.c new file mode 100644 index 00000000000..7066b5ee2a2 --- /dev/null +++ b/gcc/testsuite/gcc.dg/torture/pr108574-1.c @@ -0,0 +1,19 @@ +/* { dg-do run } */ + +int a = 1, b, c = 2, d; +int main() { + if (b) + goto L2; + L1: + { + int e = c; + a = 1 % a; + while (e && 1 <= d) + ; + d >= b; + L2: + if (1 >= e) + goto L1; + } + return 0; +} diff --git a/gcc/testsuite/gcc.dg/torture/pr108574-2.c b/gcc/testsuite/gcc.dg/torture/pr108574-2.c new file mode 100644 index 00000000000..1e38d087646 --- /dev/null +++ b/gcc/testsuite/gcc.dg/torture/pr108574-2.c @@ -0,0 +1,25 @@ +/* { dg-do run } */ + +int a, b, c, d, e, f, g = -1, h; +void l() { + if (!e) + goto i; + for (; g; g++) { + b = ~d; + int j = 0, k = 1; + if (k && (b || f)) + j = b; + i: + a = ~j; + } +} +int main() { + h = 3; + for (; h; h--) { + e = 1; + int m = ~a, n = 1 % m; + c = n; + l(); + } + return 0; +} diff --git a/gcc/testsuite/gcc.dg/torture/pr108574-3.c b/gcc/testsuite/gcc.dg/torture/pr108574-3.c new file mode 100644 index 00000000000..3c9146e31ac --- /dev/null +++ b/gcc/testsuite/gcc.dg/torture/pr108574-3.c @@ -0,0 +1,27 @@ +/* { dg-do run } */ + +int a = 3557301289, d; +char b, f; +unsigned short c = 241; +short e, g; +static void h() { + if (!a) + goto i; + b = a; + for (; a < 2; a = b) { + unsigned short j; + if (c || !g) { + j = c; + i: + e = j; + } + f = j; + d = ~(f & ~2880764155); + while (d > -2316069) + ; + } +} +int main() { + h(); + return 0; +} diff --git a/gcc/tree-ssa-sccvn.cc b/gcc/tree-ssa-sccvn.cc index edb553b07cb..028bedbc9a0 100644 --- a/gcc/tree-ssa-sccvn.cc +++ b/gcc/tree-ssa-sccvn.cc @@ -5908,7 +5908,8 @@ visit_phi (gimple *phi, bool *inserted, bool backedges_varying_p) if (! val && vnresult && vnresult->predicated_values) { val = vn_nary_op_get_predicated_value (vnresult, e->src); - if (val && integer_truep (val)) + if (val && integer_truep (val) + && !(sameval_e && (sameval_e->flags & EDGE_DFS_BACK))) { if (dump_file && (dump_flags & TDF_DETAILS)) { @@ -5919,8 +5920,6 @@ visit_phi (gimple *phi, bool *inserted, bool backedges_varying_p) fprintf (dump_file, " are equal on edge %d -> %d\n", e->src->index, e->dest->index); } - if (sameval_e && (sameval_e->flags & EDGE_DFS_BACK)) - sameval = def; continue; } /* If on all previous edges the value was equal to def @@ -5928,7 +5927,8 @@ visit_phi (gimple *phi, bool *inserted, bool backedges_varying_p) if (EDGE_COUNT (bb->preds) == 2 && (val = vn_nary_op_get_predicated_value (vnresult, EDGE_PRED (bb, 0)->src)) - && integer_truep (val)) + && integer_truep (val) + && !(e->flags & EDGE_DFS_BACK)) { if (dump_file && (dump_flags & TDF_DETAILS)) { @@ -5940,8 +5940,7 @@ visit_phi (gimple *phi, bool *inserted, bool backedges_varying_p) EDGE_PRED (bb, 0)->src->index, EDGE_PRED (bb, 0)->dest->index); } - if (!(e->flags & EDGE_DFS_BACK)) - sameval = def; + sameval = def; continue; } }