From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from smtp-out2.suse.de (smtp-out2.suse.de [195.135.220.29]) by sourceware.org (Postfix) with ESMTPS id D86CF3858CDB for ; Thu, 23 Mar 2023 16:21:47 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org D86CF3858CDB Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=suse.de Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=suse.de 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 931A21FE09; Thu, 23 Mar 2023 16:21:46 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_rsa; t=1679588506; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc:cc: mime-version:mime-version:content-type:content-type; bh=Xze3EMUqBMRoxDDdVcbZdBHmkiNt6NRd4zDm2BpNroE=; b=f5wK0rBTOnesnx4gGOANtigf21VKErMxkqs3hS4cB8f113QhlarulHvqLY0HBW5sgMByC6 mKrAcDEc4y1rj4BnsYjcdJKQdtqZtxWXA/zmcNmbM8V/VzlKPypG8fJQiMkHw7w7v+8N25 NFFjLf8Nv5a9bRaYaa/34fzcwwEiScU= DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_ed25519; t=1679588506; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc:cc: mime-version:mime-version:content-type:content-type; bh=Xze3EMUqBMRoxDDdVcbZdBHmkiNt6NRd4zDm2BpNroE=; b=7WJpIzLsLtu+OJZ4p24Rc/aQlUIpH/1x7gZ8jV7q6owBZdg6JC9hlUI02Yr+02qDwtuyXM 7JLWP+yORJ9zMgCg== 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 791FA132C2; Thu, 23 Mar 2023 16:21:46 +0000 (UTC) Received: from dovecot-director2.suse.de ([192.168.254.65]) by imap2.suse-dmz.suse.de with ESMTPSA id e1hPHJp8HGRURQAAMHmgww (envelope-from ); Thu, 23 Mar 2023 16:21:46 +0000 Date: Thu, 23 Mar 2023 17:21:46 +0100 (CET) From: Richard Biener To: gcc-patches@gcc.gnu.org cc: Jakub Jelinek Subject: [PATCH] tree-optimization/107569 - avoid wrecking earlier folding in FRE/PRE MIME-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Message-Id: <20230323162146.791FA132C2@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 List-Id: The following avoids picking up dead code left over from folding during FRE/PRE, effectively undoing propagations. Bootstrapped and tested on x86_64-unknown-linux-gnu, pushed. PR tree-optimization/107569 * tree-ssa-sccvn.cc (eliminate_dom_walker::eliminate_stmt): Do not push SSA names with zero uses as available leader. (process_bb): Likewise. * g++.dg/opt/pr107569.C: New testcase. --- gcc/testsuite/g++.dg/opt/pr107569.C | 29 +++++++++++++++++++++++++++++ gcc/tree-ssa-sccvn.cc | 17 +++++++++++------ 2 files changed, 40 insertions(+), 6 deletions(-) create mode 100644 gcc/testsuite/g++.dg/opt/pr107569.C diff --git a/gcc/testsuite/g++.dg/opt/pr107569.C b/gcc/testsuite/g++.dg/opt/pr107569.C new file mode 100644 index 00000000000..e03941c7862 --- /dev/null +++ b/gcc/testsuite/g++.dg/opt/pr107569.C @@ -0,0 +1,29 @@ +// { dg-do compile } +// { dg-require-effective-target c++20 } +// { dg-options "-O2 -fdump-tree-evrp -fdump-tree-vrp1" } + +namespace std +{ + constexpr bool isfinite (float x) { return __builtin_isfinite (x); } + constexpr bool isfinite (double x) { return __builtin_isfinite (x); } + constexpr bool isfinite (long double x) { return __builtin_isfinite (x); } +} + +bool +foo (double x) +{ + if (!std::isfinite (x)) + __builtin_unreachable (); + + return std::isfinite (x); +} + +bool +bar (double x) +{ + [[assume (std::isfinite (x))]]; + return std::isfinite (x); +} + +/* { dg-final { scan-tree-dump "return 1;" "evrp" } } */ +/* { dg-final { scan-tree-dump-times "return 1;" 2 "vrp1" } } */ diff --git a/gcc/tree-ssa-sccvn.cc b/gcc/tree-ssa-sccvn.cc index d5b081a309f..6b8d38b270c 100644 --- a/gcc/tree-ssa-sccvn.cc +++ b/gcc/tree-ssa-sccvn.cc @@ -7197,10 +7197,14 @@ eliminate_dom_walker::eliminate_stmt (basic_block b, gimple_stmt_iterator *gsi) } /* Make new values available - for fully redundant LHS we - continue with the next stmt above and skip this. */ - def_operand_p defp; - FOR_EACH_SSA_DEF_OPERAND (defp, stmt, iter, SSA_OP_DEF) - eliminate_push_avail (b, DEF_FROM_PTR (defp)); + continue with the next stmt above and skip this. + But avoid picking up dead defs. */ + tree def; + FOR_EACH_SSA_TREE_OPERAND (def, stmt, iter, SSA_OP_DEF) + if (! has_zero_uses (def) + || (inserted_exprs + && bitmap_bit_p (inserted_exprs, SSA_NAME_VERSION (def)))) + eliminate_push_avail (b, def); } /* Perform elimination for the basic-block B during the domwalk. */ @@ -8046,9 +8050,10 @@ process_bb (rpo_elim &avail, basic_block bb, avail.eliminate_stmt (bb, &gsi); else /* If not eliminating, make all not already available defs - available. */ + available. But avoid picking up dead defs. */ FOR_EACH_SSA_TREE_OPERAND (op, gsi_stmt (gsi), i, SSA_OP_DEF) - if (! avail.eliminate_avail (bb, op)) + if (! has_zero_uses (op) + && ! avail.eliminate_avail (bb, op)) avail.eliminate_push_avail (bb, op); } -- 2.35.3