[v2] aarch64: Improve on ldp-stp policies code structure.
Checks
Commit Message
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
Comments
Manos Anagnostakis <manos.anagnostakis@vrull.eu> writes:
> 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.
Nice! OK for trunk, thanks.
Sorry again for my mix-up with the original review.
Richard
> 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. */
> &ere1_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. */
> &ere1_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 } } */
> +
Applied to master. Thanks!
--Philipp.
On Fri, 29 Sept 2023 at 12:34, Richard Sandiford
<richard.sandiford@arm.com> wrote:
>
> Manos Anagnostakis <manos.anagnostakis@vrull.eu> writes:
> > 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.
>
> Nice! OK for trunk, thanks.
>
> Sorry again for my mix-up with the original review.
>
> Richard
>
> > 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. */
> > &ere1_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. */
> > &ere1_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 } } */
> > +
@@ -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
@@ -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.
@@ -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. */
&ere1_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. */
&ere1_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;
@@ -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)
@@ -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 } } */
new file mode 100644
@@ -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 } } */
+
@@ -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 } } */
new file mode 100644
@@ -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 } } */
+