> -----Original Message-----
> From: Alfie Richards <[email protected]>
> Sent: 17 September 2026 15:40
> To: [email protected]
> Cc: Alex Coplan <[email protected]>; Alice Carlotti
> <[email protected]>; Andrea Pinski
> <[email protected]>; Richard Biener <[email protected]>;
> Tamar Christina <[email protected]>; Zdenek Dvorak <[email protected]>;
> Robin Dapp <[email protected]>; Richard Sandiford
> <[email protected]>; Kyrylo Tkachov <[email protected]>;
> Alfie Richards <[email protected]>
> Subject: [PATCH v3 11/16] aarch64: Add read_ffr_cost item to cost model
> 
> Represents the cost of a rdffr.
> 
> gcc/ChangeLog:
> 
>       * config/aarch64/aarch64-protos.h (struct sve_vec_cost): Add
>       read_ffr_cost member.
>       * config/aarch64/aarch64.cc (aarch64_builtin_vectorization_cost):
>       Add handling for hssr_read using read_ffr_cost.
>       (aarch64_vector_costs::count_ops):
>       Add handling for hssr_read.
>       * config/aarch64/tuning_models/a64fx.h: Add entry for
>       read_ffr_cost.
>       * config/aarch64/tuning_models/cortexa320.h: Likewise.
>       * config/aarch64/tuning_models/cortexx925.h: Likewise.
>       * config/aarch64/tuning_models/generic.h: Likewise.
>       * config/aarch64/tuning_models/generic_armv8_a.h: Likewise.
>       * config/aarch64/tuning_models/generic_armv9_a.h: Likewise.
>       * config/aarch64/tuning_models/hip12.h: Likewise.
>       * config/aarch64/tuning_models/neoverse512tvb.h: Likewise.
>       * config/aarch64/tuning_models/neoversen2.h: Likewise.
>       * config/aarch64/tuning_models/neoversen3.h: Likewise.
>       * config/aarch64/tuning_models/neoversev1.h: Likewise.
>       * config/aarch64/tuning_models/neoversev2.h: Likewise.
>       * config/aarch64/tuning_models/neoversev3.h: Likewise.
>       * config/aarch64/tuning_models/neoversev3ae.h: Likewise.
>       * config/aarch64/tuning_models/olympus.h: Likewise.
> ---
>  gcc/config/aarch64/aarch64-protos.h                | 10 ++++++++--
>  gcc/config/aarch64/aarch64.cc                      | 12 ++++++++++++
>  gcc/config/aarch64/tuning_models/a64fx.h           |  3 ++-
>  gcc/config/aarch64/tuning_models/cortexa320.h      |  3 ++-
>  gcc/config/aarch64/tuning_models/cortexx925.h      |  3 ++-
>  gcc/config/aarch64/tuning_models/generic.h         |  3 ++-
>  gcc/config/aarch64/tuning_models/generic_armv8_a.h |  3 ++-
>  gcc/config/aarch64/tuning_models/generic_armv9_a.h |  3 ++-
>  gcc/config/aarch64/tuning_models/hip12.h           |  3 ++-
>  gcc/config/aarch64/tuning_models/neoverse512tvb.h  |  3 ++-
>  gcc/config/aarch64/tuning_models/neoversen2.h      |  3 ++-
>  gcc/config/aarch64/tuning_models/neoversen3.h      |  3 ++-
>  gcc/config/aarch64/tuning_models/neoversev1.h      |  3 ++-
>  gcc/config/aarch64/tuning_models/neoversev2.h      |  3 ++-
>  gcc/config/aarch64/tuning_models/neoversev3.h      |  3 ++-
>  gcc/config/aarch64/tuning_models/neoversev3ae.h    |  3 ++-
>  gcc/config/aarch64/tuning_models/olympus.h         |  3 ++-
>  17 files changed, 50 insertions(+), 17 deletions(-)
> 
> diff --git a/gcc/config/aarch64/aarch64-protos.h
> b/gcc/config/aarch64/aarch64-protos.h
> index 22fd1c68b05..c21611f97f7 100644
> --- a/gcc/config/aarch64/aarch64-protos.h
> +++ b/gcc/config/aarch64/aarch64-protos.h
> @@ -266,7 +266,9 @@ struct sve_vec_cost : simd_vec_cost
>                         unsigned int gather_load_x64_cost,
>                         unsigned int gather_load_x32_init_cost,
>                         unsigned int gather_load_x64_init_cost,
> -                       unsigned int scatter_store_elt_cost)
> +                       unsigned int scatter_store_elt_cost,
> +                       unsigned int read_ffr_cost
> +             )
>      : simd_vec_cost (base),
>        clast_cost (clast_cost),
>        fadda_f16_cost (fadda_f16_cost),
> @@ -276,7 +278,8 @@ struct sve_vec_cost : simd_vec_cost
>        gather_load_x64_cost (gather_load_x64_cost),
>        gather_load_x32_init_cost (gather_load_x32_init_cost),
>        gather_load_x64_init_cost (gather_load_x64_init_cost),
> -      scatter_store_elt_cost (scatter_store_elt_cost)
> +      scatter_store_elt_cost (scatter_store_elt_cost),
> +      read_ffr_cost (read_ffr_cost)
>    {}
> 
>    /* The cost of a vector-to-scalar CLASTA or CLASTB instruction,
> @@ -303,6 +306,9 @@ struct sve_vec_cost : simd_vec_cost
> 
>    /* The per-element cost of a scatter store.  */
>    int scatter_store_elt_cost;
> +
> +  /* Cost of an rdffrs.  */
> +  int read_ffr_cost;
>  };
> 
>  /* Base information about how the CPU issues code, containing
> diff --git a/gcc/config/aarch64/aarch64.cc b/gcc/config/aarch64/aarch64.cc
> index d8bd0cc74f1..00df040c8dc 100644
> --- a/gcc/config/aarch64/aarch64.cc
> +++ b/gcc/config/aarch64/aarch64.cc
> @@ -18007,6 +18007,17 @@ aarch64_builtin_vectorization_cost (enum
> vect_cost_for_stmt type_of_cost,
>       elements = estimated_poly_value (TYPE_VECTOR_SUBPARTS
> (vectype));
>       return elements / 2 + 1;
> 
> +      case hssr_read:
> +     {
> +       const sve_vec_cost *sve_costs = aarch64_tune_params.vec_costs-
> >sve;
> +       /* We need SVE to have HSSR so we surely will have sve costs defined
> +          too.  */

But that's already simd_costs then :)  aarch64_simd_vec_costs picks the cost
model based on the vectype and I assume you're costing hssr_read with a vectype?

You also didn't update the serializer and de-serializer. The json costing code 
will
Likely crash here. See aarch64-json-schema.h. edit that and call make which 
should
regenerate the .inc files.

Thanks,
Tamar

> +       gcc_assert (sve_costs);
> +
> +       /* This will be a rdffr + b.nlast.  */
> +       return sve_costs->read_ffr_cost + costs-
> >cond_not_taken_branch_cost;
> +     }
> +
>        default:
>       gcc_unreachable ();
>      }
> @@ -18636,6 +18647,7 @@ aarch64_vector_costs::count_ops (unsigned int
> count, vect_cost_for_stmt kind,
>      case scalar_to_vec:
>      case vector_stmt:
>      case scalar_stmt:
> +    case hssr_read:
>        ops->general_ops += count;
>        break;
> 
> diff --git a/gcc/config/aarch64/tuning_models/a64fx.h
> b/gcc/config/aarch64/tuning_models/a64fx.h
> index c3222960f17..d457e8e29a8 100644
> --- a/gcc/config/aarch64/tuning_models/a64fx.h
> +++ b/gcc/config/aarch64/tuning_models/a64fx.h
> @@ -106,7 +106,8 @@ static const sve_vec_cost a64fx_sve_vector_cost =
>    32, /* gather_load_x64_cost  */
>    0, /* gather_load_x32_init_cost  */
>    0, /* gather_load_x64_init_cost  */
> -  1 /* scatter_store_elt_cost  */
> +  1, /* scatter_store_elt_cost  */
> +  5  /* read_ffr_cost */
>  };
> 
>  static const struct cpu_vector_cost a64fx_vector_cost =
> diff --git a/gcc/config/aarch64/tuning_models/cortexa320.h
> b/gcc/config/aarch64/tuning_models/cortexa320.h
> index d5e1f2b2993..749d2afd879 100644
> --- a/gcc/config/aarch64/tuning_models/cortexa320.h
> +++ b/gcc/config/aarch64/tuning_models/cortexa320.h
> @@ -137,7 +137,8 @@ static const sve_vec_cost
> cortexa320_sve_vector_cost =
>    19, /* gather_load_x64_cost  */
>    48, /* gather_load_x32_init_cost  */
>    38, /* gather_load_x64_init_cost  */
> -  0 /* scatter_store_elt_cost  */
> +  0, /* scatter_store_elt_cost  */
> +  5  /* read_ffr_cost */
>  };
> 
>  /* Cortexa320 costs for vector insn classes.  */
> diff --git a/gcc/config/aarch64/tuning_models/cortexx925.h
> b/gcc/config/aarch64/tuning_models/cortexx925.h
> index 2a73b369706..46e2f653812 100644
> --- a/gcc/config/aarch64/tuning_models/cortexx925.h
> +++ b/gcc/config/aarch64/tuning_models/cortexx925.h
> @@ -119,7 +119,8 @@ static const sve_vec_cost
> cortexx925_sve_vector_cost =
>    12, /* gather_load_x64_cost  */
>    42, /* gather_load_x32_init_cost  */
>    24, /* gather_load_x64_init_cost  */
> -  1 /* scatter_store_elt_cost  */
> +  1, /* scatter_store_elt_cost  */
> +  5  /* read_ffr_cost */
>  };
> 
>  static const aarch64_scalar_vec_issue_info cortexx925_scalar_issue_info =
> diff --git a/gcc/config/aarch64/tuning_models/generic.h
> b/gcc/config/aarch64/tuning_models/generic.h
> index af013e478d4..e163b60f405 100644
> --- a/gcc/config/aarch64/tuning_models/generic.h
> +++ b/gcc/config/aarch64/tuning_models/generic.h
> @@ -107,7 +107,8 @@ static const sve_vec_cost generic_sve_vector_cost =
>    2, /* gather_load_x64_cost  */
>    0, /* gather_load_x32_init_cost  */
>    0, /* gather_load_x64_init_cost  */
> -  1 /* scatter_store_elt_cost  */
> +  1, /* scatter_store_elt_cost  */
> +  5  /* read_ffr_cost */
>  };
> 
>  /* Generic costs for vector insn classes.  */
> diff --git a/gcc/config/aarch64/tuning_models/generic_armv8_a.h
> b/gcc/config/aarch64/tuning_models/generic_armv8_a.h
> index 29cf3a5a7c7..4de03a3770e 100644
> --- a/gcc/config/aarch64/tuning_models/generic_armv8_a.h
> +++ b/gcc/config/aarch64/tuning_models/generic_armv8_a.h
> @@ -108,7 +108,8 @@ static const sve_vec_cost
> generic_armv8_a_sve_vector_cost =
>    2, /* gather_load_x64_cost  */
>    12, /* gather_load_x32_init_cost  */
>    4, /* gather_load_x64_init_cost  */
> -  1 /* scatter_store_elt_cost  */
> +  1, /* scatter_store_elt_cost  */
> +  5  /* read_ffr_cost */
>  };
> 
>  /* Generic costs for vector insn classes.  */
> diff --git a/gcc/config/aarch64/tuning_models/generic_armv9_a.h
> b/gcc/config/aarch64/tuning_models/generic_armv9_a.h
> index 05e777d20ef..d0131c168d9 100644
> --- a/gcc/config/aarch64/tuning_models/generic_armv9_a.h
> +++ b/gcc/config/aarch64/tuning_models/generic_armv9_a.h
> @@ -138,7 +138,8 @@ static const sve_vec_cost
> generic_armv9_a_sve_vector_cost =
>    12, /* gather_load_x64_cost  */
>    42, /* gather_load_x32_init_cost  */
>    24, /* gather_load_x64_init_cost  */
> -  3 /* scatter_store_elt_cost  */
> +  3, /* scatter_store_elt_cost  */
> +  5  /* read_ffr_cost */
>  };
> 
>  static const aarch64_scalar_vec_issue_info
> generic_armv9_a_scalar_issue_info =
> diff --git a/gcc/config/aarch64/tuning_models/hip12.h
> b/gcc/config/aarch64/tuning_models/hip12.h
> index cfb204b2e53..64e08de3da0 100644
> --- a/gcc/config/aarch64/tuning_models/hip12.h
> +++ b/gcc/config/aarch64/tuning_models/hip12.h
> @@ -117,7 +117,8 @@ static const sve_vec_cost hip12_sve_vector_cost =
>    16, /* gather_load_x64_cost  */
>    96, /* gather_load_x32_init_cost  */
>    32, /* gather_load_x64_init_cost  */
> -  3 /* scatter_store_elt_cost  */
> +  3, /* scatter_store_elt_cost  */
> +  5 /* read_ffr_cost */
>  };
> 
>  static const aarch64_scalar_vec_issue_info hip12_scalar_issue_info =
> diff --git a/gcc/config/aarch64/tuning_models/neoverse512tvb.h
> b/gcc/config/aarch64/tuning_models/neoverse512tvb.h
> index d6e2c2e8120..910eb0d52cf 100644
> --- a/gcc/config/aarch64/tuning_models/neoverse512tvb.h
> +++ b/gcc/config/aarch64/tuning_models/neoverse512tvb.h
> @@ -81,7 +81,8 @@ static const sve_vec_cost
> neoverse512tvb_sve_vector_cost =
>    12, /* gather_load_x64_cost  */
>    42, /* gather_load_x32_init_cost  */
>    24, /* gather_load_x64_init_cost  */
> -  3 /* scatter_store_elt_cost  */
> +  3, /* scatter_store_elt_cost  */
> +  5  /* read_ffr_cost */
>  };
> 
>  static const aarch64_sve_vec_issue_info neoverse512tvb_sve_issue_info =
> diff --git a/gcc/config/aarch64/tuning_models/neoversen2.h
> b/gcc/config/aarch64/tuning_models/neoversen2.h
> index 21597e6b50f..abbdc98e068 100644
> --- a/gcc/config/aarch64/tuning_models/neoversen2.h
> +++ b/gcc/config/aarch64/tuning_models/neoversen2.h
> @@ -119,7 +119,8 @@ static const sve_vec_cost
> neoversen2_sve_vector_cost =
>    12, /* gather_load_x64_cost  */
>    42, /* gather_load_x32_init_cost  */
>    24, /* gather_load_x64_init_cost  */
> -  3 /* scatter_store_elt_cost  */
> +  3, /* scatter_store_elt_cost  */
> +  5  /* read_ffr_cost */
>  };
> 
>  static const aarch64_scalar_vec_issue_info neoversen2_scalar_issue_info =
> diff --git a/gcc/config/aarch64/tuning_models/neoversen3.h
> b/gcc/config/aarch64/tuning_models/neoversen3.h
> index 37f9819148f..e17af8c259e 100644
> --- a/gcc/config/aarch64/tuning_models/neoversen3.h
> +++ b/gcc/config/aarch64/tuning_models/neoversen3.h
> @@ -119,7 +119,8 @@ static const sve_vec_cost
> neoversen3_sve_vector_cost =
>    12, /* gather_load_x64_cost  */
>    42, /* gather_load_x32_init_cost  */
>    24, /* gather_load_x64_init_cost  */
> -  1 /* scatter_store_elt_cost  */
> +  1, /* scatter_store_elt_cost  */
> +  5  /* read_ffr_cost */
>  };
> 
>  static const aarch64_scalar_vec_issue_info neoversen3_scalar_issue_info =
> diff --git a/gcc/config/aarch64/tuning_models/neoversev1.h
> b/gcc/config/aarch64/tuning_models/neoversev1.h
> index 004676a8dba..68a82e42dc2 100644
> --- a/gcc/config/aarch64/tuning_models/neoversev1.h
> +++ b/gcc/config/aarch64/tuning_models/neoversev1.h
> @@ -128,7 +128,8 @@ static const sve_vec_cost
> neoversev1_sve_vector_cost =
>    16, /* gather_load_x64_cost  */
>    96, /* gather_load_x32_init_cost  */
>    32, /* gather_load_x64_init_cost  */
> -  3 /* scatter_store_elt_cost  */
> +  3, /* scatter_store_elt_cost  */
> +  5  /* read_ffr_cost */
>  };
> 
>  static const aarch64_scalar_vec_issue_info neoversev1_scalar_issue_info =
> diff --git a/gcc/config/aarch64/tuning_models/neoversev2.h
> b/gcc/config/aarch64/tuning_models/neoversev2.h
> index 73408977251..da20d3724cf 100644
> --- a/gcc/config/aarch64/tuning_models/neoversev2.h
> +++ b/gcc/config/aarch64/tuning_models/neoversev2.h
> @@ -121,7 +121,8 @@ static const sve_vec_cost
> neoversev2_sve_vector_cost =
>    12, /* gather_load_x64_cost  */
>    42, /* gather_load_x32_init_cost  */
>    24, /* gather_load_x64_init_cost  */
> -  3 /* scatter_store_elt_cost  */
> +  3, /* scatter_store_elt_cost  */
> +  5  /* read_ffr_cost */
>  };
> 
>  static const aarch64_scalar_vec_issue_info neoversev2_scalar_issue_info =
> diff --git a/gcc/config/aarch64/tuning_models/neoversev3.h
> b/gcc/config/aarch64/tuning_models/neoversev3.h
> index 7e0144032dc..a6a25a3425a 100644
> --- a/gcc/config/aarch64/tuning_models/neoversev3.h
> +++ b/gcc/config/aarch64/tuning_models/neoversev3.h
> @@ -119,7 +119,8 @@ static const sve_vec_cost
> neoversev3_sve_vector_cost =
>    12, /* gather_load_x64_cost  */
>    42, /* gather_load_x32_init_cost  */
>    24, /* gather_load_x64_init_cost  */
> -  1 /* scatter_store_elt_cost  */
> +  1, /* scatter_store_elt_cost  */
> +  5  /* read_ffr_cost */
>  };
> 
>  static const aarch64_scalar_vec_issue_info neoversev3_scalar_issue_info =
> diff --git a/gcc/config/aarch64/tuning_models/neoversev3ae.h
> b/gcc/config/aarch64/tuning_models/neoversev3ae.h
> index bbe4dc54701..86484268985 100644
> --- a/gcc/config/aarch64/tuning_models/neoversev3ae.h
> +++ b/gcc/config/aarch64/tuning_models/neoversev3ae.h
> @@ -119,7 +119,8 @@ static const sve_vec_cost
> neoversev3ae_sve_vector_cost =
>    12, /* gather_load_x64_cost  */
>    42, /* gather_load_x32_init_cost  */
>    24, /* gather_load_x64_init_cost  */
> -  1 /* scatter_store_elt_cost  */
> +  1, /* scatter_store_elt_cost  */
> +  5  /* read_ffr_cost */
>  };
> 
>  static const aarch64_scalar_vec_issue_info neoversev3ae_scalar_issue_info =
> diff --git a/gcc/config/aarch64/tuning_models/olympus.h
> b/gcc/config/aarch64/tuning_models/olympus.h
> index 1e701722e22..41bd70f0147 100644
> --- a/gcc/config/aarch64/tuning_models/olympus.h
> +++ b/gcc/config/aarch64/tuning_models/olympus.h
> @@ -90,7 +90,8 @@ static sve_vec_cost olympus_sve_vector_cost =
>    12, /* gather_load_x64_cost  */
>    42, /* gather_load_x32_init_cost  */
>    24, /* gather_load_x64_init_cost  */
> -  1 /* scatter_store_elt_cost  */
> +  1, /* scatter_store_elt_cost  */
> +  5  /* read_ffr_cost */
>  };
> 
>  static aarch64_scalar_vec_issue_info olympus_scalar_issue_info =
> --
> 2.43.0

Reply via email to