From patchwork Thu Nov 11 17:24:32 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Aldy Hernandez X-Patchwork-Id: 47494 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id D6AF6385801F for ; Thu, 11 Nov 2021 17:26:37 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org D6AF6385801F DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gcc.gnu.org; s=default; t=1636651597; bh=YNsC/3myxS/3ENGTKVZqu3/2BP4fVfGwMV2ALfk3GDU=; h=To:Subject:Date:In-Reply-To:References:List-Id:List-Unsubscribe: List-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To: From; b=DEWglUqD0ZG+j3kLH06QLM9PzmQ0EHUDQJoSfxb4aOZGDTWq+6OKcoY+CpehopChA bPFc/q/EpfW7d8kCyHq1OfPfANM3RDm2sFvu8+CT/UpOZR7bIBP/UgxwT9bfDGrFsO ya+muchQVJ/9Z1+Es3zQ6TVeVYiyPoSlkvrgol7s= X-Original-To: gcc-patches@gcc.gnu.org Delivered-To: gcc-patches@gcc.gnu.org Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) by sourceware.org (Postfix) with ESMTPS id 1BEE83857820 for ; Thu, 11 Nov 2021 17:24:46 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 1BEE83857820 Received: from mimecast-mx01.redhat.com (mimecast-mx01.redhat.com [209.132.183.4]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-206-va7YHVktPRWBBF5JAIWbig-1; Thu, 11 Nov 2021 12:24:42 -0500 X-MC-Unique: va7YHVktPRWBBF5JAIWbig-1 Received: from smtp.corp.redhat.com (int-mx04.intmail.prod.int.phx2.redhat.com [10.5.11.14]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx01.redhat.com (Postfix) with ESMTPS id C805B101520B; Thu, 11 Nov 2021 17:24:41 +0000 (UTC) Received: from abulafia.quesejoda.com (unknown [10.39.192.226]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 57D2317CD9; Thu, 11 Nov 2021 17:24:41 +0000 (UTC) Received: from abulafia.quesejoda.com (localhost [127.0.0.1]) by abulafia.quesejoda.com (8.16.1/8.15.2) with ESMTPS id 1ABHOdbm893099 (version=TLSv1.3 cipher=TLS_AES_256_GCM_SHA384 bits=256 verify=NOT); Thu, 11 Nov 2021 18:24:39 +0100 Received: (from aldyh@localhost) by abulafia.quesejoda.com (8.16.1/8.16.1/Submit) id 1ABHOdMt893098; Thu, 11 Nov 2021 18:24:39 +0100 To: GCC patches Subject: [PATCH] Make ranger optional in path_range_query. Date: Thu, 11 Nov 2021 18:24:32 +0100 Message-Id: <20211111172432.893034-2-aldyh@redhat.com> In-Reply-To: <20211111172432.893034-1-aldyh@redhat.com> References: <20211111172432.893034-1-aldyh@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 2.79 on 10.5.11.14 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com X-Spam-Status: No, score=-13.3 required=5.0 tests=BAYES_00, DKIMWL_WL_HIGH, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, RCVD_IN_DNSWL_LOW, RCVD_IN_MSPIKE_H2, SPF_HELO_NONE, SPF_NONE, TXREP autolearn=ham autolearn_force=no version=3.4.4 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) 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: Aldy Hernandez via Gcc-patches From: Aldy Hernandez Reply-To: Aldy Hernandez Errors-To: gcc-patches-bounces+patchwork=sourceware.org@gcc.gnu.org Sender: "Gcc-patches" All users of path_range_query are currently allocating a gimple_ranger only to pass it to the query object. It's tidier to just do it from path_range_query if no ranger was passed. Will push pending tests on x86-64 Linux. gcc/ChangeLog: * gimple-range-path.cc (path_range_query::path_range_query): New ctor without a ranger. (path_range_query::~path_range_query): Free ranger if necessary. (path_range_query::range_on_path_entry): Adjust m_ranger for pointer. (path_range_query::ssa_range_in_phi): Same. (path_range_query::compute_ranges_in_block): Same. (path_range_query::compute_imports): Same. (path_range_query::compute_ranges): Same. (path_range_query::range_of_stmt): Same. (path_range_query::compute_outgoing_relations): Same. * gimple-range-path.h (class path_range_query): New ctor. * tree-ssa-loop-ch.c (ch_base::copy_headers): Remove gimple_ranger as path_range_query allocates one. * tree-ssa-threadbackward.c (class back_threader): Remove m_ranger. (back_threader::~back_threader): Same. --- gcc/gimple-range-path.cc | 43 +++++++++++++++++++++++------------ gcc/gimple-range-path.h | 9 ++++++-- gcc/tree-ssa-loop-ch.c | 4 +--- gcc/tree-ssa-threadbackward.c | 5 +--- 4 files changed, 37 insertions(+), 24 deletions(-) diff --git a/gcc/gimple-range-path.cc b/gcc/gimple-range-path.cc index 4843c133e62..b9aceaf2565 100644 --- a/gcc/gimple-range-path.cc +++ b/gcc/gimple-range-path.cc @@ -36,13 +36,24 @@ along with GCC; see the file COPYING3. If not see // Internal construct to help facilitate debugging of solver. #define DEBUG_SOLVER (dump_file && (param_threader_debug == THREADER_DEBUG_ALL)) -path_range_query::path_range_query (gimple_ranger &ranger, bool resolve) - : m_ranger (ranger) +path_range_query::path_range_query (gimple_ranger *ranger, bool resolve) + : m_cache (new ssa_global_cache), + m_has_cache_entry (BITMAP_ALLOC (NULL)), + m_ranger (ranger), + m_resolve (resolve), + m_alloced_ranger (false) { - m_cache = new ssa_global_cache; - m_has_cache_entry = BITMAP_ALLOC (NULL); - m_resolve = resolve; - m_oracle = new path_oracle (ranger.oracle ()); + m_oracle = new path_oracle (ranger->oracle ()); +} + +path_range_query::path_range_query (bool resolve) + : m_cache (new ssa_global_cache), + m_has_cache_entry (BITMAP_ALLOC (NULL)), + m_ranger (new gimple_ranger), + m_resolve (resolve), + m_alloced_ranger (true) +{ + m_oracle = new path_oracle (m_ranger->oracle ()); } path_range_query::~path_range_query () @@ -50,6 +61,8 @@ path_range_query::~path_range_query () BITMAP_FREE (m_has_cache_entry); delete m_cache; delete m_oracle; + if (m_alloced_ranger) + delete m_ranger; } // Mark cache entry for NAME as unused. @@ -140,7 +153,7 @@ path_range_query::range_on_path_entry (irange &r, tree name) gimple *last = last_stmt (entry); if (last) { - if (m_ranger.range_of_expr (r, name, last)) + if (m_ranger->range_of_expr (r, name, last)) return; gcc_unreachable (); } @@ -156,7 +169,7 @@ path_range_query::range_on_path_entry (irange &r, tree name) { edge e = EDGE_PRED (entry, i); if (e->src != ENTRY_BLOCK_PTR_FOR_FN (cfun) - && m_ranger.range_on_edge (tmp, e, name)) + && m_ranger->range_on_edge (tmp, e, name)) { r.union_ (tmp); changed = true; @@ -244,7 +257,7 @@ path_range_query::ssa_range_in_phi (irange &r, gphi *phi) if (at_entry ()) { - if (m_resolve && m_ranger.range_of_expr (r, name, phi)) + if (m_resolve && m_ranger->range_of_expr (r, name, phi)) return; // Try fold just in case we can resolve simple things like PHI <5(99), 6(88)>. @@ -275,7 +288,7 @@ path_range_query::ssa_range_in_phi (irange &r, gphi *phi) range_on_path_entry (r, arg); else r.set_varying (TREE_TYPE (name)); - m_ranger.range_on_edge (tmp, e_in, arg); + m_ranger->range_on_edge (tmp, e_in, arg); r.intersect (tmp); return; } @@ -370,7 +383,7 @@ path_range_query::compute_ranges_in_block (basic_block bb) EXECUTE_IF_SET_IN_BITMAP (m_imports, 0, i, bi) { tree name = ssa_name (i); - gori_compute &g = m_ranger.gori (); + gori_compute &g = m_ranger->gori (); bitmap exports = g.exports (bb); if (bitmap_bit_p (exports, i)) @@ -452,7 +465,7 @@ void path_range_query::compute_imports (bitmap imports, basic_block exit) { // Start with the imports from the exit block... - bitmap r_imports = m_ranger.gori ().imports (exit); + bitmap r_imports = m_ranger->gori ().imports (exit); bitmap_copy (imports, r_imports); auto_vec worklist (bitmap_count_bits (imports)); @@ -539,7 +552,7 @@ path_range_query::compute_ranges (const vec &path, if (m_resolve) { - gori_compute &gori = m_ranger.gori (); + gori_compute &gori = m_ranger->gori (); tree name; // Exported booleans along the path, may help conditionals. @@ -659,7 +672,7 @@ path_range_query::range_of_stmt (irange &r, gimple *stmt, tree) if (m_resolve) { fold_using_range f; - jt_fur_source src (stmt, this, &m_ranger.gori (), m_path); + jt_fur_source src (stmt, this, &m_ranger->gori (), m_path); if (!f.fold_stmt (r, stmt, src)) r.set_varying (type); } @@ -750,7 +763,7 @@ path_range_query::compute_outgoing_relations (basic_block bb, basic_block next) else gcc_unreachable (); - jt_fur_source src (NULL, this, &m_ranger.gori (), m_path); + jt_fur_source src (NULL, this, &m_ranger->gori (), m_path); src.register_outgoing_edges (cond, r, e0, e1); } } diff --git a/gcc/gimple-range-path.h b/gcc/gimple-range-path.h index b5a054359ad..ea4864d35ef 100644 --- a/gcc/gimple-range-path.h +++ b/gcc/gimple-range-path.h @@ -32,7 +32,8 @@ along with GCC; see the file COPYING3. If not see class path_range_query : public range_query { public: - path_range_query (class gimple_ranger &ranger, bool resolve); + path_range_query (class gimple_ranger *ranger, bool resolve = true); + path_range_query (bool resolve = true); virtual ~path_range_query (); void compute_ranges (const vec &, const bitmap_head *imports = NULL); void compute_ranges (edge e); @@ -86,7 +87,7 @@ private: auto_vec m_path; auto_bitmap m_imports; - gimple_ranger &m_ranger; + gimple_ranger *m_ranger; non_null_ref m_non_null; // Current path position. @@ -97,6 +98,10 @@ private: // Set if there were any undefined expressions while pre-calculating path. bool m_undefined_path; + + // True if m_ranger was allocated in this class and must be freed at + // destruction. + bool m_alloced_ranger; }; // Return TRUE if NAME is in the import bitmap. diff --git a/gcc/tree-ssa-loop-ch.c b/gcc/tree-ssa-loop-ch.c index b87361c3741..566cc275317 100644 --- a/gcc/tree-ssa-loop-ch.c +++ b/gcc/tree-ssa-loop-ch.c @@ -384,8 +384,7 @@ ch_base::copy_headers (function *fun) auto_vec candidates; auto_vec > copied; - gimple_ranger *ranger = new gimple_ranger; - path_range_query *query = new path_range_query (*ranger, /*resolve=*/true); + path_range_query *query = new path_range_query; for (auto loop : loops_list (cfun, 0)) { int initial_limit = param_max_loop_header_insns; @@ -423,7 +422,6 @@ ch_base::copy_headers (function *fun) } /* Do not use ranger after we change the IL and not have updated SSA. */ delete query; - delete ranger; for (auto loop : candidates) { diff --git a/gcc/tree-ssa-threadbackward.c b/gcc/tree-ssa-threadbackward.c index 61aee25d236..71989c288a7 100644 --- a/gcc/tree-ssa-threadbackward.c +++ b/gcc/tree-ssa-threadbackward.c @@ -100,7 +100,6 @@ private: back_threader_registry m_registry; back_threader_profitability m_profit; - gimple_ranger *m_ranger; path_range_query *m_solver; // Current path being analyzed. @@ -143,15 +142,13 @@ back_threader::back_threader (function *fun, unsigned flags, bool first) m_fun = fun; m_flags = flags; - m_ranger = new gimple_ranger; - m_solver = new path_range_query (*m_ranger, flags & BT_RESOLVE); + m_solver = new path_range_query (flags & BT_RESOLVE); m_last_stmt = NULL; } back_threader::~back_threader () { delete m_solver; - delete m_ranger; loop_optimizer_finalize (); }