From patchwork Mon Nov 8 10:47:58 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Richard Sandiford X-Patchwork-Id: 47207 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 0A63F3858429 for ; Mon, 8 Nov 2021 10:48:29 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 0A63F3858429 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gcc.gnu.org; s=default; t=1636368509; bh=oowX1Jk3pdQKGzmFlj5KFJXeimaZvYJsPDzgyqMxvyM=; h=To:Subject:Date:List-Id:List-Unsubscribe:List-Archive:List-Post: List-Help:List-Subscribe:From:Reply-To:From; b=DBUXX9QppeQJu+lteO7gCbJZRgN1mKtX2j6r3yVw6wXiFMvvJKmGUYXKaXEJxI2Ar pWdCcp737PCgK3Hh3Ts3QW/qYZv/f6Pnpq+BzXudSEBJbPv16LHEEPfm0QJf/EsB7T dPSpurLd2jR4ljmu0xo0schEMhViF0/lzYQlQBaY= X-Original-To: gcc-patches@gcc.gnu.org Delivered-To: gcc-patches@gcc.gnu.org Received: from foss.arm.com (foss.arm.com [217.140.110.172]) by sourceware.org (Postfix) with ESMTP id 73B003858401 for ; Mon, 8 Nov 2021 10:48:00 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 73B003858401 Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id 1EE06D6E for ; Mon, 8 Nov 2021 02:48:00 -0800 (PST) Received: from localhost (e121540-lin.manchester.arm.com [10.32.98.88]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id BA5633F800 for ; Mon, 8 Nov 2021 02:47:59 -0800 (PST) To: gcc-patches@gcc.gnu.org Mail-Followup-To: gcc-patches@gcc.gnu.org, richard.sandiford@arm.com Subject: [PATCH] vect: Pass scalar_costs to finish_cost Date: Mon, 08 Nov 2021 10:47:58 +0000 Message-ID: User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/26.3 (gnu/linux) MIME-Version: 1.0 X-Spam-Status: No, score=-12.4 required=5.0 tests=BAYES_00, GIT_PATCH_0, KAM_DMARC_STATUS, SPF_HELO_NONE, SPF_PASS, 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: Richard Sandiford via Gcc-patches From: Richard Sandiford Reply-To: Richard Sandiford Errors-To: gcc-patches-bounces+patchwork=sourceware.org@gcc.gnu.org Sender: "Gcc-patches" When finishing the vector costs, it can be useful to know what the associated scalar costs were. This allows targets to read information collected about the original scalar loop when trying to make a final judgement about the cost of the vector code. This patch therefore passes the scalar costs to vector_costs::finish_cost. The parameter is null for the scalar costs themselves. Tested on aarch64-linux-gnu and x86_64-linux-gnu. OK to install? Richard gcc/ * tree-vectorizer.h (vector_costs::finish_cost): Take the corresponding scalar costs as a parameter. (finish_cost): Likewise. * tree-vect-loop.c (vect_compute_single_scalar_iteration_cost) (vect_estimate_min_profitable_iters): Update accordingly. * tree-vect-slp.c (vect_bb_vectorization_profitable_p): Likewise. * tree-vectorizer.c (vector_costs::finish_cost): Likewise. * config/aarch64/aarch64.c (aarch64_vector_costs::finish_cost): Likewise. * config/rs6000/rs6000.c (rs6000_cost_data::finish_cost): Likewise. --- gcc/config/aarch64/aarch64.c | 6 +++--- gcc/config/rs6000/rs6000.c | 6 +++--- gcc/tree-vect-loop.c | 6 +++--- gcc/tree-vect-slp.c | 7 ++++--- gcc/tree-vectorizer.c | 2 +- gcc/tree-vectorizer.h | 14 +++++++++----- 6 files changed, 23 insertions(+), 18 deletions(-) diff --git a/gcc/config/aarch64/aarch64.c b/gcc/config/aarch64/aarch64.c index 19f67415234..ebb937211ed 100644 --- a/gcc/config/aarch64/aarch64.c +++ b/gcc/config/aarch64/aarch64.c @@ -14745,7 +14745,7 @@ public: stmt_vec_info stmt_info, tree vectype, int misalign, vect_cost_model_location where) override; - void finish_cost () override; + void finish_cost (const vector_costs *) override; private: void record_potential_advsimd_unrolling (loop_vec_info); @@ -16138,7 +16138,7 @@ aarch64_vector_costs::adjust_body_cost (unsigned int body_cost) } void -aarch64_vector_costs::finish_cost () +aarch64_vector_costs::finish_cost (const vector_costs *scalar_costs) { loop_vec_info loop_vinfo = dyn_cast (m_vinfo); if (loop_vinfo @@ -16146,7 +16146,7 @@ aarch64_vector_costs::finish_cost () && aarch64_use_new_vector_costs_p ()) m_costs[vect_body] = adjust_body_cost (m_costs[vect_body]); - vector_costs::finish_cost (); + vector_costs::finish_cost (scalar_costs); } static void initialize_aarch64_code_model (struct gcc_options *); diff --git a/gcc/config/rs6000/rs6000.c b/gcc/config/rs6000/rs6000.c index ec054800491..cd44ac61336 100644 --- a/gcc/config/rs6000/rs6000.c +++ b/gcc/config/rs6000/rs6000.c @@ -5268,7 +5268,7 @@ public: stmt_vec_info stmt_info, tree vectype, int misalign, vect_cost_model_location where) override; - void finish_cost () override; + void finish_cost (const vector_costs *) override; protected: void update_target_cost_per_stmt (vect_cost_for_stmt, stmt_vec_info, @@ -5522,7 +5522,7 @@ rs6000_cost_data::adjust_vect_cost_per_loop (loop_vec_info loop_vinfo) } void -rs6000_cost_data::finish_cost () +rs6000_cost_data::finish_cost (const vector_costs *scalar_costs) { if (loop_vec_info loop_vinfo = dyn_cast (m_vinfo)) { @@ -5539,7 +5539,7 @@ rs6000_cost_data::finish_cost () m_costs[vect_body] += 10000; } - vector_costs::finish_cost (); + vector_costs::finish_cost (scalar_costs); } /* Implement targetm.loop_unroll_adjust. */ diff --git a/gcc/tree-vect-loop.c b/gcc/tree-vect-loop.c index 887275a5071..190b52142e4 100644 --- a/gcc/tree-vect-loop.c +++ b/gcc/tree-vect-loop.c @@ -1301,7 +1301,7 @@ vect_compute_single_scalar_iteration_cost (loop_vec_info loop_vinfo) (void) add_stmt_cost (loop_vinfo->scalar_costs, si->count, si->kind, si->stmt_info, si->vectype, si->misalign, si->where); - loop_vinfo->scalar_costs->finish_cost (); + loop_vinfo->scalar_costs->finish_cost (nullptr); } @@ -4130,8 +4130,8 @@ vect_estimate_min_profitable_iters (loop_vec_info loop_vinfo, } /* Complete the target-specific cost calculations. */ - finish_cost (loop_vinfo->vector_costs, &vec_prologue_cost, - &vec_inside_cost, &vec_epilogue_cost); + finish_cost (loop_vinfo->vector_costs, loop_vinfo->scalar_costs, + &vec_prologue_cost, &vec_inside_cost, &vec_epilogue_cost); vec_outside_cost = (int)(vec_prologue_cost + vec_epilogue_cost); diff --git a/gcc/tree-vect-slp.c b/gcc/tree-vect-slp.c index d437bfd20d0..94c75497495 100644 --- a/gcc/tree-vect-slp.c +++ b/gcc/tree-vect-slp.c @@ -5344,7 +5344,8 @@ vect_bb_vectorization_profitable_p (bb_vec_info bb_vinfo, while (si < li_scalar_costs.length () && li_scalar_costs[si].first == sl); unsigned dummy; - finish_cost (scalar_target_cost_data, &dummy, &scalar_cost, &dummy); + finish_cost (scalar_target_cost_data, nullptr, + &dummy, &scalar_cost, &dummy); delete scalar_target_cost_data; /* Complete the target-specific vector cost calculation. */ @@ -5356,8 +5357,8 @@ vect_bb_vectorization_profitable_p (bb_vec_info bb_vinfo, } while (vi < li_vector_costs.length () && li_vector_costs[vi].first == vl); - finish_cost (vect_target_cost_data, &vec_prologue_cost, - &vec_inside_cost, &vec_epilogue_cost); + finish_cost (vect_target_cost_data, scalar_target_cost_data, + &vec_prologue_cost, &vec_inside_cost, &vec_epilogue_cost); delete vect_target_cost_data; vec_outside_cost = vec_prologue_cost + vec_epilogue_cost; diff --git a/gcc/tree-vectorizer.c b/gcc/tree-vectorizer.c index dcbb2a3f13a..71f12b3257e 100644 --- a/gcc/tree-vectorizer.c +++ b/gcc/tree-vectorizer.c @@ -1703,7 +1703,7 @@ vector_costs::add_stmt_cost (int count, vect_cost_for_stmt kind, /* See the comment above the declaration for details. */ void -vector_costs::finish_cost () +vector_costs::finish_cost (const vector_costs *) { gcc_assert (!m_finished); m_finished = true; diff --git a/gcc/tree-vectorizer.h b/gcc/tree-vectorizer.h index 8dba3a34aa9..da212334c06 100644 --- a/gcc/tree-vectorizer.h +++ b/gcc/tree-vectorizer.h @@ -1415,8 +1415,11 @@ public: vect_cost_model_location where); /* Finish calculating the cost of the code. The results can be - read back using the functions below. */ - virtual void finish_cost (); + read back using the functions below. + + If the costs describe vector code, SCALAR_COSTS gives the costs + of the corresponding scalar code, otherwise it is null. */ + virtual void finish_cost (const vector_costs *scalar_costs); /* The costs in THIS and OTHER both describe ways of vectorizing a main loop. Return true if the costs described by THIS are @@ -1691,10 +1694,11 @@ add_stmt_cost (vector_costs *costs, stmt_info_for_cost *i) /* Alias targetm.vectorize.finish_cost. */ static inline void -finish_cost (vector_costs *costs, unsigned *prologue_cost, - unsigned *body_cost, unsigned *epilogue_cost) +finish_cost (vector_costs *costs, const vector_costs *scalar_costs, + unsigned *prologue_cost, unsigned *body_cost, + unsigned *epilogue_cost) { - costs->finish_cost (); + costs->finish_cost (scalar_costs); *prologue_cost = costs->prologue_cost (); *body_cost = costs->body_cost (); *epilogue_cost = costs->epilogue_cost ();