aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorRichard Sandiford <richard.sandiford@arm.com>2021-03-26 16:08:34 +0000
committerRichard Sandiford <richard.sandiford@arm.com>2021-03-26 16:08:34 +0000
commit50a525b50c912999073a78220c6d62d87946b579 (patch)
treeda70151cbc3ee60d3f03784bdd16eace20626a9a /gcc
parent14bd21c2c576d6f4b9bd403f543502cff40f54fc (diff)
downloadgcc-50a525b50c912999073a78220c6d62d87946b579.zip
gcc-50a525b50c912999073a78220c6d62d87946b579.tar.gz
gcc-50a525b50c912999073a78220c6d62d87946b579.tar.bz2
aarch64: Use an aarch64-specific structure for vector costing
This patch makes the AArch64 vector code use its own vector costs structure, rather than just using the default unsigned[3]. Unfortunately, it's not easy to make this change specific to use_new_vector_costs, so this part is one that affects all CPUs. The change is relatively mechanical though. gcc/ * config/aarch64/aarch64.c (aarch64_vector_costs): New structure. (aarch64_init_cost): New function. (aarch64_add_stmt_cost): Use aarch64_vector_costs instead of the default unsigned[3]. (aarch64_finish_cost, aarch64_destroy_cost_data): New functions. (TARGET_VECTORIZE_INIT_COST): Override. (TARGET_VECTORIZE_FINISH_COST): Likewise. (TARGET_VECTORIZE_DESTROY_COST_DATA): Likewise.
Diffstat (limited to 'gcc')
-rw-r--r--gcc/config/aarch64/aarch64.c46
1 files changed, 44 insertions, 2 deletions
diff --git a/gcc/config/aarch64/aarch64.c b/gcc/config/aarch64/aarch64.c
index 2e9853e..81683b7 100644
--- a/gcc/config/aarch64/aarch64.c
+++ b/gcc/config/aarch64/aarch64.c
@@ -14111,6 +14111,21 @@ aarch64_first_cycle_multipass_dfa_lookahead_guard (rtx_insn *insn,
/* Vectorizer cost model target hooks. */
+/* Information about vector code that we're in the process of costing. */
+struct aarch64_vector_costs
+{
+ /* The normal latency-based costs for each region (prologue, body and
+ epilogue), indexed by vect_cost_model_location. */
+ unsigned int region[3] = {};
+};
+
+/* Implement TARGET_VECTORIZE_INIT_COST. */
+void *
+aarch64_init_cost (class loop *)
+{
+ return new aarch64_vector_costs;
+}
+
/* Return true if the current CPU should use the new costs defined
in GCC 11. This should be removed for GCC 12 and above, with the
costs applying to all CPUs instead. */
@@ -14535,7 +14550,7 @@ aarch64_add_stmt_cost (class vec_info *vinfo, void *data, int count,
struct _stmt_vec_info *stmt_info, tree vectype,
int misalign, enum vect_cost_model_location where)
{
- unsigned *cost = (unsigned *) data;
+ auto *costs = static_cast<aarch64_vector_costs *> (data);
unsigned retval = 0;
if (flag_vect_cost_model)
@@ -14569,12 +14584,30 @@ aarch64_add_stmt_cost (class vec_info *vinfo, void *data, int count,
count *= 50; /* FIXME */
retval = (unsigned) (count * stmt_cost);
- cost[where] += retval;
+ costs->region[where] += retval;
}
return retval;
}
+/* Implement TARGET_VECTORIZE_FINISH_COST. */
+static void
+aarch64_finish_cost (void *data, unsigned *prologue_cost,
+ unsigned *body_cost, unsigned *epilogue_cost)
+{
+ auto *costs = static_cast<aarch64_vector_costs *> (data);
+ *prologue_cost = costs->region[vect_prologue];
+ *body_cost = costs->region[vect_body];
+ *epilogue_cost = costs->region[vect_epilogue];
+}
+
+/* Implement TARGET_VECTORIZE_DESTROY_COST_DATA. */
+static void
+aarch64_destroy_cost_data (void *data)
+{
+ delete static_cast<aarch64_vector_costs *> (data);
+}
+
static void initialize_aarch64_code_model (struct gcc_options *);
/* Parse the TO_PARSE string and put the architecture struct that it
@@ -24713,9 +24746,18 @@ aarch64_libgcc_floating_mode_supported_p
#undef TARGET_ARRAY_MODE_SUPPORTED_P
#define TARGET_ARRAY_MODE_SUPPORTED_P aarch64_array_mode_supported_p
+#undef TARGET_VECTORIZE_INIT_COST
+#define TARGET_VECTORIZE_INIT_COST aarch64_init_cost
+
#undef TARGET_VECTORIZE_ADD_STMT_COST
#define TARGET_VECTORIZE_ADD_STMT_COST aarch64_add_stmt_cost
+#undef TARGET_VECTORIZE_FINISH_COST
+#define TARGET_VECTORIZE_FINISH_COST aarch64_finish_cost
+
+#undef TARGET_VECTORIZE_DESTROY_COST_DATA
+#define TARGET_VECTORIZE_DESTROY_COST_DATA aarch64_destroy_cost_data
+
#undef TARGET_VECTORIZE_BUILTIN_VECTORIZATION_COST
#define TARGET_VECTORIZE_BUILTIN_VECTORIZATION_COST \
aarch64_builtin_vectorization_cost