From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from smtp-out1.suse.de (smtp-out1.suse.de [IPv6:2001:67c:2178:6::1c]) by sourceware.org (Postfix) with ESMTPS id DAADA3858436 for ; Mon, 13 Feb 2023 14:56:39 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org DAADA3858436 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-out1.suse.de (Postfix) with ESMTPS id D2C542187A for ; Mon, 13 Feb 2023 14:56:37 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_rsa; t=1676300197; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc: mime-version:mime-version:content-type:content-type; bh=Kt33R2yaOFg9U8m+/MVYPnM0Yx8xwF2tE6/G7YPcJ5c=; b=INlhjkKXKlothioP+2Xolp3Un6KyrnfhyiRVxG6nmASxCcP3TWvqOMh7O+9Pd29Huj9jbo swjTEyD2VmRClYOiuPeFslfWT+QuRbnRPZfMfuk7lJ3bqqB3Sv31bdP9Ai2S1QrHMJjWc6 I6RNYS8vCN/YKtoUEXIvHsA9rQsklXY= DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_ed25519; t=1676300197; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc: mime-version:mime-version:content-type:content-type; bh=Kt33R2yaOFg9U8m+/MVYPnM0Yx8xwF2tE6/G7YPcJ5c=; b=z9vcI7Z3SEUBet9dQLxvScnzTzblwhi9v8TizJgd7WT97y8jmY01XGvwzWQBkXR487ndXM 5ed9ExW/GnCtiWBg== 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 C023C138E6 for ; Mon, 13 Feb 2023 14:56:37 +0000 (UTC) Received: from dovecot-director2.suse.de ([192.168.254.65]) by imap2.suse-dmz.suse.de with ESMTPSA id BJ+6LaVP6mM4EgAAMHmgww (envelope-from ) for ; Mon, 13 Feb 2023 14:56:37 +0000 Date: Mon, 13 Feb 2023 15:56:37 +0100 (CET) From: Richard Biener To: gcc-patches@gcc.gnu.org Subject: [PATCH] tree-optimization/28614 - high FRE time for gcc.c-torture/compile/20001226-1.c MIME-Version: 1.0 Content-Type: text/plain; charset=US-ASCII Message-Id: <20230213145637.C023C138E6@imap2.suse-dmz.suse.de> X-Spam-Status: No, score=-11.7 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: I noticed that for gcc.c-torture/compile/20001226-1.c even -O1 has around 50% of the compile-time accounted to FRE. That's because we have blocks with a high incoming edge count and can_track_predicate_on_edge visits all of them even though it could stop after the second. The function is also called repeatedly for the same edge. The following fixes this and reduces the FRE time to 1% on the testcase. Bootstrapped and tested on x86_64-unknown-linux-gnu, pushed. PR tree-optimization/28614 * tree-ssa-sccvn.cc (can_track_predicate_on_edge): Avoid walking all edges in most cases. (vn_nary_op_insert_pieces_predicated): Avoid repeated calls to can_track_predicate_on_edge unless checking is enabled. (process_bb): Instead call it once here for each edge we register possibly multiple predicates on. --- gcc/tree-ssa-sccvn.cc | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/gcc/tree-ssa-sccvn.cc b/gcc/tree-ssa-sccvn.cc index 028bedbc9a0..e5bb278196a 100644 --- a/gcc/tree-ssa-sccvn.cc +++ b/gcc/tree-ssa-sccvn.cc @@ -4527,7 +4527,7 @@ vn_nary_op_insert_pieces (unsigned int length, enum tree_code code, static bool can_track_predicate_on_edge (edge pred_e) { - /* ??? As we are currently recording a basic-block index in + /* ??? As we are currently recording the destination basic-block index in vn_pval.valid_dominated_by_p and using dominance for the validity check we cannot track predicates on all edges. */ if (single_pred_p (pred_e->dest)) @@ -4537,14 +4537,14 @@ can_track_predicate_on_edge (edge pred_e) return false; /* When there's more than one predecessor we cannot track predicate validity based on the destination block. The - exception is when all other incoming edges are backedges. */ + exception is when all other incoming edges sources are + dominated by the destination block. */ edge_iterator ei; edge e; - int cnt = 0; FOR_EACH_EDGE (e, ei, pred_e->dest->preds) - if (! dominated_by_p (CDI_DOMINATORS, e->src, e->dest)) - cnt++; - return cnt == 1; + if (e != pred_e && ! dominated_by_p (CDI_DOMINATORS, e->src, e->dest)) + return false; + return true; } static vn_nary_op_t @@ -4553,8 +4553,8 @@ vn_nary_op_insert_pieces_predicated (unsigned int length, enum tree_code code, tree result, unsigned int value_id, edge pred_e) { - if (!can_track_predicate_on_edge (pred_e)) - return NULL; + gcc_assert (can_track_predicate_on_edge (pred_e)); + if (dump_file && (dump_flags & TDF_DETAILS) /* ??? Fix dumping, but currently we only get comparisons. */ && TREE_CODE_CLASS (code) == tcc_comparison) @@ -7933,11 +7933,11 @@ process_bb (rpo_elim &avail, basic_block bb, tree ops[2]; ops[0] = lhs; ops[1] = rhs; - if (do_region - && bitmap_bit_p (exit_bbs, true_e->dest->index)) + if ((do_region && bitmap_bit_p (exit_bbs, true_e->dest->index)) + || !can_track_predicate_on_edge (true_e)) true_e = NULL; - if (do_region - && bitmap_bit_p (exit_bbs, false_e->dest->index)) + if ((do_region && bitmap_bit_p (exit_bbs, false_e->dest->index)) + || !can_track_predicate_on_edge (false_e)) false_e = NULL; if (true_e) vn_nary_op_insert_pieces_predicated -- 2.35.3