Wilco Dijkstra <wilco.dijks...@arm.com> writes:
> Further cleanup option processing. Remove the duplication of global
> variables for CPU and tune settings so that CPU option processing is
> simplified even further. Move global variables that need save and
> restore due to target option processing into aarch64.opt. This removes
> the need for explicit saving/restoring and unnecessary reparsing of
> options.
>
> Bootstrap OK, regress pass, OK for commit?

OK, thanks.

It looks like this makes the AARCH64_ARCH ARCH_REV parameter redundant,
is that right?

Richard

> gcc/
>         * config/aarch64/aarch64.opt (explicit_tune_core): Rename to
>         selected_tune.
>         (explicit_arch): Rename to selected_arch.
>         (x_aarch64_override_tune_string): Remove.
>         (aarch64_ra_sign_key): Add as TargetVariable so it gets 
> saved/restored.
>         (aarch64_override_tune_string): Add Save so it gets saved/restored.
>         * config/aarch64/aarch64.h (aarch64_architecture_version): Remove.
>         * config/aarch64/aarch64.cc (aarch64_architecture_version): Remove.
>         (processor): Remove archtecture_version field.
>         (selected_arch): Remove global.
>         (selected_cpu): Remove global.
>         (selected_tune): Remove global.
>         (aarch64_ra_sign_key): Move global to aarch64.opt so it is saved.
>         (aarch64_override_options_internal): Use aarch64_get_tune_cpu.
>         (aarch64_override_options): Further simplify code to only set
>         selected_arch and selected_tune globals.
>         (aarch64_option_save): Remove now that target options are saved.
>         (aarch64_option_restore): Remove redundant target option restores.
>         * config/aarch64/aarch64-c.cc (aarch64_update_cpp_builtins): Use
>         AARCH64_ISA_V9.
>         * config/aarch64/aarch64-opts.h (aarch64_key_type): Add, moved from...
>         * config/aarch64/aarch64-protos.h (aarch64_key_type): Remove.
>         (aarch64_ra_sign_key): Remove.
>
> ---
>
> diff --git a/gcc/config/aarch64/aarch64-c.cc b/gcc/config/aarch64/aarch64-c.cc
> index 
> 767ee0c763c56a022089a647c7425afb00644644..3d2fb5ec2ef33e66aaa59d216c53a29737262794
>  100644
> --- a/gcc/config/aarch64/aarch64-c.cc
> +++ b/gcc/config/aarch64/aarch64-c.cc
> @@ -82,7 +82,7 @@ aarch64_update_cpp_builtins (cpp_reader *pfile)
>  {
>    aarch64_def_or_undef (flag_unsafe_math_optimizations, "__ARM_FP_FAST", 
> pfile);
>
> -  builtin_define_with_int_value ("__ARM_ARCH", aarch64_architecture_version);
> +  builtin_define_with_int_value ("__ARM_ARCH", AARCH64_ISA_V9 ? 9 : 8);
>
>    builtin_define_with_int_value ("__ARM_SIZEOF_MINIMAL_ENUM",
>                                  flag_short_enums ? 1 : 4);
> diff --git a/gcc/config/aarch64/aarch64-opts.h 
> b/gcc/config/aarch64/aarch64-opts.h
> index 
> 93572fe8330218568435f485a366101eb2c58da9..421648a156a02cc1f43660eddc5de38c2f366a72
>  100644
> --- a/gcc/config/aarch64/aarch64-opts.h
> +++ b/gcc/config/aarch64/aarch64-opts.h
> @@ -98,4 +98,10 @@ enum stack_protector_guard {
>    SSP_GLOBAL                   /* global canary */
>  };
>
> +/* The key type that -msign-return-address should use.  */
> +enum aarch64_key_type {
> +  AARCH64_KEY_A,
> +  AARCH64_KEY_B
> +};
> +
>  #endif
> diff --git a/gcc/config/aarch64/aarch64-protos.h 
> b/gcc/config/aarch64/aarch64-protos.h
> index 
> df311812e8d4b87c0ad8692adacedcd79a8e0f64..dabd047d7ba2c532238720d59ecd59f0f5ba822f
>  100644
> --- a/gcc/config/aarch64/aarch64-protos.h
> +++ b/gcc/config/aarch64/aarch64-protos.h
> @@ -672,14 +672,6 @@ enum simd_immediate_check {
>    AARCH64_CHECK_MOV  = AARCH64_CHECK_ORR | AARCH64_CHECK_BIC
>  };
>
> -/* The key type that -msign-return-address should use.  */
> -enum aarch64_key_type {
> -  AARCH64_KEY_A,
> -  AARCH64_KEY_B
> -};
> -
> -extern enum aarch64_key_type aarch64_ra_sign_key;
> -
>  extern struct tune_params aarch64_tune_params;
>
>  /* The available SVE predicate patterns, known in the ACLE as "svpattern".  
> */
> diff --git a/gcc/config/aarch64/aarch64.h b/gcc/config/aarch64/aarch64.h
> index 
> f835da33b72f36bbf25a0e1328135411bd8ab4f6..80cfe4b740798072ed2a3d08089ff889943f916a
>  100644
> --- a/gcc/config/aarch64/aarch64.h
> +++ b/gcc/config/aarch64/aarch64.h
> @@ -148,9 +148,6 @@
>
>  #define PCC_BITFIELD_TYPE_MATTERS      1
>
> -/* Major revision number of the ARM Architecture implemented by the target.  
> */
> -extern unsigned aarch64_architecture_version;
> -
>  /* Instruction tuning/selection flags.  */
>
>  /* Bit values used to identify processor capabilities.  */
> diff --git a/gcc/config/aarch64/aarch64.cc b/gcc/config/aarch64/aarch64.cc
> index 
> 060c67a93b95b717563ed063509e3e31c978d891..6bdfd55bcd6308c71fb6cfccb5922b71830c7c4f
>  100644
> --- a/gcc/config/aarch64/aarch64.cc
> +++ b/gcc/config/aarch64/aarch64.cc
> @@ -306,9 +306,6 @@ static bool aarch64_print_address_internal (FILE*, 
> machine_mode, rtx,
>                                             aarch64_addr_query_type);
>  static HOST_WIDE_INT aarch64_clamp_to_uimm12_shift (HOST_WIDE_INT val);
>
> -/* Major revision number of the ARM Architecture implemented by the target.  
> */
> -unsigned aarch64_architecture_version;
> -
>  /* The processor for which instructions should be scheduled.  */
>  enum aarch64_processor aarch64_tune = cortexa53;
>
> @@ -2677,7 +2674,6 @@ struct processor
>    enum aarch64_processor ident;
>    enum aarch64_processor sched_core;
>    enum aarch64_arch arch;
> -  unsigned architecture_version;
>    const uint64_t flags;
>    const struct tune_params *const tune;
>  };
> @@ -2686,9 +2682,9 @@ struct processor
>  static const struct processor all_architectures[] =
>  {
>  #define AARCH64_ARCH(NAME, CORE, ARCH_IDENT, ARCH_REV, FLAGS) \
> -  {NAME, CORE, CORE, AARCH64_ARCH_##ARCH_IDENT, ARCH_REV, FLAGS, NULL},
> +  {NAME, CORE, CORE, AARCH64_ARCH_##ARCH_IDENT, FLAGS, NULL},
>  #include "aarch64-arches.def"
> -  {NULL, aarch64_none, aarch64_none, aarch64_no_arch, 0, 0, NULL}
> +  {NULL, aarch64_none, aarch64_none, aarch64_no_arch, 0, NULL}
>  };
>
>  /* Processor cores implementing AArch64.  */
> @@ -2696,23 +2692,13 @@ static const struct processor all_cores[] =
>  {
>  #define AARCH64_CORE(NAME, IDENT, SCHED, ARCH, FLAGS, COSTS, IMP, PART, 
> VARIANT) \
>    {NAME, IDENT, SCHED, AARCH64_ARCH_##ARCH,                            \
> -  all_architectures[AARCH64_ARCH_##ARCH].architecture_version, \
>    FLAGS, &COSTS##_tunings},
>  #include "aarch64-cores.def"
> -  {"generic", generic, cortexa53, AARCH64_ARCH_8A, 8,
> +  {"generic", generic, cortexa53, AARCH64_ARCH_8A,
>      AARCH64_FL_FOR_ARCH8, &generic_tunings},
> -  {NULL, aarch64_none, aarch64_none, aarch64_no_arch, 0, 0, NULL}
> +  {NULL, aarch64_none, aarch64_none, aarch64_no_arch, 0, NULL}
>  };
>
> -
> -/* Target specification.  These are populated by the -march, -mtune, -mcpu
> -   handling code or by target attributes.  */
> -static const struct processor *selected_arch;
> -static const struct processor *selected_cpu;
> -static const struct processor *selected_tune;
> -
> -enum aarch64_key_type aarch64_ra_sign_key = AARCH64_KEY_A;
> -
>  /* The current tuning set.  */
>  struct tune_params aarch64_tune_params = generic_tunings;
>
> @@ -10353,8 +10339,8 @@ aarch64_case_values_threshold (void)
>    /* Use the specified limit for the number of cases before using jump
>       tables at higher optimization levels.  */
>    if (optimize > 2
> -      && selected_cpu->tune->max_case_values != 0)
> -    return selected_cpu->tune->max_case_values;
> +      && aarch64_tune_params.max_case_values != 0)
> +    return aarch64_tune_params.max_case_values;
>    else
>      return optimize_size ? 8 : 11;
>  }
> @@ -17415,6 +17401,26 @@ initialize_aarch64_tls_size (struct gcc_options 
> *opts)
>    return;
>  }
>
> +/* Return the CPU corresponding to the enum CPU.  */
> +
> +static const struct processor *
> +aarch64_get_tune_cpu (enum aarch64_processor cpu)
> +{
> +  gcc_assert (cpu != aarch64_none);
> +
> +  return &all_cores[cpu];
> +}
> +
> +/* Return the architecture corresponding to the enum ARCH.  */
> +
> +static const struct processor *
> +aarch64_get_arch (enum aarch64_arch arch)
> +{
> +  gcc_assert (arch != aarch64_no_arch);
> +
> +  return &all_architectures[arch];
> +}
> +
>  /* Parse STRING looking for options in the format:
>       string    :: option:string
>       option    :: name=substring
> @@ -17525,18 +17531,18 @@ aarch64_override_options_after_change_1 (struct 
> gcc_options *opts)
>  void
>  aarch64_override_options_internal (struct gcc_options *opts)
>  {
> -  aarch64_tune_flags = selected_tune->flags;
> -  aarch64_tune = selected_tune->sched_core;
> +  const struct processor *tune = aarch64_get_tune_cpu 
> (opts->x_selected_tune);
> +  aarch64_tune_flags = tune->flags;
> +  aarch64_tune = tune->sched_core;
>    /* Make a copy of the tuning parameters attached to the core, which
>       we may later overwrite.  */
> -  aarch64_tune_params = *(selected_tune->tune);
> -  aarch64_architecture_version = selected_arch->architecture_version;
> -  if (selected_tune->tune == &generic_tunings)
> +  aarch64_tune_params = *(tune->tune);
> +  if (tune->tune == &generic_tunings)
>      aarch64_adjust_generic_arch_tuning (aarch64_tune_params);
>
>    if (opts->x_aarch64_override_tune_string)
>      aarch64_parse_override_string (opts->x_aarch64_override_tune_string,
> -                                 &aarch64_tune_params);
> +                                  &aarch64_tune_params);
>
>    /* This target defaults to strict volatile bitfields.  */
>    if (opts->x_flag_strict_volatile_bitfields < 0 && abi_version_at_least (2))
> @@ -17697,13 +17703,6 @@ aarch64_override_options_internal (struct 
> gcc_options *opts)
>        && opts->x_optimize >= aarch64_tune_params.prefetch->default_opt_level)
>      opts->x_flag_prefetch_loop_arrays = 1;
>
> -  if (opts->x_aarch64_arch_string == NULL)
> -    opts->x_aarch64_arch_string = selected_arch->name;
> -  if (opts->x_aarch64_cpu_string == NULL)
> -    opts->x_aarch64_cpu_string = selected_cpu->name;
> -  if (opts->x_aarch64_tune_string == NULL)
> -    opts->x_aarch64_tune_string = selected_tune->name;
> -
>    aarch64_override_options_after_change_1 (opts);
>  }
>
> @@ -18055,26 +18054,6 @@ aarch64_validate_mtune (const char *str, const 
> struct processor **res)
>    return false;
>  }
>
> -/* Return the CPU corresponding to the enum CPU.  */
> -
> -static const struct processor *
> -aarch64_get_tune_cpu (enum aarch64_processor cpu)
> -{
> -  gcc_assert (cpu != aarch64_none);
> -
> -  return &all_cores[cpu];
> -}
> -
> -/* Return the architecture corresponding to the enum ARCH.  */
> -
> -static const struct processor *
> -aarch64_get_arch (enum aarch64_arch arch)
> -{
> -  gcc_assert (arch != aarch64_no_arch);
> -
> -  return &all_architectures[arch];
> -}
> -
>  /* Return the VG value associated with -msve-vector-bits= value VALUE.  */
>
>  static poly_uint16
> @@ -18110,9 +18089,9 @@ aarch64_override_options (void)
>    uint64_t arch_isa = 0;
>    aarch64_isa_flags = 0;
>
> -  selected_cpu = NULL;
> -  selected_arch = NULL;
> -  selected_tune = NULL;
> +  const struct processor *cpu = NULL;
> +  const struct processor *arch = NULL;
> +  const struct processor *tune = NULL;
>
>    if (aarch64_harden_sls_string)
>      aarch64_validate_sls_mitigation (aarch64_harden_sls_string);
> @@ -18124,56 +18103,52 @@ aarch64_override_options (void)
>       If either of -march or -mtune is given, they override their
>       respective component of -mcpu.  */
>    if (aarch64_cpu_string)
> -    aarch64_validate_mcpu (aarch64_cpu_string, &selected_cpu, &cpu_isa);
> +    aarch64_validate_mcpu (aarch64_cpu_string, &cpu, &cpu_isa);
>
>    if (aarch64_arch_string)
> -    aarch64_validate_march (aarch64_arch_string, &selected_arch, &arch_isa);
> +    aarch64_validate_march (aarch64_arch_string, &arch, &arch_isa);
>
>    if (aarch64_tune_string)
> -    aarch64_validate_mtune (aarch64_tune_string, &selected_tune);
> +    aarch64_validate_mtune (aarch64_tune_string, &tune);
>
>  #ifdef SUBTARGET_OVERRIDE_OPTIONS
>    SUBTARGET_OVERRIDE_OPTIONS;
>  #endif
>
> -  if (selected_cpu && selected_arch)
> +  if (cpu && arch)
>      {
>        /* If both -mcpu and -march are specified, warn if they are not
>          architecturally compatible and prefer the -march ISA flags.  */
> -      if (selected_arch->arch != selected_cpu->arch)
> +      if (arch->arch != cpu->arch)
>         {
>           warning (0, "switch %<-mcpu=%s%> conflicts with %<-march=%s%> 
> switch",
>                        aarch64_cpu_string,
>                        aarch64_arch_string);
>         }
>
> +      selected_arch = arch->arch;
>        aarch64_isa_flags = arch_isa;
>      }
> -  else if (selected_cpu)
> +  else if (cpu)
>      {
> -      selected_arch = &all_architectures[selected_cpu->arch];
> +      selected_arch = cpu->arch;
>        aarch64_isa_flags = cpu_isa;
>      }
> -  else if (selected_arch)
> +  else if (arch)
>      {
> -      selected_cpu = &all_cores[selected_arch->ident];
> +      cpu = &all_cores[arch->ident];
> +      selected_arch = arch->arch;
>        aarch64_isa_flags = arch_isa;
>      }
>    else
>      {
>        /* No -mcpu or -march specified, so use the default CPU.  */
> -      selected_cpu = &all_cores[TARGET_CPU_DEFAULT];
> -      selected_arch = &all_architectures[selected_cpu->arch];
> -      aarch64_isa_flags = selected_cpu->flags;
> +      cpu = &all_cores[TARGET_CPU_DEFAULT];
> +      selected_arch = cpu->arch;
> +      aarch64_isa_flags = cpu->flags;
>      }
>
> -  explicit_arch = selected_arch->arch;
> -  if (!selected_tune)
> -    selected_tune = selected_cpu;
> -  explicit_tune_core = selected_tune->ident;
> -
> -  gcc_assert (explicit_tune_core != aarch64_none);
> -  gcc_assert (explicit_arch != aarch64_no_arch);
> +  selected_tune = tune ? tune->ident : cpu->ident;
>
>    if (aarch64_enable_bti == 2)
>      {
> @@ -18292,38 +18267,14 @@ initialize_aarch64_code_model (struct gcc_options 
> *opts)
>      }
>  }
>
> -/* Implement TARGET_OPTION_SAVE.  */
> -
> -static void
> -aarch64_option_save (struct cl_target_option *ptr, struct gcc_options *opts,
> -                    struct gcc_options */* opts_set */)
> -{
> -  ptr->x_aarch64_override_tune_string = opts->x_aarch64_override_tune_string;
> -  ptr->x_aarch64_branch_protection_string
> -    = opts->x_aarch64_branch_protection_string;
> -}
> -
>  /* Implements TARGET_OPTION_RESTORE.  Restore the backend codegen decisions
>     using the information saved in PTR.  */
>
>  static void
>  aarch64_option_restore (struct gcc_options *opts,
> -                       struct gcc_options */* opts_set */,
> -                       struct cl_target_option *ptr)
> +                       struct gcc_options * /* opts_set */,
> +                       struct cl_target_option * /* ptr */)
>  {
> -  opts->x_explicit_arch = ptr->x_explicit_arch;
> -  selected_arch = aarch64_get_arch (ptr->x_explicit_arch);
> -  opts->x_explicit_tune_core = ptr->x_explicit_tune_core;
> -  selected_tune = aarch64_get_tune_cpu (ptr->x_explicit_tune_core);
> -  opts->x_aarch64_override_tune_string = ptr->x_aarch64_override_tune_string;
> -  opts->x_aarch64_branch_protection_string
> -    = ptr->x_aarch64_branch_protection_string;
> -  if (opts->x_aarch64_branch_protection_string)
> -    {
> -      aarch64_parse_branch_protection 
> (opts->x_aarch64_branch_protection_string,
> -                                       NULL);
> -    }
> -
>    aarch64_override_options_internal (opts);
>  }
>
> @@ -18333,11 +18284,11 @@ static void
>  aarch64_option_print (FILE *file, int indent, struct cl_target_option *ptr)
>  {
>    const struct processor *cpu
> -    = aarch64_get_tune_cpu (ptr->x_explicit_tune_core);
> -  uint64_t isa_flags = ptr->x_aarch64_isa_flags;
> -  const struct processor *arch = aarch64_get_arch (ptr->x_explicit_arch);
> +    = aarch64_get_tune_cpu (ptr->x_selected_tune);
> +  const struct processor *arch = aarch64_get_arch (ptr->x_selected_arch);
>    std::string extension
> -    = aarch64_get_extension_string_for_isa_flags (isa_flags, arch->flags);
> +    = aarch64_get_extension_string_for_isa_flags (ptr->x_aarch64_isa_flags,
> +                                                 arch->flags);
>
>    fprintf (file, "%*sselected tune = %s\n", indent, "", cpu->name);
>    fprintf (file, "%*sselected arch = %s%s\n", indent, "",
> @@ -18450,8 +18401,7 @@ aarch64_handle_attr_arch (const char *str)
>    if (parse_res == AARCH64_PARSE_OK)
>      {
>        gcc_assert (tmp_arch);
> -      selected_arch = tmp_arch;
> -      explicit_arch = selected_arch->arch;
> +      selected_arch = tmp_arch->arch;
>        return true;
>      }
>
> @@ -18489,11 +18439,8 @@ aarch64_handle_attr_cpu (const char *str)
>    if (parse_res == AARCH64_PARSE_OK)
>      {
>        gcc_assert (tmp_cpu);
> -      selected_tune = tmp_cpu;
> -      explicit_tune_core = selected_tune->ident;
> -
> -      selected_arch = &all_architectures[tmp_cpu->arch];
> -      explicit_arch = selected_arch->arch;
> +      selected_tune = tmp_cpu->ident;
> +      selected_arch = tmp_cpu->arch;
>        return true;
>      }
>
> @@ -18561,8 +18508,7 @@ aarch64_handle_attr_tune (const char *str)
>    if (parse_res == AARCH64_PARSE_OK)
>      {
>        gcc_assert (tmp_tune);
> -      selected_tune = tmp_tune;
> -      explicit_tune_core = selected_tune->ident;
> +      selected_tune = tmp_tune->ident;
>        return true;
>      }
>
> @@ -22467,7 +22413,7 @@ aarch64_declare_function_name (FILE *stream, const 
> char* name,
>    gcc_assert (targ_options);
>
>    const struct processor *this_arch
> -    = aarch64_get_arch (targ_options->x_explicit_arch);
> +    = aarch64_get_arch (targ_options->x_selected_arch);
>
>    uint64_t isa_flags = targ_options->x_aarch64_isa_flags;
>    std::string extension
> @@ -22486,7 +22432,7 @@ aarch64_declare_function_name (FILE *stream, const 
> char* name,
>       useful to readers of the generated asm.  Do it only when it changes
>       from function to function and verbose assembly is requested.  */
>    const struct processor *this_tune
> -    = aarch64_get_tune_cpu (targ_options->x_explicit_tune_core);
> +    = aarch64_get_tune_cpu (targ_options->x_selected_tune);
>
>    if (flag_debug_asm && aarch64_last_printed_tune_string != this_tune->name)
>      {
> @@ -22572,7 +22518,7 @@ aarch64_start_file (void)
>      = TREE_TARGET_OPTION (target_option_default_node);
>
>    const struct processor *default_arch
> -    = aarch64_get_arch (default_options->x_explicit_arch);
> +    = aarch64_get_arch (default_options->x_selected_arch);
>    uint64_t default_isa_flags = default_options->x_aarch64_isa_flags;
>    std::string extension
>      = aarch64_get_extension_string_for_isa_flags (default_isa_flags,
> @@ -27445,9 +27391,6 @@ aarch64_libgcc_floating_mode_supported_p
>  #undef TARGET_OFFLOAD_OPTIONS
>  #define TARGET_OFFLOAD_OPTIONS aarch64_offload_options
>
> -#undef TARGET_OPTION_SAVE
> -#define TARGET_OPTION_SAVE aarch64_option_save
> -
>  #undef TARGET_OPTION_RESTORE
>  #define TARGET_OPTION_RESTORE aarch64_option_restore
>
> diff --git a/gcc/config/aarch64/aarch64.opt b/gcc/config/aarch64/aarch64.opt
> index 
> 92220b26ee2bf9f95c9a387c3155779596ee5ad5..d8e1f42a3a683c6d2cb7d930a41ec2e0415e2bf1
>  100644
> --- a/gcc/config/aarch64/aarch64.opt
> +++ b/gcc/config/aarch64/aarch64.opt
> @@ -22,13 +22,10 @@ HeaderInclude
>  config/aarch64/aarch64-opts.h
>
>  TargetVariable
> -enum aarch64_processor explicit_tune_core = aarch64_none
> +enum aarch64_processor selected_tune = aarch64_none
>
>  TargetVariable
> -enum aarch64_arch explicit_arch = aarch64_no_arch
> -
> -TargetSave
> -const char *x_aarch64_override_tune_string
> +enum aarch64_arch selected_arch = aarch64_no_arch
>
>  TargetVariable
>  uint64_t aarch64_isa_flags = 0
> @@ -36,6 +33,9 @@ uint64_t aarch64_isa_flags = 0
>  TargetVariable
>  unsigned aarch64_enable_bti = 2
>
> +TargetVariable
> +enum aarch64_key_type aarch64_ra_sign_key = AARCH64_KEY_A
> +
>  ; The TLS dialect names to use with -mtls-dialect.
>
>  Enum
> @@ -139,7 +139,7 @@ Target RejectNegative Joined Enum(aarch64_abi) 
> Var(aarch64_abi) Init(AARCH64_ABI
>  Generate code that conforms to the specified ABI.
>
>  moverride=
> -Target RejectNegative ToLower Joined Var(aarch64_override_tune_string)
> +Target RejectNegative ToLower Joined Var(aarch64_override_tune_string) Save
>  -moverride=<string>    Power users only! Override CPU optimization 
> parameters.
>
>  Enum

Reply via email to