https://gcc.gnu.org/g:a8b38447efe2c74094b865e1cc44723659dac2e4
commit r16-1098-ga8b38447efe2c74094b865e1cc44723659dac2e4 Author: Pan Li <pan2...@intel.com> Date: Wed Jun 4 11:06:52 2025 +0800 RISC-V: Leverage get_vector_binary_rtx_cost to avoid code dup [NFC] Some similar code could be wrapped to func get_vector_binary_rtx_cost, thus leverage this function to avoid code duplication. The below test suites are passed for this patch series. * The rv64gcv fully regression test. gcc/ChangeLog: * config/riscv/riscv.cc (get_vector_binary_rtx_cost): Rename the args to scalar2vr. (riscv_rtx_costs): Leverage above func to avoid code dup. Signed-off-by: Pan Li <pan2...@intel.com> Diff: --- gcc/config/riscv/riscv.cc | 44 ++++++++++++++++---------------------------- 1 file changed, 16 insertions(+), 28 deletions(-) diff --git a/gcc/config/riscv/riscv.cc b/gcc/config/riscv/riscv.cc index b168a6414988..3254ec9f9e13 100644 --- a/gcc/config/riscv/riscv.cc +++ b/gcc/config/riscv/riscv.cc @@ -3892,11 +3892,11 @@ riscv_extend_cost (rtx op, bool unsigned_p) } /* Return the cost of the vector binary rtx like add, minus, mult. - The cost of gr2vr will be appended if there one of the op comes - from the VEC_DUPLICATE. */ + The cost of scalar2vr_cost will be appended if there one of the + op comes from the VEC_DUPLICATE. */ static int -get_vector_binary_rtx_cost (rtx x, int gr2vr_cost) +get_vector_binary_rtx_cost (rtx x, int scalar2vr_cost) { gcc_assert (riscv_v_ext_mode_p (GET_MODE (x))); @@ -3905,7 +3905,7 @@ get_vector_binary_rtx_cost (rtx x, int gr2vr_cost) if (GET_CODE (op_0) == VEC_DUPLICATE || GET_CODE (op_1) == VEC_DUPLICATE) - return (gr2vr_cost + 1) * COSTS_N_INSNS (1); + return (scalar2vr_cost + 1) * COSTS_N_INSNS (1); else return COSTS_N_INSNS (1); } @@ -3924,6 +3924,8 @@ riscv_rtx_costs (rtx x, machine_mode mode, int outer_code, int opno ATTRIBUTE_UN { int gr2vr_cost = get_gr2vr_cost (); int fr2vr_cost = get_fr2vr_cost (); + int scalar2vr_cost = FLOAT_MODE_P (GET_MODE_INNER (mode)) + ? fr2vr_cost : gr2vr_cost; switch (outer_code) { @@ -3936,12 +3938,12 @@ riscv_rtx_costs (rtx x, machine_mode mode, int outer_code, int opno ATTRIBUTE_UN break; case IF_THEN_ELSE: { - rtx op_1 = XEXP (x, 1); + rtx op = XEXP (x, 1); - switch (GET_CODE (op_1)) + switch (GET_CODE (op)) { case DIV: - *total = get_vector_binary_rtx_cost (op_1, gr2vr_cost); + *total = get_vector_binary_rtx_cost (op, scalar2vr_cost); break; default: *total = COSTS_N_INSNS (1); @@ -3956,31 +3958,17 @@ riscv_rtx_costs (rtx x, machine_mode mode, int outer_code, int opno ATTRIBUTE_UN case XOR: case MULT: { + rtx op; rtx op_0 = XEXP (x, 0); rtx op_1 = XEXP (x, 1); - rtx op; - if (GET_CODE (op_0) == VEC_DUPLICATE - || GET_CODE (op_1) == VEC_DUPLICATE) - { - *total = (gr2vr_cost + 1) * COSTS_N_INSNS (1); - break; - } - else if (GET_CODE (op = op_0) == MULT - || GET_CODE (op = op_1) == MULT) - { - rtx mult_op0 = XEXP (op, 0); - if (GET_CODE (mult_op0) == VEC_DUPLICATE) - { - if (FLOAT_MODE_P (mode)) - *total = (fr2vr_cost + 1) * COSTS_N_INSNS (1); - else - *total = (gr2vr_cost + 1) * COSTS_N_INSNS (1); - break; - } - } + if (GET_CODE (op = op_0) == MULT + || GET_CODE (op = op_1) == MULT) + *total = get_vector_binary_rtx_cost (op, scalar2vr_cost); + else + *total = get_vector_binary_rtx_cost (x, scalar2vr_cost); } - /* Fall through. */ + break; default: *total = COSTS_N_INSNS (1); break;