[v1,2/4] RISC-V: Refactor riscv_option_override and riscv_convert_vector_bits. [NFC]
Checks
Commit Message
Allow those funciton apply from a local gcc_options rather than the
global options.
Preparatory for target attribute, sperate this change for eaiser reivew
since it's a NFC.
gcc/ChangeLog:
* config/riscv/riscv.cc (riscv_convert_vector_bits): Get setting
from argument rather than get setting from global setting.
(riscv_override_options_internal): New, splited from
riscv_override_options, also take a gcc_options argument.
(riscv_option_override): Splited most part to
riscv_override_options_internal.
---
gcc/config/riscv/riscv.cc | 93 ++++++++++++++++++++++-----------------
1 file changed, 52 insertions(+), 41 deletions(-)
Comments
On 10/3/23 03:09, Kito Cheng wrote:
> Allow those funciton apply from a local gcc_options rather than the
> global options.
>
> Preparatory for target attribute, sperate this change for eaiser reivew
> since it's a NFC.
>
> gcc/ChangeLog:
>
> * config/riscv/riscv.cc (riscv_convert_vector_bits): Get setting
> from argument rather than get setting from global setting.
> (riscv_override_options_internal): New, splited from
> riscv_override_options, also take a gcc_options argument.
> (riscv_option_override): Splited most part to
> riscv_override_options_internal.
OK once prerequisites are approved and installed.
jeff
@@ -7982,10 +7982,11 @@ riscv_init_machine_status (void)
/* Return the VLEN value associated with -march.
TODO: So far we only support length-agnostic value. */
static poly_uint16
-riscv_convert_vector_bits (void)
+riscv_convert_vector_bits (struct gcc_options *opts)
{
int chunk_num;
- if (TARGET_MIN_VLEN > 32)
+ int min_vlen = TARGET_MIN_VLEN_OPTS (opts);
+ if (min_vlen > 32)
{
/* When targetting minimum VLEN > 32, we should use 64-bit chunk size.
Otherwise we can not include SEW = 64bits.
@@ -8003,7 +8004,7 @@ riscv_convert_vector_bits (void)
- TARGET_MIN_VLEN = 2048bit: [256,256]
- TARGET_MIN_VLEN = 4096bit: [512,512]
FIXME: We currently DON'T support TARGET_MIN_VLEN > 4096bit. */
- chunk_num = TARGET_MIN_VLEN / 64;
+ chunk_num = min_vlen / 64;
}
else
{
@@ -8022,10 +8023,10 @@ riscv_convert_vector_bits (void)
to set RVV mode size. The RVV machine modes size are run-time constant if
TARGET_VECTOR is enabled. The RVV machine modes size remains default
compile-time constant if TARGET_VECTOR is disabled. */
- if (TARGET_VECTOR)
+ if (TARGET_VECTOR_OPTS_P (opts))
{
- if (riscv_autovec_preference == RVV_FIXED_VLMAX)
- return (int) TARGET_MIN_VLEN / (riscv_bytes_per_vector_chunk * 8);
+ if (opts->x_riscv_autovec_preference == RVV_FIXED_VLMAX)
+ return (int) min_vlen / (riscv_bytes_per_vector_chunk * 8);
else
return poly_uint16 (chunk_num, chunk_num);
}
@@ -8033,40 +8034,33 @@ riscv_convert_vector_bits (void)
return 1;
}
-/* Implement TARGET_OPTION_OVERRIDE. */
-
-static void
-riscv_option_override (void)
+/* 'Unpack' up the internal tuning structs and update the options
+ in OPTS. The caller must have set up selected_tune and selected_arch
+ as all the other target-specific codegen decisions are
+ derived from them. */
+void
+riscv_override_options_internal (struct gcc_options *opts)
{
const struct riscv_tune_info *cpu;
-#ifdef SUBTARGET_OVERRIDE_OPTIONS
- SUBTARGET_OVERRIDE_OPTIONS;
-#endif
-
- flag_pcc_struct_return = 0;
-
- if (flag_pic)
- g_switch_value = 0;
-
/* The presence of the M extension implies that division instructions
are present, so include them unless explicitly disabled. */
- if (TARGET_MUL && (target_flags_explicit & MASK_DIV) == 0)
- target_flags |= MASK_DIV;
- else if (!TARGET_MUL && TARGET_DIV)
+ if (TARGET_MUL_OPTS_P (opts) && (target_flags_explicit & MASK_DIV) == 0)
+ opts->x_target_flags |= MASK_DIV;
+ else if (!TARGET_MUL_OPTS_P (opts) && TARGET_DIV_OPTS_P (opts))
error ("%<-mdiv%> requires %<-march%> to subsume the %<M%> extension");
/* Likewise floating-point division and square root. */
if ((TARGET_HARD_FLOAT || TARGET_ZFINX) && (target_flags_explicit & MASK_FDIV) == 0)
- target_flags |= MASK_FDIV;
+ opts->x_target_flags |= MASK_FDIV;
/* Handle -mtune, use -mcpu if -mtune is not given, and use default -mtune
if both -mtune and -mcpu are not given. */
- cpu = riscv_parse_tune (riscv_tune_string ? riscv_tune_string :
- (riscv_cpu_string ? riscv_cpu_string :
+ cpu = riscv_parse_tune (opts->x_riscv_tune_string ? opts->x_riscv_tune_string :
+ (opts->x_riscv_cpu_string ? opts->x_riscv_cpu_string :
RISCV_TUNE_STRING_DEFAULT));
riscv_microarchitecture = cpu->microarchitecture;
- tune_param = optimize_size ? &optimize_size_tune_info : cpu->tune_param;
+ tune_param = opts->x_optimize_size ? &optimize_size_tune_info : cpu->tune_param;
/* Use -mtune's setting for slow_unaligned_access, even when optimizing
for size. For architectures that trap and emulate unaligned accesses,
@@ -8082,15 +8076,38 @@ riscv_option_override (void)
if ((target_flags_explicit & MASK_STRICT_ALIGN) == 0
&& cpu->tune_param->slow_unaligned_access)
- target_flags |= MASK_STRICT_ALIGN;
+ opts->x_target_flags |= MASK_STRICT_ALIGN;
/* If the user hasn't specified a branch cost, use the processor's
default. */
- if (riscv_branch_cost == 0)
- riscv_branch_cost = tune_param->branch_cost;
+ if (opts->x_riscv_branch_cost == 0)
+ opts->x_riscv_branch_cost = tune_param->branch_cost;
- /* Function to allocate machine-dependent function status. */
- init_machine_status = &riscv_init_machine_status;
+ /* FIXME: We don't allow TARGET_MIN_VLEN > 4096 since the datatypes of
+ both GET_MODE_SIZE and GET_MODE_BITSIZE are poly_uint16.
+
+ We can only allow TARGET_MIN_VLEN * 8 (LMUL) < 65535. */
+ if (TARGET_MIN_VLEN_OPTS (opts) > 4096)
+ sorry ("Current RISC-V GCC cannot support VLEN greater than 4096bit for "
+ "'V' Extension");
+
+ /* Convert -march to a chunks count. */
+ riscv_vector_chunks = riscv_convert_vector_bits (opts);
+}
+
+/* Implement TARGET_OPTION_OVERRIDE. */
+
+static void
+riscv_option_override (void)
+{
+#ifdef SUBTARGET_OVERRIDE_OPTIONS
+ SUBTARGET_OVERRIDE_OPTIONS;
+#endif
+
+ flag_pcc_struct_return = 0;
+
+ if (flag_pic)
+ g_switch_value = 0;
if (flag_pic)
riscv_cmodel = CM_PIC;
@@ -8205,20 +8222,14 @@ riscv_option_override (void)
riscv_stack_protector_guard_offset = offs;
}
- /* FIXME: We don't allow TARGET_MIN_VLEN > 4096 since the datatypes of
- both GET_MODE_SIZE and GET_MODE_BITSIZE are poly_uint16.
-
- We can only allow TARGET_MIN_VLEN * 8 (LMUL) < 65535. */
- if (TARGET_MIN_VLEN > 4096)
- sorry (
- "Current RISC-V GCC cannot support VLEN greater than 4096bit for 'V' Extension");
-
SET_OPTION_IF_UNSET (&global_options, &global_options_set,
param_sched_pressure_algorithm,
SCHED_PRESSURE_MODEL);
- /* Convert -march to a chunks count. */
- riscv_vector_chunks = riscv_convert_vector_bits ();
+ /* Function to allocate machine-dependent function status. */
+ init_machine_status = &riscv_init_machine_status;
+
+ riscv_override_options_internal (&global_options);
}
/* Implement TARGET_CONDITIONAL_REGISTER_USAGE. */