aboutsummaryrefslogtreecommitdiff
path: root/gcc/config
diff options
context:
space:
mode:
authorJuzhe-Zhong <juzhe.zhong@rivai.ai>2023-12-26 16:42:27 +0800
committerPan Li <pan2.li@intel.com>2023-12-26 17:15:41 +0800
commitf83cfb8148bcf0876df76761a9a4545bc939667d (patch)
treeb10cb67e478097b03e9ed2458c2adbddfb92b004 /gcc/config
parent6cec7b06b3c8187b36fc05cfd4dd38b42313d727 (diff)
downloadgcc-f83cfb8148bcf0876df76761a9a4545bc939667d.zip
gcc-f83cfb8148bcf0876df76761a9a4545bc939667d.tar.gz
gcc-f83cfb8148bcf0876df76761a9a4545bc939667d.tar.bz2
RISC-V: Some minior tweak on dynamic LMUL cost model
Tweak some codes of dynamic LMUL cost model to make computation more predictable and accurate. Tested on both RV32 and RV64 no regression. Committed. PR target/113112 gcc/ChangeLog: * config/riscv/riscv-vector-costs.cc (compute_estimated_lmul): Tweak LMUL estimation. (has_unexpected_spills_p): Ditto. (costs::record_potential_unexpected_spills): Ditto. gcc/testsuite/ChangeLog: * gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul1-1.c: Add more checks. * gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul1-2.c: Ditto. * gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul1-3.c: Ditto. * gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul1-4.c: Ditto. * gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul1-5.c: Ditto. * gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul1-6.c: Ditto. * gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul1-7.c: Ditto. * gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul2-1.c: Ditto. * gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul2-2.c: Ditto. * gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul2-3.c: Ditto. * gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul2-4.c: Ditto. * gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul2-5.c: Ditto. * gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul4-1.c: Ditto. * gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul4-2.c: Ditto. * gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul4-3.c: Ditto. * gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul4-5.c: Ditto. * gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul4-6.c: Ditto. * gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul4-7.c: Ditto. * gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul4-8.c: Ditto. * gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul8-1.c: Ditto. * gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul8-10.c: Ditto. * gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul8-11.c: Ditto. * gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul8-2.c: Ditto. * gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul8-3.c: Ditto. * gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul8-4.c: Ditto. * gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul8-5.c: Ditto. * gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul8-6.c: Ditto. * gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul8-7.c: Ditto. * gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul8-8.c: Ditto. * gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul8-9.c: Ditto. * gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul8-12.c: New test. * gcc.dg/vect/costmodel/riscv/rvv/pr113112-2.c: New test.
Diffstat (limited to 'gcc/config')
-rw-r--r--gcc/config/riscv/riscv-vector-costs.cc42
1 files changed, 29 insertions, 13 deletions
diff --git a/gcc/config/riscv/riscv-vector-costs.cc b/gcc/config/riscv/riscv-vector-costs.cc
index 7b837b0..74b8e86 100644
--- a/gcc/config/riscv/riscv-vector-costs.cc
+++ b/gcc/config/riscv/riscv-vector-costs.cc
@@ -394,21 +394,32 @@ compute_estimated_lmul (loop_vec_info loop_vinfo, machine_mode mode)
{
gcc_assert (GET_MODE_BITSIZE (mode).is_constant ());
int regno_alignment = riscv_get_v_regno_alignment (loop_vinfo->vector_mode);
- if (known_eq (LOOP_VINFO_SLP_UNROLLING_FACTOR (loop_vinfo), 1U))
+ if (riscv_v_ext_vls_mode_p (loop_vinfo->vector_mode))
+ return regno_alignment;
+ else if (known_eq (LOOP_VINFO_SLP_UNROLLING_FACTOR (loop_vinfo), 1U)
+ || LOOP_VINFO_SLP_UNROLLING_FACTOR (loop_vinfo).is_constant ())
{
int estimated_vf = vect_vf_for_cost (loop_vinfo);
return estimated_vf * GET_MODE_BITSIZE (mode).to_constant ()
/ TARGET_MIN_VLEN;
}
- else if (regno_alignment > 1)
- return regno_alignment;
else
{
- int ratio;
- if (can_div_trunc_p (BYTES_PER_RISCV_VECTOR,
- LOOP_VINFO_SLP_UNROLLING_FACTOR (loop_vinfo),
- &ratio))
- return TARGET_MAX_LMUL / ratio;
+ /* Estimate the VLA SLP LMUL. */
+ if (regno_alignment > RVV_M1)
+ return regno_alignment;
+ else if (mode != QImode)
+ {
+ int ratio;
+ if (can_div_trunc_p (BYTES_PER_RISCV_VECTOR,
+ GET_MODE_SIZE (loop_vinfo->vector_mode), &ratio))
+ {
+ if (ratio == 1)
+ return RVV_M4;
+ else if (ratio == 2)
+ return RVV_M2;
+ }
+ }
}
return 0;
}
@@ -540,7 +551,10 @@ update_local_live_ranges (
stmt_vec_info stmt_info = vinfo->lookup_stmt (gsi_stmt (si));
enum stmt_vec_info_type type
= STMT_VINFO_TYPE (vect_stmt_to_vectorize (stmt_info));
- if (non_contiguous_memory_access_p (stmt_info))
+ if (non_contiguous_memory_access_p (stmt_info)
+ /* LOAD_LANES/STORE_LANES doesn't need a perm indice. */
+ && STMT_VINFO_MEMORY_ACCESS_TYPE (stmt_info)
+ != VMAT_LOAD_STORE_LANES)
{
/* For non-adjacent load/store STMT, we will potentially
convert it into:
@@ -578,9 +592,6 @@ update_local_live_ranges (
static bool
has_unexpected_spills_p (loop_vec_info loop_vinfo)
{
- /* We don't apply dynamic LMUL cost model on VLS modes. */
- if (!riscv_v_ext_vector_mode_p (loop_vinfo->vector_mode))
- return false;
/* Compute local program points.
It's a fast and effective computation. */
hash_map<basic_block, vec<stmt_point>> program_points_per_bb;
@@ -682,7 +693,12 @@ costs::analyze_loop_vinfo (loop_vec_info loop_vinfo)
void
costs::record_potential_unexpected_spills (loop_vec_info loop_vinfo)
{
- if (riscv_autovec_lmul == RVV_DYNAMIC)
+ /* We only want to apply the heuristic if LOOP_VINFO is being
+ vectorized for VLA and known NITERS VLS loop. */
+ if (riscv_autovec_lmul == RVV_DYNAMIC
+ && (m_cost_type == VLA_VECTOR_COST
+ || (m_cost_type == VLS_VECTOR_COST
+ && LOOP_VINFO_NITERS_KNOWN_P (loop_vinfo))))
{
bool post_dom_available_p = dom_info_available_p (CDI_POST_DOMINATORS);
if (!post_dom_available_p)