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 6AF5C384D199 for ; Wed, 7 Sep 2022 10:07:08 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 6AF5C384D199 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 relay2.suse.de (relay2.suse.de [149.44.160.134]) by smtp-out2.suse.de (Postfix) with ESMTP id 328DD2029E for ; Wed, 7 Sep 2022 10:07:07 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_rsa; t=1662545227; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc: mime-version:mime-version:content-type:content-type; bh=CKhgHEXMglFLKRN0W/6VOxGnEhJBExLa32akJc4WiFM=; b=QXf4HA78scPA+B5hzFAZ7qfZ4iWXjCoN+ruR9xYf5JCH431kx1JNHkjdVn9nnV/egYUAIr jfwfI0Vb3gN54D7pCHdX+BUIp+Btm5wO7GU9Sn3ISQp9Vv0biBLUlFw0H5B6I5O0vMK8/s 5Yt9jDcZzBfyHed2gTdfD0XFAPa8vC0= DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_ed25519; t=1662545227; h=from:from:reply-to:date:date:message-id:message-id:to:to:cc: mime-version:mime-version:content-type:content-type; bh=CKhgHEXMglFLKRN0W/6VOxGnEhJBExLa32akJc4WiFM=; b=U9xubHd76H0IfzkVqC229Gkmn+zKSDgVi1AARFEmvp6VZ/0t4NaMsWqqYRTgfTcr9shiBe gl9msXTx1uYAGLAQ== Received: from wotan.suse.de (wotan.suse.de [10.160.0.1]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by relay2.suse.de (Postfix) with ESMTPS id 2DF3D2C141 for ; Wed, 7 Sep 2022 10:07:07 +0000 (UTC) Date: Wed, 7 Sep 2022 10:07:07 +0000 (UTC) From: Richard Biener To: gcc-patches@gcc.gnu.org Subject: [PATCH] mark region also for USE predicate discovery Message-ID: User-Agent: Alpine 2.22 (LSU 394 2020-01-19) MIME-Version: 1.0 Content-Type: text/plain; charset=US-ASCII X-Spam-Status: No, score=-11.1 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,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 List-Id: The following makes sure to mark the dominating region also for USE predicate discovery, avoiding compute_control_dep_chain to walk to unrelated areas, eating up walking budget. Bootstrapped and tested on x86_64-unknown-linux-gnu, pushed. * gimple-predicate-analysis.cc (dfs_mark_dominating_region): Adjust to take the region exit source as argument. (uninit_analysis::init_from_phi_def): Adjust. (uninit_analysis::init_use_preds): Mark the dominating region before computing control dependences. --- gcc/gimple-predicate-analysis.cc | 27 +++++++++++++++++++-------- 1 file changed, 19 insertions(+), 8 deletions(-) diff --git a/gcc/gimple-predicate-analysis.cc b/gcc/gimple-predicate-analysis.cc index 5dade458947..f81af2589cd 100644 --- a/gcc/gimple-predicate-analysis.cc +++ b/gcc/gimple-predicate-analysis.cc @@ -934,23 +934,23 @@ simple_control_dep_chain (vec& chain, basic_block from, basic_block to) } /* Perform a DFS walk on predecessor edges to mark the region denoted - by the EXIT edge and DOM which dominates EXIT->src, including DOM. + by the EXIT_SRC block and DOM which dominates EXIT_SRC, including DOM. Blocks in the region are marked with FLAG and added to BBS. BBS is filled up to its capacity only after which the walk is terminated and false is returned. If the whole region was marked, true is returned. */ static bool -dfs_mark_dominating_region (edge exit, basic_block dom, int flag, +dfs_mark_dominating_region (basic_block exit_src, basic_block dom, int flag, vec &bbs) { - if (exit->src == dom || exit->src->flags & flag) + if (exit_src == dom || exit_src->flags & flag) return true; if (!bbs.space (1)) return false; - bbs.quick_push (exit->src); - exit->src->flags |= flag; + bbs.quick_push (exit_src); + exit_src->flags |= flag; auto_vec stack (bbs.allocated () - bbs.length () + 1); - stack.quick_push (ei_start (exit->src->preds)); + stack.quick_push (ei_start (exit_src->preds)); while (!stack.is_empty ()) { /* Look at the edge on the top of the stack. */ @@ -1960,6 +1960,10 @@ uninit_analysis::init_use_preds (predicate &use_preds, basic_block def_bb, } while (1); + auto_bb_flag in_region (cfun); + auto_vec region (MIN (n_basic_blocks_for_fn (cfun), + param_uninit_control_dep_attempts)); + /* Set DEP_CHAINS to the set of edges between CD_ROOT and USE_BB. Each DEP_CHAINS element is a series of edges whose conditions are logical conjunctions. Together, the DEP_CHAINS vector is @@ -1967,7 +1971,9 @@ uninit_analysis::init_use_preds (predicate &use_preds, basic_block def_bb, unsigned num_chains = 0; auto_vec dep_chains[MAX_NUM_CHAINS]; - if (!compute_control_dep_chain (cd_root, use_bb, dep_chains, &num_chains)) + if (!dfs_mark_dominating_region (use_bb, cd_root, in_region, region) + || !compute_control_dep_chain (cd_root, use_bb, dep_chains, &num_chains, + in_region)) { /* If the info in dep_chains is not complete we need to use a conservative approximation for the use predicate. */ @@ -1979,6 +1985,10 @@ uninit_analysis::init_use_preds (predicate &use_preds, basic_block def_bb, simple_control_dep_chain (dep_chains[0], cd_root, use_bb); } + /* Unmark the region. */ + for (auto bb : region) + bb->flags &= ~in_region; + /* From the set of edges computed above initialize *THIS as the OR condition under which the definition in DEF_BB is used in USE_BB. Each OR subexpression is represented by one element of DEP_CHAINS, @@ -2061,7 +2071,8 @@ uninit_analysis::init_from_phi_def (gphi *phi) } } for (unsigned i = 0; i < nedges; i++) - if (!dfs_mark_dominating_region (def_edges[i], cd_root, in_region, region)) + if (!dfs_mark_dominating_region (def_edges[i]->src, cd_root, + in_region, region)) break; unsigned num_chains = 0; -- 2.37.3