From patchwork Tue Sep 12 08:34:36 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Charles Baylis X-Patchwork-Id: 112254 Delivered-To: patch@linaro.org Received: by 10.140.106.117 with SMTP id d108csp4881308qgf; Tue, 12 Sep 2017 01:35:48 -0700 (PDT) X-Received: by 10.99.114.76 with SMTP id c12mr13781560pgn.221.1505205348270; Tue, 12 Sep 2017 01:35:48 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1505205348; cv=none; d=google.com; s=arc-20160816; b=H7NPeKb+Kh8zp7oI8o7We2pTrmOYijcjzvTBMTSFBRwU9oO9KRAqIJwquLE+KOl/1I vWa/YwATAyRDf1NhpbONt/GdobOGaCjG+kuuI/Wo4o+f5+Rc/w08dQqRx+wrP8+7A6ps x6p70xE17GRda0Xj2r6n4Pw4tzjSJxeqF0cCP5lAJPTZoHcz7ODYgRU9lI5HzgugbKi/ 4jqveuGLrQDLFiakl78psWO+kcPXu9P1ltmNZT2iqDhpQxoMlEUX8dHZbyOwN6fS94Pg pL1Sqg6Kkn2gCOGieyG5BTNwfrxRYvtBao5CuWF+EZxqsSm6+nPdhQzUNlZhDRhMP9GK Yiwg== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=references:in-reply-to:message-id:date:subject:cc:to:from :delivered-to:sender:list-help:list-post:list-archive :list-unsubscribe:list-id:precedence:mailing-list:dkim-signature :domainkey-signature:arc-authentication-results; bh=DQRhajOLkIRNno4LcKAYiHFaexKOXmrd9AacYrbw4zQ=; b=cRbhgsLmz0U4nlDmQwNEKnZVZlVujAus1iovPjBd/hGkvT+MED6+1jbdDPubRK9MMZ jTzSsrHMVq2YBo5Vj8qmXR8a9TVSGq/RfkcMm3Mfu1JT/guJh6RCM1qKi46Z0lDnC2ML W8SpNf8Jm6bpiKOx3O+NiV/mKbHB60w6jdTxdjyFv/lheYOkRx07M56xo7cvtUSM0luy Pe8gO8tiMAoL37NrtnNH5arxrGFbrWtcMrGuhJrVkgpscbQUdpk031yboGooaWGxcy2A qHtIMKcXxmYOvAhVjiTqyTzmDVhYrXzSoaG7DVvzXIMGcPYccrwc46Hnmou7Qcc9YOO4 k8Iw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gcc.gnu.org header.s=default header.b=F95YookR; spf=pass (google.com: domain of gcc-patches-return-461894-patch=linaro.org@gcc.gnu.org designates 209.132.180.131 as permitted sender) smtp.mailfrom=gcc-patches-return-461894-patch=linaro.org@gcc.gnu.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=linaro.org Return-Path: Received: from sourceware.org (server1.sourceware.org. [209.132.180.131]) by mx.google.com with ESMTPS id 64si8295241ply.469.2017.09.12.01.35.48 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Tue, 12 Sep 2017 01:35:48 -0700 (PDT) Received-SPF: pass (google.com: domain of gcc-patches-return-461894-patch=linaro.org@gcc.gnu.org designates 209.132.180.131 as permitted sender) client-ip=209.132.180.131; Authentication-Results: mx.google.com; dkim=pass header.i=@gcc.gnu.org header.s=default header.b=F95YookR; spf=pass (google.com: domain of gcc-patches-return-461894-patch=linaro.org@gcc.gnu.org designates 209.132.180.131 as permitted sender) smtp.mailfrom=gcc-patches-return-461894-patch=linaro.org@gcc.gnu.org; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=linaro.org DomainKey-Signature: a=rsa-sha1; c=nofws; d=gcc.gnu.org; h=list-id :list-unsubscribe:list-archive:list-post:list-help:sender:from :to:cc:subject:date:message-id:in-reply-to:references; q=dns; s= default; b=cTW528XrdeUcj2xP3DaVCv0sQMl/Sy/QH1M0mOQwblJJ52SEW8DEa 5gPtJBa/B3rMASd6s0i2a48AeRVrNC7y7STChHoPvvR/8MRuoF/2mQNS1kiI5e1T 5gFoE55auFcnH3hcODMZ5WOK9nLM5bhZDqzozRwdF3r2DsLAWUuUG4= DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=gcc.gnu.org; h=list-id :list-unsubscribe:list-archive:list-post:list-help:sender:from :to:cc:subject:date:message-id:in-reply-to:references; s= default; bh=Nr1Wh96q/z7rrs58aXGAYCH2r7s=; b=F95YookR7V8Fn9XTv332 ixT/1OiAk5ZU4WNfOVWeb48WR2pXKs8sTLhSh8GfRFSosE9LL/qmbnXMTKrm9Qic OKP1opH9CekGCadiEJjiPfhhU3LdEcUnsjqYY97CjNIYe64e9nYGVb4Uy5HEKoC2 QjGdvXsfqPmiTmY+6yX1rOs= Received: (qmail 76004 invoked by alias); 12 Sep 2017 08:35:01 -0000 Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org Delivered-To: mailing list gcc-patches@gcc.gnu.org Received: (qmail 75867 invoked by uid 89); 12 Sep 2017 08:35:01 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-25.1 required=5.0 tests=AWL, BAYES_00, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, RCVD_IN_DNSWL_NONE, SPF_PASS autolearn=ham version=3.3.2 spammy= X-HELO: mail-wr0-f170.google.com Received: from mail-wr0-f170.google.com (HELO mail-wr0-f170.google.com) (209.85.128.170) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Tue, 12 Sep 2017 08:34:58 +0000 Received: by mail-wr0-f170.google.com with SMTP id v109so19072088wrc.1 for ; Tue, 12 Sep 2017 01:34:58 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=DQRhajOLkIRNno4LcKAYiHFaexKOXmrd9AacYrbw4zQ=; b=k3fmNDiQxEOe+R601rMC61elFcY7WZzVD4xIReeNX0vk5Gj/WkfL6mkuh9OShrYajf NU3G7heYuit3Axhd8JkC37OtBXFH0tGggDH7XkfKrX5BCV9wUiS9qB7u21huFVR0RbjH CgD+rnfrThF4tGxxzZevVxjqW15x4p9A0WROw/t4rznOaI1trNdQy1CiE1jpJSt4+Xwf OrU9q7JlrDmi/bCZ/UXFug+UEJ2A0oP46yRVpx4nIK+setxTz0blL3HjCOP9eRdqpKJX 63lvX6h0LMs/6SofmEkIx6pTrsa1SziCxIRekgthrn5s7ZvKqp2pB+3htxYNUPJHuaDs vdUw== X-Gm-Message-State: AHPjjUg3sauOPXcEeypvicK3d6wvLV/jiS7hoE9+mYL4qxS1Mj4o1wrZ tg7UPQJuA29c2E7e X-Google-Smtp-Source: ADKCNb6e1ypQ8yq8YRKhKOSqgyeNA745rluQX7NLHKU4RX10kDEmyWE3PczWg3S1G+jONDVb6wSftg== X-Received: by 10.223.135.97 with SMTP id 30mr9976757wrz.245.1505205296712; Tue, 12 Sep 2017 01:34:56 -0700 (PDT) Received: from localhost.localdomain (cpc92322-cmbg19-2-0-cust1928.5-4.cable.virginm.net. [86.26.39.137]) by smtp.gmail.com with ESMTPSA id s126sm13321227wmd.46.2017.09.12.01.34.55 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Tue, 12 Sep 2017 01:34:56 -0700 (PDT) From: charles.baylis@linaro.org To: rearnsha@arm.com, Ramana.Radhakrishnan@arm.com, pinskia@gmail.com, kyrylo.tkachov@arm.com Cc: gcc-patches@gcc.gnu.org Subject: [PATCH 2/3] [ARM] Refactor costs calculation for MEM. Date: Tue, 12 Sep 2017 09:34:36 +0100 Message-Id: <1505205277-26276-3-git-send-email-charles.baylis@linaro.org> In-Reply-To: <1505205277-26276-1-git-send-email-charles.baylis@linaro.org> References: <1505205277-26276-1-git-send-email-charles.baylis@linaro.org> X-IsSubscribed: yes From: Charles Baylis This patch moves the calculation of costs for MEM into a separate function, and reforms the calculation into two parts. Firstly any additional cost of the addressing mode is calculated, and then the cost of the memory access itself is added. In this patch, the calculation of the cost of the addressing mode is left as a placeholder, to be added in a subsequent patch. gcc/ChangeLog: Charles Baylis * config/arm/arm.c (arm_mem_costs): New function. (arm_rtx_costs_internal): Use arm_mem_costs. gcc/testsuite/ChangeLog: Charles Baylis * gcc.target/arm/addr-modes-float.c: New test. * gcc.target/arm/addr-modes-int.c: New test. * gcc.target/arm/addr-modes.h: New header. Change-Id: I99e93406ea39ee31f71c7bf428ad3e127b7a618e --- gcc/config/arm/arm.c | 67 ++++++++++++++++--------- gcc/testsuite/gcc.target/arm/addr-modes-float.c | 42 ++++++++++++++++ gcc/testsuite/gcc.target/arm/addr-modes-int.c | 46 +++++++++++++++++ gcc/testsuite/gcc.target/arm/addr-modes.h | 53 +++++++++++++++++++ 4 files changed, 183 insertions(+), 25 deletions(-) create mode 100644 gcc/testsuite/gcc.target/arm/addr-modes-float.c create mode 100644 gcc/testsuite/gcc.target/arm/addr-modes-int.c create mode 100644 gcc/testsuite/gcc.target/arm/addr-modes.h -- 2.7.4 diff --git a/gcc/config/arm/arm.c b/gcc/config/arm/arm.c index 32001e5..b8dbed6 100644 --- a/gcc/config/arm/arm.c +++ b/gcc/config/arm/arm.c @@ -9228,8 +9228,48 @@ arm_unspec_cost (rtx x, enum rtx_code /* outer_code */, bool speed_p, int *cost) } \ while (0); +/* Helper function for arm_rtx_costs_internal. Calculates the cost of a MEM, + considering the costs of the addressing mode and memory access + separately. */ +static bool +arm_mem_costs (rtx x, const struct cpu_cost_table *extra_cost, + int *cost, bool speed_p) +{ + machine_mode mode = GET_MODE (x); + if (flag_pic + && GET_CODE (XEXP (x, 0)) == PLUS + && will_be_in_index_register (XEXP (XEXP (x, 0), 1))) + /* This will be split into two instructions. Add the cost of the + additional instruction here. The cost of the memory access is computed + below. See arm.md:calculate_pic_address. */ + *cost = COSTS_N_INSNS (1); + else + *cost = 0; + + /* Calculate cost of the addressing mode. */ + if (speed_p) + { + /* TODO: Add table-driven costs for addressing modes. (See patch 2) */ + } + + /* Calculate cost of memory access. */ + if (speed_p) + { + /* data transfer is transfer size divided by bus width. */ + int bus_width_bytes = current_tune->bus_width / 4; + *cost += CEIL (GET_MODE_SIZE (mode), bus_width_bytes); + *cost += extra_cost->ldst.load; + } + else + { + *cost += COSTS_N_INSNS (1); + } + + return true; +} + /* RTX costs. Make an estimate of the cost of executing the operation - X, which is contained with an operation with code OUTER_CODE. + X, which is contained within an operation with code OUTER_CODE. SPEED_P indicates whether the cost desired is the performance cost, or the size cost. The estimate is stored in COST and the return value is TRUE if the cost calculation is final, or FALSE if the @@ -9308,30 +9348,7 @@ arm_rtx_costs_internal (rtx x, enum rtx_code code, enum rtx_code outer_code, return false; case MEM: - /* A memory access costs 1 insn if the mode is small, or the address is - a single register, otherwise it costs one insn per word. */ - if (REG_P (XEXP (x, 0))) - *cost = COSTS_N_INSNS (1); - else if (flag_pic - && GET_CODE (XEXP (x, 0)) == PLUS - && will_be_in_index_register (XEXP (XEXP (x, 0), 1))) - /* This will be split into two instructions. - See arm.md:calculate_pic_address. */ - *cost = COSTS_N_INSNS (2); - else - *cost = COSTS_N_INSNS (ARM_NUM_REGS (mode)); - - /* For speed optimizations, add the costs of the address and - accessing memory. */ - if (speed_p) -#ifdef NOT_YET - *cost += (extra_cost->ldst.load - + arm_address_cost (XEXP (x, 0), mode, - ADDR_SPACE_GENERIC, speed_p)); -#else - *cost += extra_cost->ldst.load; -#endif - return true; + return arm_mem_costs (x, extra_cost, cost, speed_p); case PARALLEL: { diff --git a/gcc/testsuite/gcc.target/arm/addr-modes-float.c b/gcc/testsuite/gcc.target/arm/addr-modes-float.c new file mode 100644 index 0000000..3b4235c --- /dev/null +++ b/gcc/testsuite/gcc.target/arm/addr-modes-float.c @@ -0,0 +1,42 @@ +/* { dg-options "-O2" } */ +/* { dg-add-options arm_neon } */ +/* { dg-require-effective-target arm_neon_ok } */ +/* { dg-do compile } */ + +#include + +#include "addr-modes.h" + +POST_STORE(float) +/* { dg-final { scan-assembler "vstmia.32" } } */ +POST_STORE(double) +/* { dg-final { scan-assembler "vstmia.64" } } */ + +POST_LOAD(float) +/* { dg-final { scan-assembler "vldmia.32" } } */ +POST_LOAD(double) +/* { dg-final { scan-assembler "vldmia.64" } } */ + +POST_STORE_VEC (int8_t, int8x8_t, vst1_s8) +/* { dg-final { scan-assembler "vst1.8\t\{.*\}, \\\[r\[0-9\]+\\\]!" } } */ +POST_STORE_VEC (int8_t, int8x16_t, vst1q_s8) +/* { dg-final { scan-assembler "vst1.8\t\{.*\[-,\]d.*\}, \\\[r\[0-9\]+\\\]!" } } */ + +POST_STORE_VEC (int8_t, int8x8x2_t, vst2_s8) +/* { dg-final { scan-assembler "vst2.8\t\{.*\}, \\\[r\[0-9\]+\\\]!" } } */ +POST_STORE_VEC (int8_t, int8x16x2_t, vst2q_s8) +/* { dg-final { scan-assembler "vst2.8\t\{.*-d.*\}, \\\[r\[0-9\]+\\\]!" } } */ + +POST_STORE_VEC (int8_t, int8x8x3_t, vst3_s8) +/* { dg-final { scan-assembler "vst3.8\t\{.*\}, \\\[r\[0-9\]+\\\]!" } } */ +POST_STORE_VEC (int8_t, int8x16x3_t, vst3q_s8) +/* { dg-final { scan-assembler "vst3.8\t\{d\[02468\], d\[02468\], d\[02468\]\}, \\\[r\[0-9\]+\\\]!" } } */ +/* { dg-final { scan-assembler "vst3.8\t\{d\[13579\], d\[13579\], d\[13579\]\}, \\\[r\[0-9\]+\\\]!" { xfail *-*-* } } } */ + +POST_STORE_VEC (int8_t, int8x8x4_t, vst4_s8) +/* { dg-final { scan-assembler "vst4.8\t\{.*\}, \\\[r\[0-9\]+\\\]!" } } */ +POST_STORE_VEC (int8_t, int8x16x4_t, vst4q_s8) +/* { dg-final { scan-assembler "vst4.8\t\{d\[02468\], d\[02468\], d\[02468\], d\[02468\]\}, \\\[r\[0-9\]+\\\]!" } } */ +/* { dg-final { scan-assembler "vst4.8\t\{d\[13579\], d\[13579\], d\[13579\], d\[13579\]\}, \\\[r\[0-9\]+\\\]!" { xfail *-*-* } } } */ + +/* { dg-final { scan-assembler-not "add" { xfail *-*-* } } } */ diff --git a/gcc/testsuite/gcc.target/arm/addr-modes-int.c b/gcc/testsuite/gcc.target/arm/addr-modes-int.c new file mode 100644 index 0000000..e3e1e6a --- /dev/null +++ b/gcc/testsuite/gcc.target/arm/addr-modes-int.c @@ -0,0 +1,46 @@ +/* { dg-options "-O2 -march=armv7-a" } */ +/* { dg-add-options arm_neon } */ +/* { dg-require-effective-target arm_neon_ok } */ +/* { dg-do compile } */ + +#include "addr-modes.h" + +typedef long long ll; + +PRE_STORE(char) +/* { dg-final { scan-assembler "strb.*#1]!" } } */ +PRE_STORE(short) +/* { dg-final { scan-assembler "strh.*#2]!" } } */ +PRE_STORE(int) +/* { dg-final { scan-assembler "str.*#4]!" } } */ +PRE_STORE(ll) +/* { dg-final { scan-assembler "strd.*#8]!" } } */ + +POST_STORE(char) +/* { dg-final { scan-assembler "strb.*], #1" } } */ +POST_STORE(short) +/* { dg-final { scan-assembler "strh.*], #2" } } */ +POST_STORE(int) +/* { dg-final { scan-assembler "str.*], #4" } } */ +POST_STORE(ll) +/* { dg-final { scan-assembler "strd.*], #8" } } */ + +PRE_LOAD(char) +/* { dg-final { scan-assembler "ldrb.*#1]!" } } */ +PRE_LOAD(short) +/* { dg-final { scan-assembler "ldrsh.*#2]!" } } */ +PRE_LOAD(int) +/* { dg-final { scan-assembler "ldr.*#4]!" } } */ +PRE_LOAD(ll) +/* { dg-final { scan-assembler "ldrd.*#8]!" } } */ + +POST_LOAD(char) +/* { dg-final { scan-assembler "ldrb.*], #1" } } */ +POST_LOAD(short) +/* { dg-final { scan-assembler "ldrsh.*], #2" } } */ +POST_LOAD(int) +/* { dg-final { scan-assembler "ldr.*], #4" } } */ +POST_LOAD(ll) +/* { dg-final { scan-assembler "ldrd.*], #8" } } */ + +/* { dg-final { scan-assembler-not "\tadd" } } */ diff --git a/gcc/testsuite/gcc.target/arm/addr-modes.h b/gcc/testsuite/gcc.target/arm/addr-modes.h new file mode 100644 index 0000000..eac4678 --- /dev/null +++ b/gcc/testsuite/gcc.target/arm/addr-modes.h @@ -0,0 +1,53 @@ + +#define PRE_STORE(T) \ + T * \ + T ## _pre_store (T *p, T v) \ + { \ + *++p = v; \ + return p; \ + } \ + +#define POST_STORE(T) \ + T * \ + T ## _post_store (T *p, T v) \ + { \ + *p++ = v; \ + return p; \ + } + +#define POST_STORE_VEC(T, VT, OP) \ + T * \ + VT ## _post_store (T * p, VT v) \ + { \ + OP (p, v); \ + p += sizeof (VT) / sizeof (T); \ + return p; \ + } + +#define PRE_LOAD(T) \ + void \ + T ## _pre_load (T *p) \ + { \ + extern void f ## T (T*,T); \ + T x = *++p; \ + f ## T (p, x); \ + } + +#define POST_LOAD(T) \ + void \ + T ## _post_load (T *p) \ + { \ + extern void f ## T (T*,T); \ + T x = *p++; \ + f ## T (p, x); \ + } + +#define POST_LOAD_VEC(T, VT, OP) \ + void \ + VT ## _post_load (T * p) \ + { \ + extern void f ## T (T*,T); \ + VT x = OP (p, v); \ + p += sizeof (VT) / sizeof (T); \ + f ## T (p, x); \ + }