From patchwork Fri Nov 12 17:40:08 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Richard Sandiford X-Patchwork-Id: 47549 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 33B9D385840B for ; Fri, 12 Nov 2021 17:44:20 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 33B9D385840B DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gcc.gnu.org; s=default; t=1636739060; bh=wJPmsZfNyFK2AjKfNgfMSlbSvMRHMsgjk2NYXDpdnUY=; h=To:Subject:Date:List-Id:List-Unsubscribe:List-Archive:List-Post: List-Help:List-Subscribe:From:Reply-To:From; b=qjm55PuAtO1216qVTc2ded5LaUApbzUZ//rXruFtW+DXFtnddbfkusfesnsM/t1w+ 48HgURakee3dYsgtTW1DnTN5bi0QoAptZooTTbHVWFcHd5AVgm7nC3/04E7A9OYRqc JyGgpH4v1sHcAdhQh+0newgFdBOfb3fpo6vIDJEQ= 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 A82DF3857C43 for ; Fri, 12 Nov 2021 17:40:10 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org A82DF3857C43 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 5A7B7D6E for ; Fri, 12 Nov 2021 09:40:10 -0800 (PST) Received: from localhost (unknown [10.32.98.88]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id F40623F718 for ; Fri, 12 Nov 2021 09:40:09 -0800 (PST) To: gcc-patches@gcc.gnu.org Mail-Followup-To: gcc-patches@gcc.gnu.org, richard.sandiford@arm.com Subject: [committed] aarch64: Add vf_factor to aarch64_vec_op_count Date: Fri, 12 Nov 2021 17:40:08 +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" -mtune=neoverse-512tvb sets the likely SVE vector length to 128 bits, but it also takes into account Neoverse V1, which is a 256-bit target. This patch adds this VF (VL) factor to aarch64_vec_op_count. Tested on aarch64-linux-gnu & applied. Richard gcc/ * config/aarch64/aarch64.c (aarch64_vec_op_count::m_vf_factor): New member variable. (aarch64_vec_op_count::aarch64_vec_op_count): Add a parameter for it. (aarch64_vec_op_count::vf_factor): New function. (aarch64_vector_costs::aarch64_vector_costs): When costing for neoverse-512tvb, pass a vf_factor of 2 for the Neoverse V1 version of an SVE loop. (aarch64_vector_costs::adjust_body_cost): Read the vf factor instead of hard-coding 2. --- gcc/config/aarch64/aarch64.c | 30 ++++++++++++++++++++++++------ 1 file changed, 24 insertions(+), 6 deletions(-) diff --git a/gcc/config/aarch64/aarch64.c b/gcc/config/aarch64/aarch64.c index 241cef8c5d9..5fa64fe5350 100644 --- a/gcc/config/aarch64/aarch64.c +++ b/gcc/config/aarch64/aarch64.c @@ -14711,9 +14711,12 @@ class aarch64_vec_op_count { public: aarch64_vec_op_count () = default; - aarch64_vec_op_count (const aarch64_vec_issue_info *, unsigned int); + aarch64_vec_op_count (const aarch64_vec_issue_info *, unsigned int, + unsigned int = 1); unsigned int vec_flags () const { return m_vec_flags; } + unsigned int vf_factor () const { return m_vf_factor; } + const aarch64_base_vec_issue_info *base_issue_info () const; const aarch64_simd_vec_issue_info *simd_issue_info () const; const aarch64_sve_vec_issue_info *sve_issue_info () const; @@ -14753,13 +14756,23 @@ private: - If M_VEC_FLAGS & VEC_ANY_SVE is nonzero then this structure describes SVE code. */ unsigned int m_vec_flags = 0; + + /* Assume that, when the code is executing on the core described + by M_ISSUE_INFO, one iteration of the loop will handle M_VF_FACTOR + times more data than the vectorizer anticipates. + + This is only ever different from 1 for SVE. It allows us to consider + what would happen on a 256-bit SVE target even when the -mtune + parameters say that the “likely” SVE length is 128 bits. */ + unsigned int m_vf_factor = 1; }; aarch64_vec_op_count:: aarch64_vec_op_count (const aarch64_vec_issue_info *issue_info, - unsigned int vec_flags) + unsigned int vec_flags, unsigned int vf_factor) : m_issue_info (issue_info), - m_vec_flags (vec_flags) + m_vec_flags (vec_flags), + m_vf_factor (vf_factor) { } @@ -14973,7 +14986,11 @@ aarch64_vector_costs::aarch64_vector_costs (vec_info *vinfo, if (m_vec_flags & VEC_ANY_SVE) m_advsimd_ops.quick_push ({ issue_info, VEC_ADVSIMD }); if (aarch64_tune_params.vec_costs == &neoverse512tvb_vector_cost) - m_ops.quick_push ({ &neoversev1_vec_issue_info, m_vec_flags }); + { + unsigned int vf_factor = (m_vec_flags & VEC_ANY_SVE) ? 2 : 1; + m_ops.quick_push ({ &neoversev1_vec_issue_info, m_vec_flags, + vf_factor }); + } } } @@ -16111,8 +16128,9 @@ adjust_body_cost (loop_vec_info loop_vinfo, if (dump_enabled_p ()) dump_printf_loc (MSG_NOTE, vect_location, "Neoverse V1 estimate:\n"); - adjust_body_cost_sve (&m_ops[1], scalar_cycles_per_iter * 2, - advsimd_cycles_per_iter * 2, + auto vf_factor = m_ops[1].vf_factor (); + adjust_body_cost_sve (&m_ops[1], scalar_cycles_per_iter * vf_factor, + advsimd_cycles_per_iter * vf_factor, could_use_advsimd, orig_body_cost, &body_cost, &should_disparage); }