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 CD0683858C52 for ; Wed, 22 Mar 2023 12:29:53 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org CD0683858C52 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-out1.suse.de (Postfix) with ESMTP id 7056533AD9; Wed, 22 Mar 2023 12:29:52 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_rsa; t=1679488192; h=from:from:reply-to:date:date:to:to:cc:cc:mime-version:mime-version: content-type:content-type; bh=N89F5dDoglYz9eZnr5zihuGhhO2g+e8q+W35WVPjt7o=; b=ukAegOco36nCMeANPJc6dMFaXweaIgQZX3IL78GJO9bVZYw5FVqHXVgH4h9eiwxmWcIF+P CQLVLRtR7E9ikAwtJjMhA644dM/PEMHwsevDUQq8QBSTGXi4azwv6G7AqV5zkzgpE3VJUw vbiKc8W/uQjhFE0HqbJ/BdUd0ODdO3I= DKIM-Signature: v=1; a=ed25519-sha256; c=relaxed/relaxed; d=suse.de; s=susede2_ed25519; t=1679488192; h=from:from:reply-to:date:date:to:to:cc:cc:mime-version:mime-version: content-type:content-type; bh=N89F5dDoglYz9eZnr5zihuGhhO2g+e8q+W35WVPjt7o=; b=hDNAuqWBSkGXims0MR9psYuUawUgmXXzjfUpcAoIB0pS2wT53zHy+jEBbhRuFry2s9LGQh Y9cpTGN8IqOKU1CQ== 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 3BA412C141; Wed, 22 Mar 2023 12:29:52 +0000 (UTC) Date: Wed, 22 Mar 2023 12:29:52 +0000 (UTC) From: Richard Biener To: gcc-patches@gcc.gnu.org cc: Jakub Jelinek Subject: [PATCH] tree-optimization/109237 - last_stmt is possibly slow 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=-10.6 required=5.0 tests=BAYES_00,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,GIT_PATCH_0,MISSING_MID,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: Message-ID: <20230322122952.inFbDZKg2mCVqxD_sLsQAkgxwWKQJ6Cq1XTvtMy1GMU@z> Most uses of last_stmt are interested in control transfer stmts and for the testcase gimple_purge_dead_eh_edges shows up in the profile. But last_stmt looks past trailing debug stmts but those would be rejected by GIMPLEs verify_flow_info. The following adds possible_ctrl_stmt besides last_stmt which does not look past trailing debug stmts and adjusts gimple_purge_dead_eh_edges. I've put checking code into possible_ctrl_stmt that it will not miss a control statement if the real last stmt is a debug stmt. The alternative would be to change last_stmt, explicitely introducing last_nondebug_stmt. I remember we chickened out and made last_stmt conservative here but not anticipating the compile-time issues this creates. I count 227 last_stmt and 12 last_and_only_stmt uses. Bootstrapped and tested on x86_64-unknown-linux-gnu. Any opinions? I probably lean towards s/last_stmt/last_nondebug_stmt/ in next stage1 and then adding last_stmt and changing some uses back - through for maintainance that's going to be a nightmare (or maybe not, a "wrong" last_stmt should be safe to backport and a last_nondebug_stmt will fail to build). Richard. PR tree-optimization/109237 * tree-cfg.h (possible_ctrl_stmt): New function returning the last stmt not skipping debug stmts. (gimple_purge_dead_eh_edges): Use it. --- gcc/tree-cfg.cc | 22 +++++++++++++++++++++- gcc/tree-cfg.h | 1 + 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/gcc/tree-cfg.cc b/gcc/tree-cfg.cc index a9fcc7fd050..e167596209b 100644 --- a/gcc/tree-cfg.cc +++ b/gcc/tree-cfg.cc @@ -2947,6 +2947,26 @@ first_non_label_stmt (basic_block bb) return !gsi_end_p (i) ? gsi_stmt (i) : NULL; } +/* Return the last statement of a basic block BB that's possibly control + altering. Compared to last_stmt this will return a debug stmt if that + is the last stmt. */ + +gimple * +possible_ctrl_stmt (basic_block bb) +{ + gimple_stmt_iterator i = gsi_last_bb (bb); + if (gsi_end_p (i)) + return NULL; + if (flag_checking && is_gimple_debug (gsi_stmt (i))) + { + /* Verify that if the real last stmt is a debug stmt the + last non-debug stmt isn't control altering. */ + gimple *last = last_stmt (bb); + gcc_assert (!last || !stmt_ends_bb_p (last)); + } + return gsi_stmt (i); +} + /* Return the last statement in basic block BB. */ gimple * @@ -8990,7 +9010,7 @@ gimple_purge_dead_eh_edges (basic_block bb) bool changed = false; edge e; edge_iterator ei; - gimple *stmt = last_stmt (bb); + gimple *stmt = possible_ctrl_stmt (bb); if (stmt && stmt_can_throw_internal (cfun, stmt)) return false; diff --git a/gcc/tree-cfg.h b/gcc/tree-cfg.h index 9b56a68fe9d..7c6a9a4f16b 100644 --- a/gcc/tree-cfg.h +++ b/gcc/tree-cfg.h @@ -61,6 +61,7 @@ extern bool assert_unreachable_fallthru_edge_p (edge); extern void delete_tree_cfg_annotations (function *); extern gphi *get_virtual_phi (basic_block); extern gimple *first_stmt (basic_block); +extern gimple *possible_ctrl_stmt (basic_block); extern gimple *last_stmt (basic_block); extern gimple *last_and_only_stmt (basic_block); extern bool verify_gimple_in_seq (gimple_seq, bool = true); -- 2.35.3