This patch adds support for modelling the varying costs of different addressing modes.
authorCharles Baylis <charles.baylis@linaro.org>
Thu, 23 Nov 2017 18:39:44 +0000 (18:39 +0000)
committerCharles Baylis <cbaylis@gcc.gnu.org>
Thu, 23 Nov 2017 18:39:44 +0000 (18:39 +0000)
This patch adds support for modelling the varying costs of
different addressing modes. The generic cost table treats
all addressing modes as having equal cost.

gcc/ChangeLog:

2017-11-23  Charles Baylis  <charles.baylis@linaro.org>

        * config/arm/arm-protos.h (enum arm_addr_mode_op): New.
        (struct addr_mode_cost_table): New.
        (struct tune_params): Add field addr_mode_costs.
        * config/arm/arm.c (generic_addr_mode_costs): New.
        (arm_slowmul_tune): Initialise addr_mode_costs field.
        (arm_fastmul_tune): Likewise.
        (arm_strongarm_tune): Likewise.
        (arm_xscale_tune): Likewise.
        (arm_9e_tune): Likewise.
        (arm_marvell_pj4_tune): Likewise.
        (arm_v6t2_tune): Likewise.
        (arm_cortex_tune): Likewise.
        (arm_cortex_a8_tune): Likewise.
        (arm_cortex_a7_tune): Likewise.
        (arm_cortex_a15_tune): Likewise.
        (arm_cortex_a35_tune): Likewise.
        (arm_cortex_a53_tune): Likewise.
        (arm_cortex_a57_tune): Likewise.
        (arm_exynosm1_tune): Likewise.
        (arm_xgene1_tune): Likewise.
        (arm_cortex_a5_tune): Likewise.
        (arm_cortex_a9_tune): Likewise.
        (arm_cortex_a12_tune): Likewise.
        (arm_cortex_a73_tune): Likewise.
        (arm_v7m_tune): Likewise.
        (arm_cortex_m7_tune): Likewise.
        (arm_v6m_tune): Likewise.
        (arm_fa726te_tune): Likewise.
        (arm_mem_costs): Use table lookup to calculate cost of addressing
        mode.

From-SVN: r255112

gcc/ChangeLog
gcc/config/arm/arm-protos.h
gcc/config/arm/arm.c

index e41ae9f2dc40c4c8166a4ea79f25d8acfdeaf8fe..704d4e22c932723da43a66441c9872080eb93ca6 100644 (file)
@@ -1,3 +1,36 @@
+2017-11-23  Charles Baylis  <charles.baylis@linaro.org>
+
+       * config/arm/arm-protos.h (enum arm_addr_mode_op): New.
+       (struct addr_mode_cost_table): New.
+       (struct tune_params): Add field addr_mode_costs.
+       * config/arm/arm.c (generic_addr_mode_costs): New.
+       (arm_slowmul_tune): Initialise addr_mode_costs field.
+       (arm_fastmul_tune): Likewise.
+       (arm_strongarm_tune): Likewise.
+       (arm_xscale_tune): Likewise.
+       (arm_9e_tune): Likewise.
+       (arm_marvell_pj4_tune): Likewise.
+       (arm_v6t2_tune): Likewise.
+       (arm_cortex_tune): Likewise.
+       (arm_cortex_a8_tune): Likewise.
+       (arm_cortex_a7_tune): Likewise.
+       (arm_cortex_a15_tune): Likewise.
+       (arm_cortex_a35_tune): Likewise.
+       (arm_cortex_a53_tune): Likewise.
+       (arm_cortex_a57_tune): Likewise.
+       (arm_exynosm1_tune): Likewise.
+       (arm_xgene1_tune): Likewise.
+       (arm_cortex_a5_tune): Likewise.
+       (arm_cortex_a9_tune): Likewise.
+       (arm_cortex_a12_tune): Likewise.
+       (arm_cortex_a73_tune): Likewise.
+       (arm_v7m_tune): Likewise.
+       (arm_cortex_m7_tune): Likewise.
+       (arm_v6m_tune): Likewise.
+       (arm_fa726te_tune): Likewise.
+       (arm_mem_costs): Use table lookup to calculate cost of addressing
+       mode.
+
 2017-11-23  Charles Baylis  <charles.baylis@linaro.org>
 
        * config/arm/arm.c (arm_mem_costs): New function.
index 10c96390ea6cc584a5bb055096ff1aef6871507c..0c977429c122cabc555569a56edea806853c100b 100644 (file)
@@ -263,12 +263,32 @@ struct cpu_vec_costs {
 
 struct cpu_cost_table;
 
+/* Addressing mode operations.  Used to index tables in struct
+   addr_mode_cost_table.  */
+enum arm_addr_mode_op
+{
+   AMO_DEFAULT,
+   AMO_NO_WB,  /* Offset with no writeback.  */
+   AMO_WB,     /* Offset with writeback.  */
+   AMO_MAX     /* For array size.  */
+};
+
+/* Table of additional costs in units of COSTS_N_INSNS() when using
+   addressing modes for each access type.  */
+struct addr_mode_cost_table
+{
+   const int integer[AMO_MAX];
+   const int fp[AMO_MAX];
+   const int vector[AMO_MAX];
+};
+
 /* Dump function ARM_PRINT_TUNE_INFO should be updated whenever this
    structure is modified.  */
 
 struct tune_params
 {
   const struct cpu_cost_table *insn_extra_cost;
+  const struct addr_mode_cost_table *addr_mode_costs;
   bool (*sched_adjust_cost) (rtx_insn *, int, rtx_insn *, int *);
   int (*branch_cost) (bool, bool);
   /* Vectorizer costs.  */
index 5bdf7ff7e047bc32819221daafb75c075494e136..64dc8cd684380fbd35c7ff8c1592e8c5dede2657 100644 (file)
@@ -1763,9 +1763,32 @@ const struct cpu_cost_table v7m_extra_costs =
   }
 };
 
+const struct addr_mode_cost_table generic_addr_mode_costs =
+{
+  /* int.  */
+  {
+    COSTS_N_INSNS (0), /* AMO_DEFAULT.  */
+    COSTS_N_INSNS (0), /* AMO_NO_WB.  */
+    COSTS_N_INSNS (0)  /* AMO_WB.  */
+  },
+  /* float.  */
+  {
+    COSTS_N_INSNS (0), /* AMO_DEFAULT.  */
+    COSTS_N_INSNS (0), /* AMO_NO_WB.  */
+    COSTS_N_INSNS (0)  /* AMO_WB.  */
+  },
+  /* vector.  */
+  {
+    COSTS_N_INSNS (0), /* AMO_DEFAULT.  */
+    COSTS_N_INSNS (0), /* AMO_NO_WB.  */
+    COSTS_N_INSNS (0)  /* AMO_WB.  */
+  }
+};
+
 const struct tune_params arm_slowmul_tune =
 {
   &generic_extra_costs,                        /* Insn extra costs.  */
+  &generic_addr_mode_costs,            /* Addressing mode costs.  */
   NULL,                                        /* Sched adj cost.  */
   arm_default_branch_cost,
   &arm_default_vec_cost,
@@ -1788,6 +1811,7 @@ const struct tune_params arm_slowmul_tune =
 const struct tune_params arm_fastmul_tune =
 {
   &generic_extra_costs,                        /* Insn extra costs.  */
+  &generic_addr_mode_costs,            /* Addressing mode costs.  */
   NULL,                                        /* Sched adj cost.  */
   arm_default_branch_cost,
   &arm_default_vec_cost,
@@ -1813,6 +1837,7 @@ const struct tune_params arm_fastmul_tune =
 const struct tune_params arm_strongarm_tune =
 {
   &generic_extra_costs,                        /* Insn extra costs.  */
+  &generic_addr_mode_costs,            /* Addressing mode costs.  */
   NULL,                                        /* Sched adj cost.  */
   arm_default_branch_cost,
   &arm_default_vec_cost,
@@ -1835,6 +1860,7 @@ const struct tune_params arm_strongarm_tune =
 const struct tune_params arm_xscale_tune =
 {
   &generic_extra_costs,                        /* Insn extra costs.  */
+  &generic_addr_mode_costs,            /* Addressing mode costs.  */
   xscale_sched_adjust_cost,
   arm_default_branch_cost,
   &arm_default_vec_cost,
@@ -1857,6 +1883,7 @@ const struct tune_params arm_xscale_tune =
 const struct tune_params arm_9e_tune =
 {
   &generic_extra_costs,                        /* Insn extra costs.  */
+  &generic_addr_mode_costs,            /* Addressing mode costs.  */
   NULL,                                        /* Sched adj cost.  */
   arm_default_branch_cost,
   &arm_default_vec_cost,
@@ -1879,6 +1906,7 @@ const struct tune_params arm_9e_tune =
 const struct tune_params arm_marvell_pj4_tune =
 {
   &generic_extra_costs,                        /* Insn extra costs.  */
+  &generic_addr_mode_costs,            /* Addressing mode costs.  */
   NULL,                                        /* Sched adj cost.  */
   arm_default_branch_cost,
   &arm_default_vec_cost,
@@ -1901,6 +1929,7 @@ const struct tune_params arm_marvell_pj4_tune =
 const struct tune_params arm_v6t2_tune =
 {
   &generic_extra_costs,                        /* Insn extra costs.  */
+  &generic_addr_mode_costs,            /* Addressing mode costs.  */
   NULL,                                        /* Sched adj cost.  */
   arm_default_branch_cost,
   &arm_default_vec_cost,
@@ -1925,6 +1954,7 @@ const struct tune_params arm_v6t2_tune =
 const struct tune_params arm_cortex_tune =
 {
   &generic_extra_costs,
+  &generic_addr_mode_costs,            /* Addressing mode costs.  */
   NULL,                                        /* Sched adj cost.  */
   arm_default_branch_cost,
   &arm_default_vec_cost,
@@ -1947,6 +1977,7 @@ const struct tune_params arm_cortex_tune =
 const struct tune_params arm_cortex_a8_tune =
 {
   &cortexa8_extra_costs,
+  &generic_addr_mode_costs,            /* Addressing mode costs.  */
   NULL,                                        /* Sched adj cost.  */
   arm_default_branch_cost,
   &arm_default_vec_cost,
@@ -1969,6 +2000,7 @@ const struct tune_params arm_cortex_a8_tune =
 const struct tune_params arm_cortex_a7_tune =
 {
   &cortexa7_extra_costs,
+  &generic_addr_mode_costs,            /* Addressing mode costs.  */
   NULL,                                        /* Sched adj cost.  */
   arm_default_branch_cost,
   &arm_default_vec_cost,
@@ -1991,6 +2023,7 @@ const struct tune_params arm_cortex_a7_tune =
 const struct tune_params arm_cortex_a15_tune =
 {
   &cortexa15_extra_costs,
+  &generic_addr_mode_costs,            /* Addressing mode costs.  */
   NULL,                                        /* Sched adj cost.  */
   arm_default_branch_cost,
   &arm_default_vec_cost,
@@ -2013,6 +2046,7 @@ const struct tune_params arm_cortex_a15_tune =
 const struct tune_params arm_cortex_a35_tune =
 {
   &cortexa53_extra_costs,
+  &generic_addr_mode_costs,            /* Addressing mode costs.  */
   NULL,                                        /* Sched adj cost.  */
   arm_default_branch_cost,
   &arm_default_vec_cost,
@@ -2035,6 +2069,7 @@ const struct tune_params arm_cortex_a35_tune =
 const struct tune_params arm_cortex_a53_tune =
 {
   &cortexa53_extra_costs,
+  &generic_addr_mode_costs,            /* Addressing mode costs.  */
   NULL,                                        /* Sched adj cost.  */
   arm_default_branch_cost,
   &arm_default_vec_cost,
@@ -2057,6 +2092,7 @@ const struct tune_params arm_cortex_a53_tune =
 const struct tune_params arm_cortex_a57_tune =
 {
   &cortexa57_extra_costs,
+  &generic_addr_mode_costs,            /* addressing mode costs */
   NULL,                                        /* Sched adj cost.  */
   arm_default_branch_cost,
   &arm_default_vec_cost,
@@ -2079,6 +2115,7 @@ const struct tune_params arm_cortex_a57_tune =
 const struct tune_params arm_exynosm1_tune =
 {
   &exynosm1_extra_costs,
+  &generic_addr_mode_costs,                    /* Addressing mode costs.  */
   NULL,                                                /* Sched adj cost.  */
   arm_default_branch_cost,
   &arm_default_vec_cost,
@@ -2101,6 +2138,7 @@ const struct tune_params arm_exynosm1_tune =
 const struct tune_params arm_xgene1_tune =
 {
   &xgene1_extra_costs,
+  &generic_addr_mode_costs,            /* Addressing mode costs.  */
   NULL,                                        /* Sched adj cost.  */
   arm_default_branch_cost,
   &arm_default_vec_cost,
@@ -2126,6 +2164,7 @@ const struct tune_params arm_xgene1_tune =
 const struct tune_params arm_cortex_a5_tune =
 {
   &cortexa5_extra_costs,
+  &generic_addr_mode_costs,            /* Addressing mode costs.  */
   NULL,                                        /* Sched adj cost.  */
   arm_cortex_a5_branch_cost,
   &arm_default_vec_cost,
@@ -2148,6 +2187,7 @@ const struct tune_params arm_cortex_a5_tune =
 const struct tune_params arm_cortex_a9_tune =
 {
   &cortexa9_extra_costs,
+  &generic_addr_mode_costs,            /* Addressing mode costs.  */
   cortex_a9_sched_adjust_cost,
   arm_default_branch_cost,
   &arm_default_vec_cost,
@@ -2170,6 +2210,7 @@ const struct tune_params arm_cortex_a9_tune =
 const struct tune_params arm_cortex_a12_tune =
 {
   &cortexa12_extra_costs,
+  &generic_addr_mode_costs,            /* Addressing mode costs.  */
   NULL,                                        /* Sched adj cost.  */
   arm_default_branch_cost,
   &arm_default_vec_cost,                        /* Vectorizer costs.  */
@@ -2192,6 +2233,7 @@ const struct tune_params arm_cortex_a12_tune =
 const struct tune_params arm_cortex_a73_tune =
 {
   &cortexa57_extra_costs,
+  &generic_addr_mode_costs,                    /* Addressing mode costs.  */
   NULL,                                                /* Sched adj cost.  */
   arm_default_branch_cost,
   &arm_default_vec_cost,                       /* Vectorizer costs.  */
@@ -2221,6 +2263,7 @@ const struct tune_params arm_cortex_a73_tune =
 const struct tune_params arm_v7m_tune =
 {
   &v7m_extra_costs,
+  &generic_addr_mode_costs,            /* Addressing mode costs.  */
   NULL,                                        /* Sched adj cost.  */
   arm_cortex_m_branch_cost,
   &arm_default_vec_cost,
@@ -2245,6 +2288,7 @@ const struct tune_params arm_v7m_tune =
 const struct tune_params arm_cortex_m7_tune =
 {
   &v7m_extra_costs,
+  &generic_addr_mode_costs,            /* Addressing mode costs.  */
   NULL,                                        /* Sched adj cost.  */
   arm_cortex_m7_branch_cost,
   &arm_default_vec_cost,
@@ -2270,6 +2314,7 @@ const struct tune_params arm_cortex_m7_tune =
 const struct tune_params arm_v6m_tune =
 {
   &generic_extra_costs,                        /* Insn extra costs.  */
+  &generic_addr_mode_costs,            /* Addressing mode costs.  */
   NULL,                                        /* Sched adj cost.  */
   arm_default_branch_cost,
   &arm_default_vec_cost,                        /* Vectorizer costs.  */
@@ -2292,6 +2337,7 @@ const struct tune_params arm_v6m_tune =
 const struct tune_params arm_fa726te_tune =
 {
   &generic_extra_costs,                                /* Insn extra costs.  */
+  &generic_addr_mode_costs,                    /* Addressing mode costs.  */
   fa726te_sched_adjust_cost,
   arm_default_branch_cost,
   &arm_default_vec_cost,
@@ -9261,6 +9307,41 @@ arm_mem_costs (rtx x, const struct cpu_cost_table *extra_cost,
        below.  See arm.md:calculate_pic_address.  */
     *cost += COSTS_N_INSNS (1);
 
+  /* Calculate cost of the addressing mode.  */
+  if (speed_p)
+    {
+      arm_addr_mode_op op_type;
+      switch (GET_CODE (XEXP (x, 0)))
+       {
+       default:
+       case REG:
+         op_type = AMO_DEFAULT;
+         break;
+       case MINUS:
+         /* MINUS does not appear in RTL, but the architecture supports it,
+            so handle this case defensively.  */
+         /* fall through */
+       case PLUS:
+         op_type = AMO_NO_WB;
+         break;
+       case PRE_INC:
+       case PRE_DEC:
+       case POST_INC:
+       case POST_DEC:
+       case PRE_MODIFY:
+       case POST_MODIFY:
+         op_type = AMO_WB;
+         break;
+       }
+
+      if (VECTOR_MODE_P (mode))
+         *cost += current_tune->addr_mode_costs->vector[op_type];
+      else if (FLOAT_MODE_P (mode))
+         *cost += current_tune->addr_mode_costs->fp[op_type];
+      else
+         *cost += current_tune->addr_mode_costs->integer[op_type];
+    }
+
   /* Calculate cost of memory access.  */
   if (speed_p)
     {