public inbox for gcc-patches@gcc.gnu.org
 help / color / mirror / Atom feed
* [PATCH v2] aarch64: Improve on ldp-stp policies code structure.
@ 2023-09-29 10:27 Manos Anagnostakis
  2023-09-29 10:34 ` Richard Sandiford
  0 siblings, 1 reply; 3+ messages in thread
From: Manos Anagnostakis @ 2023-09-29 10:27 UTC (permalink / raw)
  To: gcc-patches; +Cc: Richard Sandiford, Philipp Tomsich, Manos Anagnostakis

Improves on: 834fc2bf

This improves the code structure of the ldp-stp policies
patch introduced in 834fc2bf

Bootstrapped and regtested on aarch64-linux.

gcc/ChangeLog:
	* config/aarch64/aarch64-opts.h (enum aarch64_ldp_policy): Removed.
	(enum aarch64_ldp_stp_policy): Merged enums aarch64_ldp_policy
	and aarch64_stp_policy to aarch64_ldp_stp_policy.
	(enum aarch64_stp_policy): Removed.
	* config/aarch64/aarch64-protos.h (struct tune_params): Removed
	aarch64_ldp_policy_model and aarch64_stp_policy_model enum types
	and left only the definitions to the aarch64-opts one.
	* config/aarch64/aarch64.cc (aarch64_parse_ldp_policy): Removed.
	(aarch64_parse_stp_policy): Removed.
	(aarch64_override_options_internal): Removed calls to parsing
	functions and added obvious direct assignments.
	(aarch64_mem_ok_with_ldpstp_policy_model): Improved
	code quality based on the new changes.
	* config/aarch64/aarch64.opt: Use single enum type
	aarch64_ldp_stp_policy for both ldp and stp options.

gcc/testsuite/ChangeLog:
	* gcc.target/aarch64/ldp_aligned.c: Splitted into this and
	ldp_unaligned.
	* gcc.target/aarch64/stp_aligned.c: Splitted into this and
	stp_unaligned.
	* gcc.target/aarch64/ldp_unaligned.c: New test.
	* gcc.target/aarch64/stp_unaligned.c: New test.

Signed-off-by: Manos Anagnostakis <manos.anagnostakis@vrull.eu>
---
 gcc/config/aarch64/aarch64-opts.h             |  26 ++-
 gcc/config/aarch64/aarch64-protos.h           |  25 +--
 gcc/config/aarch64/aarch64.cc                 | 160 +++++++-----------
 gcc/config/aarch64/aarch64.opt                |  29 +---
 .../gcc.target/aarch64/ldp_aligned.c          |  28 ---
 .../gcc.target/aarch64/ldp_unaligned.c        |  40 +++++
 .../gcc.target/aarch64/stp_aligned.c          |  25 ---
 .../gcc.target/aarch64/stp_unaligned.c        |  37 ++++
 8 files changed, 155 insertions(+), 215 deletions(-)
 create mode 100644 gcc/testsuite/gcc.target/aarch64/ldp_unaligned.c
 create mode 100644 gcc/testsuite/gcc.target/aarch64/stp_unaligned.c

diff --git a/gcc/config/aarch64/aarch64-opts.h b/gcc/config/aarch64/aarch64-opts.h
index db8348507a3..831e28ab52a 100644
--- a/gcc/config/aarch64/aarch64-opts.h
+++ b/gcc/config/aarch64/aarch64-opts.h
@@ -108,20 +108,18 @@ enum aarch64_key_type {
   AARCH64_KEY_B
 };
 
-/* Load pair policy type.  */
-enum aarch64_ldp_policy {
-  LDP_POLICY_DEFAULT,
-  LDP_POLICY_ALWAYS,
-  LDP_POLICY_NEVER,
-  LDP_POLICY_ALIGNED
-};
-
-/* Store pair policy type.  */
-enum aarch64_stp_policy {
-  STP_POLICY_DEFAULT,
-  STP_POLICY_ALWAYS,
-  STP_POLICY_NEVER,
-  STP_POLICY_ALIGNED
+/* An enum specifying how to handle load and store pairs using
+   a fine-grained policy:
+   - LDP_STP_POLICY_DEFAULT: Use the policy defined in the tuning structure.
+   - LDP_STP_POLICY_ALIGNED: Emit ldp/stp if the source pointer is aligned
+   to at least double the alignment of the type.
+   - LDP_STP_POLICY_ALWAYS: Emit ldp/stp regardless of alignment.
+   - LDP_STP_POLICY_NEVER: Do not emit ldp/stp.  */
+enum aarch64_ldp_stp_policy {
+  AARCH64_LDP_STP_POLICY_DEFAULT,
+  AARCH64_LDP_STP_POLICY_ALIGNED,
+  AARCH64_LDP_STP_POLICY_ALWAYS,
+  AARCH64_LDP_STP_POLICY_NEVER
 };
 
 #endif
diff --git a/gcc/config/aarch64/aarch64-protos.h b/gcc/config/aarch64/aarch64-protos.h
index 5c6802b4fe8..60a55f4bc19 100644
--- a/gcc/config/aarch64/aarch64-protos.h
+++ b/gcc/config/aarch64/aarch64-protos.h
@@ -568,30 +568,9 @@ struct tune_params
   /* Place prefetch struct pointer at the end to enable type checking
      errors when tune_params misses elements (e.g., from erroneous merges).  */
   const struct cpu_prefetch_tune *prefetch;
-/* An enum specifying how to handle load pairs using a fine-grained policy:
-   - LDP_POLICY_ALIGNED: Emit ldp if the source pointer is aligned
-   to at least double the alignment of the type.
-   - LDP_POLICY_ALWAYS: Emit ldp regardless of alignment.
-   - LDP_POLICY_NEVER: Do not emit ldp.  */
 
-  enum aarch64_ldp_policy_model
-  {
-    LDP_POLICY_ALIGNED,
-    LDP_POLICY_ALWAYS,
-    LDP_POLICY_NEVER
-  } ldp_policy_model;
-/* An enum specifying how to handle store pairs using a fine-grained policy:
-   - STP_POLICY_ALIGNED: Emit stp if the source pointer is aligned
-   to at least double the alignment of the type.
-   - STP_POLICY_ALWAYS: Emit stp regardless of alignment.
-   - STP_POLICY_NEVER: Do not emit stp.  */
-
-  enum aarch64_stp_policy_model
-  {
-    STP_POLICY_ALIGNED,
-    STP_POLICY_ALWAYS,
-    STP_POLICY_NEVER
-  } stp_policy_model;
+  /* Define models for the aarch64_ldp_stp_policy.  */
+  enum aarch64_ldp_stp_policy ldp_policy_model, stp_policy_model;
 };
 
 /* Classifies an address.
diff --git a/gcc/config/aarch64/aarch64.cc b/gcc/config/aarch64/aarch64.cc
index aa920fc703a..dcded70c981 100644
--- a/gcc/config/aarch64/aarch64.cc
+++ b/gcc/config/aarch64/aarch64.cc
@@ -1358,8 +1358,8 @@ static const struct tune_params generic_tunings =
      have at most a very minor effect on SVE2 cores.  */
   (AARCH64_EXTRA_TUNE_CSE_SVE_VL_CONSTANTS),	/* tune_flags.  */
   &generic_prefetch_tune,
-  tune_params::LDP_POLICY_ALWAYS,	/* ldp_policy_model.  */
-  tune_params::STP_POLICY_ALWAYS	/* stp_policy_model.  */
+  AARCH64_LDP_STP_POLICY_ALWAYS,   /* ldp_policy_model.  */
+  AARCH64_LDP_STP_POLICY_ALWAYS    /* stp_policy_model.  */
 };
 
 static const struct tune_params cortexa35_tunings =
@@ -1394,8 +1394,8 @@ static const struct tune_params cortexa35_tunings =
   tune_params::AUTOPREFETCHER_WEAK,	/* autoprefetcher_model.  */
   (AARCH64_EXTRA_TUNE_NONE),	/* tune_flags.  */
   &generic_prefetch_tune,
-  tune_params::LDP_POLICY_ALWAYS,	/* ldp_policy_model.  */
-  tune_params::STP_POLICY_ALWAYS	/* stp_policy_model.  */
+  AARCH64_LDP_STP_POLICY_ALWAYS,   /* ldp_policy_model.  */
+  AARCH64_LDP_STP_POLICY_ALWAYS    /* stp_policy_model.  */
 };
 
 static const struct tune_params cortexa53_tunings =
@@ -1430,8 +1430,8 @@ static const struct tune_params cortexa53_tunings =
   tune_params::AUTOPREFETCHER_WEAK,	/* autoprefetcher_model.  */
   (AARCH64_EXTRA_TUNE_NONE),	/* tune_flags.  */
   &generic_prefetch_tune,
-  tune_params::LDP_POLICY_ALWAYS,	/* ldp_policy_model.  */
-  tune_params::STP_POLICY_ALWAYS	/* stp_policy_model.  */
+  AARCH64_LDP_STP_POLICY_ALWAYS,   /* ldp_policy_model.  */
+  AARCH64_LDP_STP_POLICY_ALWAYS    /* stp_policy_model.  */
 };
 
 static const struct tune_params cortexa57_tunings =
@@ -1466,8 +1466,8 @@ static const struct tune_params cortexa57_tunings =
   tune_params::AUTOPREFETCHER_WEAK,	/* autoprefetcher_model.  */
   (AARCH64_EXTRA_TUNE_RENAME_FMA_REGS),	/* tune_flags.  */
   &generic_prefetch_tune,
-  tune_params::LDP_POLICY_ALWAYS,	/* ldp_policy_model.  */
-  tune_params::STP_POLICY_ALWAYS	/* stp_policy_model.  */
+  AARCH64_LDP_STP_POLICY_ALWAYS,   /* ldp_policy_model.  */
+  AARCH64_LDP_STP_POLICY_ALWAYS    /* stp_policy_model.  */
 };
 
 static const struct tune_params cortexa72_tunings =
@@ -1502,8 +1502,8 @@ static const struct tune_params cortexa72_tunings =
   tune_params::AUTOPREFETCHER_WEAK,	/* autoprefetcher_model.  */
   (AARCH64_EXTRA_TUNE_NONE),	/* tune_flags.  */
   &generic_prefetch_tune,
-  tune_params::LDP_POLICY_ALWAYS,	/* ldp_policy_model.  */
-  tune_params::STP_POLICY_ALWAYS	/* stp_policy_model.  */
+  AARCH64_LDP_STP_POLICY_ALWAYS,   /* ldp_policy_model.  */
+  AARCH64_LDP_STP_POLICY_ALWAYS    /* stp_policy_model.  */
 };
 
 static const struct tune_params cortexa73_tunings =
@@ -1538,12 +1538,10 @@ static const struct tune_params cortexa73_tunings =
   tune_params::AUTOPREFETCHER_WEAK,	/* autoprefetcher_model.  */
   (AARCH64_EXTRA_TUNE_NONE),	/* tune_flags.  */
   &generic_prefetch_tune,
-  tune_params::LDP_POLICY_ALWAYS,	/* ldp_policy_model.  */
-  tune_params::STP_POLICY_ALWAYS	/* stp_policy_model.  */
+  AARCH64_LDP_STP_POLICY_ALWAYS,   /* ldp_policy_model.  */
+  AARCH64_LDP_STP_POLICY_ALWAYS    /* stp_policy_model.  */
 };
 
-
-
 static const struct tune_params exynosm1_tunings =
 {
   &exynosm1_extra_costs,
@@ -1575,8 +1573,8 @@ static const struct tune_params exynosm1_tunings =
   tune_params::AUTOPREFETCHER_WEAK, /* autoprefetcher_model.  */
   (AARCH64_EXTRA_TUNE_NONE), /* tune_flags.  */
   &exynosm1_prefetch_tune,
-  tune_params::LDP_POLICY_ALWAYS,	/* ldp_policy_model.  */
-  tune_params::STP_POLICY_ALWAYS	/* stp_policy_model.  */
+  AARCH64_LDP_STP_POLICY_ALWAYS,   /* ldp_policy_model.  */
+  AARCH64_LDP_STP_POLICY_ALWAYS    /* stp_policy_model.  */
 };
 
 static const struct tune_params thunderxt88_tunings =
@@ -1610,8 +1608,8 @@ static const struct tune_params thunderxt88_tunings =
   tune_params::AUTOPREFETCHER_OFF,	/* autoprefetcher_model.  */
   (AARCH64_EXTRA_TUNE_NONE),	/* tune_flags.  */
   &thunderxt88_prefetch_tune,
-  tune_params::LDP_POLICY_ALIGNED,	/* ldp_policy_model.  */
-  tune_params::STP_POLICY_ALIGNED	/* stp_policy_model.  */
+  AARCH64_LDP_STP_POLICY_ALIGNED,   /* ldp_policy_model.  */
+  AARCH64_LDP_STP_POLICY_ALIGNED    /* stp_policy_model.  */
 };
 
 static const struct tune_params thunderx_tunings =
@@ -1645,8 +1643,8 @@ static const struct tune_params thunderx_tunings =
   tune_params::AUTOPREFETCHER_OFF,	/* autoprefetcher_model.  */
   (AARCH64_EXTRA_TUNE_CHEAP_SHIFT_EXTEND),	/* tune_flags.  */
   &thunderx_prefetch_tune,
-  tune_params::LDP_POLICY_ALIGNED,	/* ldp_policy_model.  */
-  tune_params::STP_POLICY_ALIGNED	/* stp_policy_model.  */
+  AARCH64_LDP_STP_POLICY_ALIGNED,   /* ldp_policy_model.  */
+  AARCH64_LDP_STP_POLICY_ALIGNED    /* stp_policy_model.  */
 };
 
 static const struct tune_params tsv110_tunings =
@@ -1681,8 +1679,8 @@ static const struct tune_params tsv110_tunings =
   tune_params::AUTOPREFETCHER_WEAK,     /* autoprefetcher_model.  */
   (AARCH64_EXTRA_TUNE_NONE),     /* tune_flags.  */
   &tsv110_prefetch_tune,
-  tune_params::LDP_POLICY_ALWAYS,	/* ldp_policy_model.  */
-  tune_params::STP_POLICY_ALWAYS	/* stp_policy_model.  */
+  AARCH64_LDP_STP_POLICY_ALWAYS,   /* ldp_policy_model.  */
+  AARCH64_LDP_STP_POLICY_ALWAYS    /* stp_policy_model.  */
 };
 
 static const struct tune_params xgene1_tunings =
@@ -1716,8 +1714,8 @@ static const struct tune_params xgene1_tunings =
   tune_params::AUTOPREFETCHER_OFF,	/* autoprefetcher_model.  */
   (AARCH64_EXTRA_TUNE_NO_LDP_STP_QREGS),	/* tune_flags.  */
   &xgene1_prefetch_tune,
-  tune_params::LDP_POLICY_ALWAYS,	/* ldp_policy_model.  */
-  tune_params::STP_POLICY_ALWAYS	/* stp_policy_model.  */
+  AARCH64_LDP_STP_POLICY_ALWAYS,   /* ldp_policy_model.  */
+  AARCH64_LDP_STP_POLICY_ALWAYS    /* stp_policy_model.  */
 };
 
 static const struct tune_params emag_tunings =
@@ -1751,8 +1749,8 @@ static const struct tune_params emag_tunings =
   tune_params::AUTOPREFETCHER_OFF,	/* autoprefetcher_model.  */
   (AARCH64_EXTRA_TUNE_NO_LDP_STP_QREGS),	/* tune_flags.  */
   &xgene1_prefetch_tune,
-  tune_params::LDP_POLICY_ALWAYS,	/* ldp_policy_model.  */
-  tune_params::STP_POLICY_ALWAYS	/* stp_policy_model.  */
+  AARCH64_LDP_STP_POLICY_ALWAYS,   /* ldp_policy_model.  */
+  AARCH64_LDP_STP_POLICY_ALWAYS    /* stp_policy_model.  */
 };
 
 static const struct tune_params qdf24xx_tunings =
@@ -1787,8 +1785,8 @@ static const struct tune_params qdf24xx_tunings =
   tune_params::AUTOPREFETCHER_WEAK,	/* autoprefetcher_model.  */
   AARCH64_EXTRA_TUNE_RENAME_LOAD_REGS, /* tune_flags.  */
   &qdf24xx_prefetch_tune,
-  tune_params::LDP_POLICY_ALWAYS,	/* ldp_policy_model.  */
-  tune_params::STP_POLICY_ALWAYS	/* stp_policy_model.  */
+  AARCH64_LDP_STP_POLICY_ALWAYS,   /* ldp_policy_model.  */
+  AARCH64_LDP_STP_POLICY_ALWAYS    /* stp_policy_model.  */
 };
 
 /* Tuning structure for the Qualcomm Saphira core.  Default to falkor values
@@ -1825,8 +1823,8 @@ static const struct tune_params saphira_tunings =
   tune_params::AUTOPREFETCHER_WEAK,	/* autoprefetcher_model.  */
   (AARCH64_EXTRA_TUNE_NONE),		/* tune_flags.  */
   &generic_prefetch_tune,
-  tune_params::LDP_POLICY_ALWAYS,	/* ldp_policy_model.  */
-  tune_params::STP_POLICY_ALWAYS	/* stp_policy_model.  */
+  AARCH64_LDP_STP_POLICY_ALWAYS,   /* ldp_policy_model.  */
+  AARCH64_LDP_STP_POLICY_ALWAYS    /* stp_policy_model.  */
 };
 
 static const struct tune_params thunderx2t99_tunings =
@@ -1861,8 +1859,8 @@ static const struct tune_params thunderx2t99_tunings =
   tune_params::AUTOPREFETCHER_WEAK,	/* autoprefetcher_model.  */
   (AARCH64_EXTRA_TUNE_NONE),	/* tune_flags.  */
   &thunderx2t99_prefetch_tune,
-  tune_params::LDP_POLICY_ALWAYS,	/* ldp_policy_model.  */
-  tune_params::STP_POLICY_ALWAYS	/* stp_policy_model.  */
+  AARCH64_LDP_STP_POLICY_ALWAYS,   /* ldp_policy_model.  */
+  AARCH64_LDP_STP_POLICY_ALWAYS    /* stp_policy_model.  */
 };
 
 static const struct tune_params thunderx3t110_tunings =
@@ -1897,8 +1895,8 @@ static const struct tune_params thunderx3t110_tunings =
   tune_params::AUTOPREFETCHER_WEAK,	/* autoprefetcher_model.  */
   (AARCH64_EXTRA_TUNE_NONE),	/* tune_flags.  */
   &thunderx3t110_prefetch_tune,
-  tune_params::LDP_POLICY_ALWAYS,	/* ldp_policy_model.  */
-  tune_params::STP_POLICY_ALWAYS	/* stp_policy_model.  */
+  AARCH64_LDP_STP_POLICY_ALWAYS,   /* ldp_policy_model.  */
+  AARCH64_LDP_STP_POLICY_ALWAYS    /* stp_policy_model.  */
 };
 
 static const struct tune_params neoversen1_tunings =
@@ -1932,8 +1930,8 @@ static const struct tune_params neoversen1_tunings =
   tune_params::AUTOPREFETCHER_WEAK,	/* autoprefetcher_model.  */
   (AARCH64_EXTRA_TUNE_CHEAP_SHIFT_EXTEND),	/* tune_flags.  */
   &generic_prefetch_tune,
-  tune_params::LDP_POLICY_ALWAYS,	/* ldp_policy_model.  */
-  tune_params::STP_POLICY_ALWAYS	/* stp_policy_model.  */
+  AARCH64_LDP_STP_POLICY_ALWAYS,   /* ldp_policy_model.  */
+  AARCH64_LDP_STP_POLICY_ALWAYS    /* stp_policy_model.  */
 };
 
 static const struct tune_params ampere1_tunings =
@@ -1971,8 +1969,8 @@ static const struct tune_params ampere1_tunings =
   tune_params::AUTOPREFETCHER_WEAK,	/* autoprefetcher_model.  */
   (AARCH64_EXTRA_TUNE_NONE),	/* tune_flags.  */
   &ampere1_prefetch_tune,
-  tune_params::LDP_POLICY_ALIGNED,	/* ldp_policy_model.  */
-  tune_params::STP_POLICY_ALIGNED	/* stp_policy_model.  */
+  AARCH64_LDP_STP_POLICY_ALIGNED,   /* ldp_policy_model.  */
+  AARCH64_LDP_STP_POLICY_ALIGNED    /* stp_policy_model.  */
 };
 
 static const struct tune_params ampere1a_tunings =
@@ -2011,8 +2009,8 @@ static const struct tune_params ampere1a_tunings =
   tune_params::AUTOPREFETCHER_WEAK,	/* autoprefetcher_model.  */
   (AARCH64_EXTRA_TUNE_NONE),	/* tune_flags.  */
   &ampere1_prefetch_tune,
-  tune_params::LDP_POLICY_ALIGNED,	/* ldp_policy_model.  */
-  tune_params::STP_POLICY_ALIGNED	/* stp_policy_model.  */
+  AARCH64_LDP_STP_POLICY_ALIGNED,   /* ldp_policy_model.  */
+  AARCH64_LDP_STP_POLICY_ALIGNED    /* stp_policy_model.  */
 };
 
 static const advsimd_vec_cost neoversev1_advsimd_vector_cost =
@@ -2194,8 +2192,8 @@ static const struct tune_params neoversev1_tunings =
    | AARCH64_EXTRA_TUNE_MATCHED_VECTOR_THROUGHPUT
    | AARCH64_EXTRA_TUNE_CHEAP_SHIFT_EXTEND),	/* tune_flags.  */
   &generic_prefetch_tune,
-  tune_params::LDP_POLICY_ALWAYS,	/* ldp_policy_model.  */
-  tune_params::STP_POLICY_ALWAYS	/* stp_policy_model.  */
+  AARCH64_LDP_STP_POLICY_ALWAYS,   /* ldp_policy_model.  */
+  AARCH64_LDP_STP_POLICY_ALWAYS    /* stp_policy_model.  */
 };
 
 static const sve_vec_cost neoverse512tvb_sve_vector_cost =
@@ -2333,8 +2331,8 @@ static const struct tune_params neoverse512tvb_tunings =
    | AARCH64_EXTRA_TUNE_USE_NEW_VECTOR_COSTS
    | AARCH64_EXTRA_TUNE_MATCHED_VECTOR_THROUGHPUT),	/* tune_flags.  */
   &generic_prefetch_tune,
-  tune_params::LDP_POLICY_ALWAYS,	/* ldp_policy_model.  */
-  tune_params::STP_POLICY_ALWAYS	/* stp_policy_model.  */
+  AARCH64_LDP_STP_POLICY_ALWAYS,   /* ldp_policy_model.  */
+  AARCH64_LDP_STP_POLICY_ALWAYS	   /* stp_policy_model.  */
 };
 
 static const advsimd_vec_cost neoversen2_advsimd_vector_cost =
@@ -2525,8 +2523,8 @@ static const struct tune_params neoversen2_tunings =
    | AARCH64_EXTRA_TUNE_USE_NEW_VECTOR_COSTS
    | AARCH64_EXTRA_TUNE_MATCHED_VECTOR_THROUGHPUT),	/* tune_flags.  */
   &generic_prefetch_tune,
-  tune_params::LDP_POLICY_ALWAYS,	/* ldp_policy_model.  */
-  tune_params::STP_POLICY_ALWAYS	/* stp_policy_model.  */
+  AARCH64_LDP_STP_POLICY_ALWAYS,   /* ldp_policy_model.  */
+  AARCH64_LDP_STP_POLICY_ALWAYS	   /* stp_policy_model.  */
 };
 
 static const advsimd_vec_cost neoversev2_advsimd_vector_cost =
@@ -2717,8 +2715,8 @@ static const struct tune_params neoversev2_tunings =
    | AARCH64_EXTRA_TUNE_USE_NEW_VECTOR_COSTS
    | AARCH64_EXTRA_TUNE_MATCHED_VECTOR_THROUGHPUT),	/* tune_flags.  */
   &generic_prefetch_tune,
-  tune_params::LDP_POLICY_ALWAYS,	/* ldp_policy_model.  */
-  tune_params::STP_POLICY_ALWAYS	/* stp_policy_model.  */
+  AARCH64_LDP_STP_POLICY_ALWAYS,   /* ldp_policy_model.  */
+  AARCH64_LDP_STP_POLICY_ALWAYS	   /* stp_policy_model.  */
 };
 
 static const struct tune_params a64fx_tunings =
@@ -2752,8 +2750,8 @@ static const struct tune_params a64fx_tunings =
   tune_params::AUTOPREFETCHER_WEAK,	/* autoprefetcher_model.  */
   (AARCH64_EXTRA_TUNE_NONE),	/* tune_flags.  */
   &a64fx_prefetch_tune,
-  tune_params::LDP_POLICY_ALWAYS,	/* ldp_policy_model.  */
-  tune_params::STP_POLICY_ALWAYS	/* stp_policy_model.  */
+  AARCH64_LDP_STP_POLICY_ALWAYS,   /* ldp_policy_model.  */
+  AARCH64_LDP_STP_POLICY_ALWAYS    /* stp_policy_model.  */
 };
 
 /* Support for fine-grained override of the tuning structures.  */
@@ -17866,36 +17864,6 @@ aarch64_parse_tune (const char *to_parse, const struct processor **res)
   return AARCH_PARSE_INVALID_ARG;
 }
 
-/* Parse a command-line -param=aarch64-ldp-policy= parameter.  VALUE is
-   the value of the parameter.  */
-
-static void
-aarch64_parse_ldp_policy (enum aarch64_ldp_policy value,
-			  struct tune_params* tune)
-{
-  if (value == LDP_POLICY_ALWAYS)
-    tune->ldp_policy_model = tune_params::LDP_POLICY_ALWAYS;
-  else if (value == LDP_POLICY_NEVER)
-    tune->ldp_policy_model = tune_params::LDP_POLICY_NEVER;
-  else if (value == LDP_POLICY_ALIGNED)
-    tune->ldp_policy_model = tune_params::LDP_POLICY_ALIGNED;
-}
-
-/* Parse a command-line -param=aarch64-stp-policy= parameter.  VALUE is
-   the value of the parameter.  */
-
-static void
-aarch64_parse_stp_policy (enum aarch64_stp_policy value,
-			  struct tune_params* tune)
-{
-  if (value == STP_POLICY_ALWAYS)
-    tune->stp_policy_model = tune_params::STP_POLICY_ALWAYS;
-  else if (value == STP_POLICY_NEVER)
-    tune->stp_policy_model = tune_params::STP_POLICY_NEVER;
-  else if (value == STP_POLICY_ALIGNED)
-    tune->stp_policy_model = tune_params::STP_POLICY_ALIGNED;
-}
-
 /* Parse TOKEN, which has length LENGTH to see if it is an option
    described in FLAG.  If it is, return the index bit for that fusion type.
    If not, error (printing OPTION_NAME) and return zero.  */
@@ -18245,12 +18213,10 @@ aarch64_override_options_internal (struct gcc_options *opts)
 				   &aarch64_tune_params);
 
   if (opts->x_aarch64_ldp_policy_param)
-    aarch64_parse_ldp_policy (opts->x_aarch64_ldp_policy_param,
-			      &aarch64_tune_params);
+    aarch64_tune_params.ldp_policy_model = opts->x_aarch64_ldp_policy_param;
 
   if (opts->x_aarch64_stp_policy_param)
-    aarch64_parse_stp_policy (opts->x_aarch64_stp_policy_param,
-			      &aarch64_tune_params);
+    aarch64_tune_params.stp_policy_model = opts->x_aarch64_stp_policy_param;
 
   /* This target defaults to strict volatile bitfields.  */
   if (opts->x_flag_strict_volatile_bitfields < 0 && abi_version_at_least (2))
@@ -26551,30 +26517,18 @@ aarch64_mergeable_load_pair_p (machine_mode mode, rtx mem1, rtx mem2)
 bool
 aarch64_mem_ok_with_ldpstp_policy_model (rtx mem, bool load, machine_mode mode)
 {
-  /* If we have LDP_POLICY_NEVER, reject the load pair.  */
-  if (load
-      && aarch64_tune_params.ldp_policy_model == tune_params::LDP_POLICY_NEVER)
-    return false;
+  auto policy = (load
+		 ? aarch64_tune_params.ldp_policy_model
+		 : aarch64_tune_params.stp_policy_model);
 
-  /* If we have STP_POLICY_NEVER, reject the store pair.  */
-  if (!load
-      && aarch64_tune_params.stp_policy_model == tune_params::STP_POLICY_NEVER)
+  /* If we have AARCH64_LDP_STP_POLICY_NEVER, reject the load pair.  */
+  if (policy == AARCH64_LDP_STP_POLICY_NEVER)
     return false;
 
-  /* If we have LDP_POLICY_ALIGNED,
+  /* If we have AARCH64_LDP_STP_POLICY_ALIGNED,
      do not emit the load pair unless the alignment is checked to be
      at least double the alignment of the type.  */
-  if (load
-      && aarch64_tune_params.ldp_policy_model == tune_params::LDP_POLICY_ALIGNED
-      && !optimize_function_for_size_p (cfun)
-      && MEM_ALIGN (mem) < 2 * GET_MODE_ALIGNMENT (mode))
-    return false;
-
-  /* If we have STP_POLICY_ALIGNED,
-     do not emit the store pair unless the alignment is checked to be
-     at least double the alignment of the type.  */
-  if (!load
-      && aarch64_tune_params.stp_policy_model == tune_params::STP_POLICY_ALIGNED
+  if (policy == AARCH64_LDP_STP_POLICY_ALIGNED
       && !optimize_function_for_size_p (cfun)
       && MEM_ALIGN (mem) < 2 * GET_MODE_ALIGNMENT (mode))
     return false;
diff --git a/gcc/config/aarch64/aarch64.opt b/gcc/config/aarch64/aarch64.opt
index 2101c5a23c4..f5a518202a1 100644
--- a/gcc/config/aarch64/aarch64.opt
+++ b/gcc/config/aarch64/aarch64.opt
@@ -339,39 +339,24 @@ Target Joined UInteger Var(aarch64_vect_unroll_limit) Init(4) Param
 Limit how much the autovectorizer may unroll a loop.
 
 -param=aarch64-ldp-policy=
-Target Joined Var(aarch64_ldp_policy_param) Enum(aarch64_ldp_policy) Init(LDP_POLICY_DEFAULT) Param
+Target Joined Var(aarch64_ldp_policy_param) Enum(aarch64_ldp_stp_policy) Init(AARCH64_LDP_STP_POLICY_DEFAULT) Param
 --param=aarch64-ldp-policy=[default|always|never|aligned] Fine-grained policy for load pairs.
 
-Enum
-Name(aarch64_ldp_policy) Type(enum aarch64_ldp_policy) UnknownError(unknown aarch64_ldp_policy mode %qs)
-
-EnumValue
-Enum(aarch64_ldp_policy) String(default) Value(LDP_POLICY_DEFAULT)
-
-EnumValue
-Enum(aarch64_ldp_policy) String(always) Value(LDP_POLICY_ALWAYS)
-
-EnumValue
-Enum(aarch64_ldp_policy) String(never) Value(LDP_POLICY_NEVER)
-
-EnumValue
-Enum(aarch64_ldp_policy) String(aligned) Value(LDP_POLICY_ALIGNED)
-
 -param=aarch64-stp-policy=
-Target Joined Var(aarch64_stp_policy_param) Enum(aarch64_stp_policy) Init(STP_POLICY_DEFAULT) Param
+Target Joined Var(aarch64_stp_policy_param) Enum(aarch64_ldp_stp_policy) Init(AARCH64_LDP_STP_POLICY_DEFAULT) Param
 --param=aarch64-stp-policy=[default|always|never|aligned] Fine-grained policy for store pairs.
 
 Enum
-Name(aarch64_stp_policy) Type(enum aarch64_stp_policy) UnknownError(unknown aarch64_stp_policy mode %qs)
+Name(aarch64_ldp_stp_policy) Type(enum aarch64_ldp_stp_policy) UnknownError(unknown LDP/STP policy %qs)
 
 EnumValue
-Enum(aarch64_stp_policy) String(default) Value(STP_POLICY_DEFAULT)
+Enum(aarch64_ldp_stp_policy) String(default) Value(AARCH64_LDP_STP_POLICY_DEFAULT)
 
 EnumValue
-Enum(aarch64_stp_policy) String(always) Value(STP_POLICY_ALWAYS)
+Enum(aarch64_ldp_stp_policy) String(always) Value(AARCH64_LDP_STP_POLICY_ALWAYS)
 
 EnumValue
-Enum(aarch64_stp_policy) String(never) Value(STP_POLICY_NEVER)
+Enum(aarch64_ldp_stp_policy) String(never) Value(AARCH64_LDP_STP_POLICY_NEVER)
 
 EnumValue
-Enum(aarch64_stp_policy) String(aligned) Value(STP_POLICY_ALIGNED)
+Enum(aarch64_ldp_stp_policy) String(aligned) Value(AARCH64_LDP_STP_POLICY_ALIGNED)
diff --git a/gcc/testsuite/gcc.target/aarch64/ldp_aligned.c b/gcc/testsuite/gcc.target/aarch64/ldp_aligned.c
index f44f9616366..75495d71df2 100644
--- a/gcc/testsuite/gcc.target/aarch64/ldp_aligned.c
+++ b/gcc/testsuite/gcc.target/aarch64/ldp_aligned.c
@@ -14,16 +14,6 @@ TYPE ldp_aligned_##TYPE(char* ptr){ \
     return a_0 + a_1; \
 }
 
-#define LDP_TEST_UNALIGNED(TYPE) \
-TYPE ldp_unaligned_##TYPE(char* ptr){ \
-    TYPE a_0, a_1; \
-    TYPE *arr = (TYPE*) ((uintptr_t)ptr & ~(2 * 8 * _Alignof(TYPE) - 1)); \
-    TYPE *a = arr+1; \
-    a_0 = a[0]; \
-    a_1 = a[1]; \
-    return a_0 + a_1; \
-}
-
 #define LDP_TEST_ADJUST_ALIGNED(TYPE) \
 TYPE ldp_aligned_adjust_##TYPE(char* ptr){ \
     TYPE a_0, a_1, a_2, a_3, a_4; \
@@ -36,29 +26,11 @@ TYPE ldp_aligned_adjust_##TYPE(char* ptr){ \
     return a_0 + a_1 + a_2 + a_3 + a_4; \
 }
 
-#define LDP_TEST_ADJUST_UNALIGNED(TYPE) \
-TYPE ldp_unaligned_adjust_##TYPE(char* ptr){ \
-    TYPE a_0, a_1, a_2, a_3, a_4; \
-    TYPE *arr = (TYPE*) ((uintptr_t)ptr & ~(2 * 8 * _Alignof(TYPE) - 1)); \
-    TYPE *a = arr+1; \
-    a_0 = a[100]; \
-    a_1 = a[101]; \
-    a_2 = a[102]; \
-    a_3 = a[103]; \
-    a_4 = a[110]; \
-    return a_0 + a_1 + a_2 + a_3 + a_4; \
-}
-
 LDP_TEST_ALIGNED(int32_t);
 LDP_TEST_ALIGNED(int64_t);
 LDP_TEST_ALIGNED(v4si);
-LDP_TEST_UNALIGNED(int32_t);
-LDP_TEST_UNALIGNED(int64_t);
-LDP_TEST_UNALIGNED(v4si);
 LDP_TEST_ADJUST_ALIGNED(int32_t);
 LDP_TEST_ADJUST_ALIGNED(int64_t);
-LDP_TEST_ADJUST_UNALIGNED(int32_t);
-LDP_TEST_ADJUST_UNALIGNED(int64_t);
 
 /* { dg-final { scan-assembler-times "ldp\tw\[0-9\]+, w\[0-9\]" 3 } } */
 /* { dg-final { scan-assembler-times "ldp\tx\[0-9\]+, x\[0-9\]" 3 } } */
diff --git a/gcc/testsuite/gcc.target/aarch64/ldp_unaligned.c b/gcc/testsuite/gcc.target/aarch64/ldp_unaligned.c
new file mode 100644
index 00000000000..d9dcfe432f0
--- /dev/null
+++ b/gcc/testsuite/gcc.target/aarch64/ldp_unaligned.c
@@ -0,0 +1,40 @@
+/* { dg-options "-O2 --param=aarch64-ldp-policy=aligned -mcpu=generic" } */
+
+#include <stdlib.h>
+#include <stdint.h>
+
+typedef int v4si __attribute__ ((vector_size (16)));
+
+#define LDP_TEST_UNALIGNED(TYPE) \
+TYPE ldp_unaligned_##TYPE(char* ptr){ \
+    TYPE a_0, a_1; \
+    TYPE *arr = (TYPE*) ((uintptr_t)ptr & ~(2 * 8 * _Alignof(TYPE) - 1)); \
+    TYPE *a = arr+1; \
+    a_0 = a[0]; \
+    a_1 = a[1]; \
+    return a_0 + a_1; \
+}
+
+#define LDP_TEST_ADJUST_UNALIGNED(TYPE) \
+TYPE ldp_unaligned_adjust_##TYPE(char* ptr){ \
+    TYPE a_0, a_1, a_2, a_3, a_4; \
+    TYPE *arr = (TYPE*) ((uintptr_t)ptr & ~(2 * 8 * _Alignof(TYPE) - 1)); \
+    TYPE *a = arr+1; \
+    a_0 = a[100]; \
+    a_1 = a[101]; \
+    a_2 = a[102]; \
+    a_3 = a[103]; \
+    a_4 = a[110]; \
+    return a_0 + a_1 + a_2 + a_3 + a_4; \
+}
+
+LDP_TEST_UNALIGNED(int32_t);
+LDP_TEST_UNALIGNED(int64_t);
+LDP_TEST_UNALIGNED(v4si);
+LDP_TEST_ADJUST_UNALIGNED(int32_t);
+LDP_TEST_ADJUST_UNALIGNED(int64_t);
+
+/* { dg-final { scan-assembler-times "ldp\tw\[0-9\]+, w\[0-9\]" 0 } } */
+/* { dg-final { scan-assembler-times "ldp\tx\[0-9\]+, x\[0-9\]" 0 } } */
+/* { dg-final { scan-assembler-times "ldp\tq\[0-9\]+, q\[0-9\]" 0 } } */
+
diff --git a/gcc/testsuite/gcc.target/aarch64/stp_aligned.c b/gcc/testsuite/gcc.target/aarch64/stp_aligned.c
index ab9c2f42dd3..20bd95373fa 100644
--- a/gcc/testsuite/gcc.target/aarch64/stp_aligned.c
+++ b/gcc/testsuite/gcc.target/aarch64/stp_aligned.c
@@ -13,15 +13,6 @@ TYPE *stp_aligned_##TYPE(char* ptr, TYPE x){ \
     return arr; \
 }
 
-#define STP_TEST_UNALIGNED(TYPE) \
-TYPE *stp_unaligned_##TYPE(char* ptr, TYPE x){ \
-    TYPE *arr = (TYPE*) ((uintptr_t)ptr & ~(2 * 8 * _Alignof(TYPE) - 1)); \
-    TYPE *a = arr+1; \
-    a[0] = x; \
-    a[1] = x; \
-    return a; \
-}
-
 #define STP_TEST_ADJUST_ALIGNED(TYPE) \
 TYPE *stp_aligned_adjust_##TYPE(char* ptr, TYPE x){ \
     TYPE *arr = (TYPE*) ((uintptr_t)ptr & ~(2 * 8 * _Alignof(TYPE) - 1)); \
@@ -32,27 +23,11 @@ TYPE *stp_aligned_adjust_##TYPE(char* ptr, TYPE x){ \
     return arr; \
 }
 
-#define STP_TEST_ADJUST_UNALIGNED(TYPE) \
-TYPE *stp_unaligned_adjust_##TYPE(char* ptr, TYPE x){ \
-    TYPE *arr = (TYPE*) ((uintptr_t)ptr & ~(2 * 8 * _Alignof(TYPE) - 1)); \
-    TYPE *a = arr+1; \
-    a[100] = x; \
-    a[101] = x; \
-    a[102] = x; \
-    a[103] = x; \
-    return a; \
-}
-
 STP_TEST_ALIGNED(int32_t);
 STP_TEST_ALIGNED(int64_t);
 STP_TEST_ALIGNED(v4si);
-STP_TEST_UNALIGNED(int32_t);
-STP_TEST_UNALIGNED(int64_t);
-STP_TEST_UNALIGNED(v4si);
 STP_TEST_ADJUST_ALIGNED(int32_t);
 STP_TEST_ADJUST_ALIGNED(int64_t);
-STP_TEST_ADJUST_UNALIGNED(int32_t);
-STP_TEST_ADJUST_UNALIGNED(int64_t);
 
 /* { dg-final { scan-assembler-times "stp\tw\[0-9\]+, w\[0-9\]" 3 } } */
 /* { dg-final { scan-assembler-times "stp\tx\[0-9\]+, x\[0-9\]" 3 } } */
diff --git a/gcc/testsuite/gcc.target/aarch64/stp_unaligned.c b/gcc/testsuite/gcc.target/aarch64/stp_unaligned.c
new file mode 100644
index 00000000000..9a5690af362
--- /dev/null
+++ b/gcc/testsuite/gcc.target/aarch64/stp_unaligned.c
@@ -0,0 +1,37 @@
+/* { dg-options "-O2 --param=aarch64-stp-policy=aligned -mcpu=generic" } */
+
+#include <stdlib.h>
+#include <stdint.h>
+
+typedef int v4si __attribute__ ((vector_size (16)));
+
+#define STP_TEST_UNALIGNED(TYPE) \
+TYPE *stp_unaligned_##TYPE(char* ptr, TYPE x){ \
+    TYPE *arr = (TYPE*) ((uintptr_t)ptr & ~(2 * 8 * _Alignof(TYPE) - 1)); \
+    TYPE *a = arr+1; \
+    a[0] = x; \
+    a[1] = x; \
+    return a; \
+}
+
+#define STP_TEST_ADJUST_UNALIGNED(TYPE) \
+TYPE *stp_unaligned_adjust_##TYPE(char* ptr, TYPE x){ \
+    TYPE *arr = (TYPE*) ((uintptr_t)ptr & ~(2 * 8 * _Alignof(TYPE) - 1)); \
+    TYPE *a = arr+1; \
+    a[100] = x; \
+    a[101] = x; \
+    a[102] = x; \
+    a[103] = x; \
+    return a; \
+}
+
+STP_TEST_UNALIGNED(int32_t);
+STP_TEST_UNALIGNED(int64_t);
+STP_TEST_UNALIGNED(v4si);
+STP_TEST_ADJUST_UNALIGNED(int32_t);
+STP_TEST_ADJUST_UNALIGNED(int64_t);
+
+/* { dg-final { scan-assembler-times "stp\tw\[0-9\]+, w\[0-9\]" 0 } } */
+/* { dg-final { scan-assembler-times "stp\tx\[0-9\]+, x\[0-9\]" 0 } } */
+/* { dg-final { scan-assembler-times "stp\tq\[0-9\]+, q\[0-9\]" 0 } } */
+
-- 
2.40.1


^ permalink raw reply	[flat|nested] 3+ messages in thread

end of thread, other threads:[~2023-09-29 10:47 UTC | newest]

Thread overview: 3+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2023-09-29 10:27 [PATCH v2] aarch64: Improve on ldp-stp policies code structure Manos Anagnostakis
2023-09-29 10:34 ` Richard Sandiford
2023-09-29 10:47   ` Philipp Tomsich

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).