From: Pan Li <pan2...@intel.com>

During investigate the combine from vec_dup and vop.vv into
vop.vx, we need to depend on the cost of the insn operate
from the gr to vr, for example, vadd.vx.  Thus, for better
control and test, we introduce a new option, aka below:

--param=rvv-gr2vr-cost=<unsigned int>

To specific the cost value of the insn that operate from
the gr to vr.

gcc/ChangeLog:

        * config/riscv/riscv-opts.h (RVV_GR2VR_COST_UNPROVIDED): Add
        new macro to indicate the param is not provided.
        * config/riscv/riscv.cc (get_vector_gr2vr_cost): Add new func
        to get the cost value of rvv insn operate from gr to vr.
        * config/riscv/riscv.opt: Add new option --pararm=rvv-gr2vr-cost.

Signed-off-by: Pan Li <pan2...@intel.com>
---
 gcc/config/riscv/riscv-opts.h |  2 ++
 gcc/config/riscv/riscv.cc     | 11 +++++++++++
 gcc/config/riscv/riscv.opt    |  4 ++++
 3 files changed, 17 insertions(+)

diff --git a/gcc/config/riscv/riscv-opts.h b/gcc/config/riscv/riscv-opts.h
index 26fe228e0f8..670f540f11d 100644
--- a/gcc/config/riscv/riscv-opts.h
+++ b/gcc/config/riscv/riscv-opts.h
@@ -162,4 +162,6 @@ enum riscv_tls_type {
 #define TARGET_VECTOR_AUTOVEC_SEGMENT                                         \
   (TARGET_VECTOR && riscv_mautovec_segment)
 
+#define RVV_GR2VR_COST_UNPROVIDED -1
+
 #endif /* ! GCC_RISCV_OPTS_H */
diff --git a/gcc/config/riscv/riscv.cc b/gcc/config/riscv/riscv.cc
index ed635ab42f4..ee23888cbf7 100644
--- a/gcc/config/riscv/riscv.cc
+++ b/gcc/config/riscv/riscv.cc
@@ -3851,6 +3851,17 @@ riscv_extend_cost (rtx op, bool unsigned_p)
   return COSTS_N_INSNS (2);
 }
 
+static inline int
+get_vector_gr2vr_cost ()
+{
+  int cost = get_vector_costs ()->regmove->GR2VR;
+
+  if (rvv_gr2vr_cost != RVV_GR2VR_COST_UNPROVIDED)
+    cost = rvv_gr2vr_cost;
+
+  return cost;
+}
+
 /* Implement TARGET_RTX_COSTS.  */
 
 #define SINGLE_SHIFT_COST 1
diff --git a/gcc/config/riscv/riscv.opt b/gcc/config/riscv/riscv.opt
index 7515c8ea13d..4ed0412e1aa 100644
--- a/gcc/config/riscv/riscv.opt
+++ b/gcc/config/riscv/riscv.opt
@@ -579,6 +579,10 @@ Inline strlen calls if possible.
 Target RejectNegative Joined UInteger Var(riscv_strcmp_inline_limit) Init(64)
 Max number of bytes to compare as part of inlined strcmp/strncmp routines 
(default: 64).
 
+-param=rvv-gr2vr-cost=
+Target RejectNegative Joined UInteger Var(rvv_gr2vr_cost) 
Init(RVV_GR2VR_COST_UNPROVIDED)
+Set the cost value of the rvv instruction when operate from GR to VR.
+
 Enum
 Name(rvv_max_lmul) Type(enum rvv_max_lmul_enum)
 The RVV possible LMUL (-mrvv-max-lmul=):
-- 
2.43.0

Reply via email to