RISC-V: Move RVV V_REGS liveness computation into analyze_loop_vinfo
Checks
Commit Message
Currently, we compute RVV V_REGS liveness during better_main_loop_than_p which is not appropriate
time to do that since we for example, when have the codes will finally pick LMUL = 8 vectorization
factor, we compute liveness for LMUL = 8 multiple times which are redundant.
Since we have leverage the current ARM SVE COST model:
/* Do one-time initialization based on the vinfo. */
loop_vec_info loop_vinfo = dyn_cast<loop_vec_info> (m_vinfo);
if (!m_analyzed_vinfo)
{
if (loop_vinfo)
analyze_loop_vinfo (loop_vinfo);
m_analyzed_vinfo = true;
}
Analyze COST model only once for each cost model.
So here we move dynamic LMUL liveness information into analyze_loop_vinfo.
/* Do one-time initialization of the costs given that we're
costing the loop vectorization described by LOOP_VINFO. */
void
costs::analyze_loop_vinfo (loop_vec_info loop_vinfo)
{
...
/* Detect whether the LOOP has unexpected spills. */
record_potential_unexpected_spills (loop_vinfo);
}
So that we can avoid redundant computations and the current dynamic LMUL cost model flow is much
more reasonable and consistent with others.
Tested on RV32 and RV64 no regressions.
gcc/ChangeLog:
* config/riscv/riscv-vector-costs.cc (compute_estimated_lmul): Allow fractional vecrtor.
(preferred_new_lmul_p): Move RVV V_REGS liveness computation into analyze_loop_vinfo.
(has_unexpected_spills_p): New function.
(costs::record_potential_unexpected_spills): Ditto.
(costs::better_main_loop_than_p): Move RVV V_REGS liveness computation into analyze_loop_vinfo.
* config/riscv/riscv-vector-costs.h: New functions and variables.
gcc/testsuite/ChangeLog:
* gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul-mixed-1.c: Robostify test.
* gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul1-1.c: Ditto.
* 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-lmul2-6.c: Ditto.
* gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul4-1.c: Ditto.
* gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul4-10.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/no-dynamic-lmul-1.c: Ditto.
* gcc.dg/vect/costmodel/riscv/rvv/pr111848.c: Ditto.
* gcc.dg/vect/costmodel/riscv/rvv/pr113112-1.c: Ditto.
---
gcc/config/riscv/riscv-vector-costs.cc | 110 +++++++++++-------
gcc/config/riscv/riscv-vector-costs.h | 8 ++
.../riscv/rvv/dynamic-lmul-mixed-1.c | 5 +-
.../costmodel/riscv/rvv/dynamic-lmul1-1.c | 5 +-
.../costmodel/riscv/rvv/dynamic-lmul1-2.c | 5 +-
.../costmodel/riscv/rvv/dynamic-lmul1-3.c | 5 +-
.../costmodel/riscv/rvv/dynamic-lmul1-4.c | 5 +-
.../costmodel/riscv/rvv/dynamic-lmul1-5.c | 5 +-
.../costmodel/riscv/rvv/dynamic-lmul1-6.c | 5 +-
.../costmodel/riscv/rvv/dynamic-lmul1-7.c | 5 +-
.../costmodel/riscv/rvv/dynamic-lmul2-1.c | 5 +-
.../costmodel/riscv/rvv/dynamic-lmul2-2.c | 5 +-
.../costmodel/riscv/rvv/dynamic-lmul2-3.c | 5 +-
.../costmodel/riscv/rvv/dynamic-lmul2-4.c | 5 +-
.../costmodel/riscv/rvv/dynamic-lmul2-5.c | 5 +-
.../costmodel/riscv/rvv/dynamic-lmul2-6.c | 5 +-
.../costmodel/riscv/rvv/dynamic-lmul4-1.c | 5 +-
.../costmodel/riscv/rvv/dynamic-lmul4-10.c | 5 +-
.../costmodel/riscv/rvv/dynamic-lmul4-2.c | 5 +-
.../costmodel/riscv/rvv/dynamic-lmul4-3.c | 5 +-
.../costmodel/riscv/rvv/dynamic-lmul4-5.c | 5 +-
.../costmodel/riscv/rvv/dynamic-lmul4-6.c | 6 +-
.../costmodel/riscv/rvv/dynamic-lmul4-7.c | 5 +-
.../costmodel/riscv/rvv/dynamic-lmul4-8.c | 6 +-
.../costmodel/riscv/rvv/dynamic-lmul8-1.c | 5 +-
.../costmodel/riscv/rvv/dynamic-lmul8-10.c | 5 +-
.../costmodel/riscv/rvv/dynamic-lmul8-11.c | 5 +-
.../costmodel/riscv/rvv/dynamic-lmul8-2.c | 5 +-
.../costmodel/riscv/rvv/dynamic-lmul8-3.c | 5 +-
.../costmodel/riscv/rvv/dynamic-lmul8-4.c | 5 +-
.../costmodel/riscv/rvv/dynamic-lmul8-5.c | 5 +-
.../costmodel/riscv/rvv/dynamic-lmul8-6.c | 5 +-
.../costmodel/riscv/rvv/dynamic-lmul8-7.c | 5 +-
.../costmodel/riscv/rvv/dynamic-lmul8-8.c | 5 +-
.../costmodel/riscv/rvv/dynamic-lmul8-9.c | 5 +-
.../costmodel/riscv/rvv/no-dynamic-lmul-1.c | 2 +-
.../vect/costmodel/riscv/rvv/pr111848.c | 5 +-
.../vect/costmodel/riscv/rvv/pr113112-1.c | 5 +-
38 files changed, 113 insertions(+), 184 deletions(-)
Comments
LGTM :)
On Mon, Dec 25, 2023 at 5:18 PM Juzhe-Zhong <juzhe.zhong@rivai.ai> wrote:
>
> Currently, we compute RVV V_REGS liveness during better_main_loop_than_p which is not appropriate
> time to do that since we for example, when have the codes will finally pick LMUL = 8 vectorization
> factor, we compute liveness for LMUL = 8 multiple times which are redundant.
>
> Since we have leverage the current ARM SVE COST model:
>
> /* Do one-time initialization based on the vinfo. */
> loop_vec_info loop_vinfo = dyn_cast<loop_vec_info> (m_vinfo);
> if (!m_analyzed_vinfo)
> {
> if (loop_vinfo)
> analyze_loop_vinfo (loop_vinfo);
>
> m_analyzed_vinfo = true;
> }
>
> Analyze COST model only once for each cost model.
>
> So here we move dynamic LMUL liveness information into analyze_loop_vinfo.
>
> /* Do one-time initialization of the costs given that we're
> costing the loop vectorization described by LOOP_VINFO. */
> void
> costs::analyze_loop_vinfo (loop_vec_info loop_vinfo)
> {
> ...
>
> /* Detect whether the LOOP has unexpected spills. */
> record_potential_unexpected_spills (loop_vinfo);
> }
>
> So that we can avoid redundant computations and the current dynamic LMUL cost model flow is much
> more reasonable and consistent with others.
>
> Tested on RV32 and RV64 no regressions.
>
> gcc/ChangeLog:
>
> * config/riscv/riscv-vector-costs.cc (compute_estimated_lmul): Allow fractional vecrtor.
> (preferred_new_lmul_p): Move RVV V_REGS liveness computation into analyze_loop_vinfo.
> (has_unexpected_spills_p): New function.
> (costs::record_potential_unexpected_spills): Ditto.
> (costs::better_main_loop_than_p): Move RVV V_REGS liveness computation into analyze_loop_vinfo.
> * config/riscv/riscv-vector-costs.h: New functions and variables.
>
> gcc/testsuite/ChangeLog:
>
> * gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul-mixed-1.c: Robostify test.
> * gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul1-1.c: Ditto.
> * 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-lmul2-6.c: Ditto.
> * gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul4-1.c: Ditto.
> * gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul4-10.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/no-dynamic-lmul-1.c: Ditto.
> * gcc.dg/vect/costmodel/riscv/rvv/pr111848.c: Ditto.
> * gcc.dg/vect/costmodel/riscv/rvv/pr113112-1.c: Ditto.
>
> ---
> gcc/config/riscv/riscv-vector-costs.cc | 110 +++++++++++-------
> gcc/config/riscv/riscv-vector-costs.h | 8 ++
> .../riscv/rvv/dynamic-lmul-mixed-1.c | 5 +-
> .../costmodel/riscv/rvv/dynamic-lmul1-1.c | 5 +-
> .../costmodel/riscv/rvv/dynamic-lmul1-2.c | 5 +-
> .../costmodel/riscv/rvv/dynamic-lmul1-3.c | 5 +-
> .../costmodel/riscv/rvv/dynamic-lmul1-4.c | 5 +-
> .../costmodel/riscv/rvv/dynamic-lmul1-5.c | 5 +-
> .../costmodel/riscv/rvv/dynamic-lmul1-6.c | 5 +-
> .../costmodel/riscv/rvv/dynamic-lmul1-7.c | 5 +-
> .../costmodel/riscv/rvv/dynamic-lmul2-1.c | 5 +-
> .../costmodel/riscv/rvv/dynamic-lmul2-2.c | 5 +-
> .../costmodel/riscv/rvv/dynamic-lmul2-3.c | 5 +-
> .../costmodel/riscv/rvv/dynamic-lmul2-4.c | 5 +-
> .../costmodel/riscv/rvv/dynamic-lmul2-5.c | 5 +-
> .../costmodel/riscv/rvv/dynamic-lmul2-6.c | 5 +-
> .../costmodel/riscv/rvv/dynamic-lmul4-1.c | 5 +-
> .../costmodel/riscv/rvv/dynamic-lmul4-10.c | 5 +-
> .../costmodel/riscv/rvv/dynamic-lmul4-2.c | 5 +-
> .../costmodel/riscv/rvv/dynamic-lmul4-3.c | 5 +-
> .../costmodel/riscv/rvv/dynamic-lmul4-5.c | 5 +-
> .../costmodel/riscv/rvv/dynamic-lmul4-6.c | 6 +-
> .../costmodel/riscv/rvv/dynamic-lmul4-7.c | 5 +-
> .../costmodel/riscv/rvv/dynamic-lmul4-8.c | 6 +-
> .../costmodel/riscv/rvv/dynamic-lmul8-1.c | 5 +-
> .../costmodel/riscv/rvv/dynamic-lmul8-10.c | 5 +-
> .../costmodel/riscv/rvv/dynamic-lmul8-11.c | 5 +-
> .../costmodel/riscv/rvv/dynamic-lmul8-2.c | 5 +-
> .../costmodel/riscv/rvv/dynamic-lmul8-3.c | 5 +-
> .../costmodel/riscv/rvv/dynamic-lmul8-4.c | 5 +-
> .../costmodel/riscv/rvv/dynamic-lmul8-5.c | 5 +-
> .../costmodel/riscv/rvv/dynamic-lmul8-6.c | 5 +-
> .../costmodel/riscv/rvv/dynamic-lmul8-7.c | 5 +-
> .../costmodel/riscv/rvv/dynamic-lmul8-8.c | 5 +-
> .../costmodel/riscv/rvv/dynamic-lmul8-9.c | 5 +-
> .../costmodel/riscv/rvv/no-dynamic-lmul-1.c | 2 +-
> .../vect/costmodel/riscv/rvv/pr111848.c | 5 +-
> .../vect/costmodel/riscv/rvv/pr113112-1.c | 5 +-
> 38 files changed, 113 insertions(+), 184 deletions(-)
>
> diff --git a/gcc/config/riscv/riscv-vector-costs.cc b/gcc/config/riscv/riscv-vector-costs.cc
> index 946eb4a9fc6..7b837b08f9e 100644
> --- a/gcc/config/riscv/riscv-vector-costs.cc
> +++ b/gcc/config/riscv/riscv-vector-costs.cc
> @@ -390,14 +390,13 @@ non_contiguous_memory_access_p (stmt_vec_info stmt_info)
>
> /* Return the LMUL of the current analysis. */
> static int
> -compute_estimated_lmul (loop_vec_info other_loop_vinfo, machine_mode mode)
> +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 (other_loop_vinfo->vector_mode);
> - if (known_eq (LOOP_VINFO_SLP_UNROLLING_FACTOR (other_loop_vinfo), 1U))
> + int regno_alignment = riscv_get_v_regno_alignment (loop_vinfo->vector_mode);
> + if (known_eq (LOOP_VINFO_SLP_UNROLLING_FACTOR (loop_vinfo), 1U))
> {
> - int estimated_vf = vect_vf_for_cost (other_loop_vinfo);
> + int estimated_vf = vect_vf_for_cost (loop_vinfo);
> return estimated_vf * GET_MODE_BITSIZE (mode).to_constant ()
> / TARGET_MIN_VLEN;
> }
> @@ -407,12 +406,11 @@ compute_estimated_lmul (loop_vec_info other_loop_vinfo, machine_mode mode)
> {
> int ratio;
> if (can_div_trunc_p (BYTES_PER_RISCV_VECTOR,
> - LOOP_VINFO_SLP_UNROLLING_FACTOR (other_loop_vinfo),
> + LOOP_VINFO_SLP_UNROLLING_FACTOR (loop_vinfo),
> &ratio))
> return TARGET_MAX_LMUL / ratio;
> - else
> - gcc_unreachable ();
> }
> + return 0;
> }
>
> /* Update the live ranges according PHI.
> @@ -576,14 +574,17 @@ update_local_live_ranges (
> }
> }
>
> -/* Return true that the LMUL of new COST model is preferred. */
> +/* Compute the maximum live V_REGS. */
> static bool
> -preferred_new_lmul_p (loop_vec_info other_loop_vinfo)
> +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;
> - compute_local_program_points (other_loop_vinfo, program_points_per_bb);
> + compute_local_program_points (loop_vinfo, program_points_per_bb);
>
> /* Compute local live ranges. */
> hash_map<basic_block, hash_map<tree, pair>> live_ranges_per_bb;
> @@ -591,34 +592,38 @@ preferred_new_lmul_p (loop_vec_info other_loop_vinfo)
> = compute_local_live_ranges (program_points_per_bb, live_ranges_per_bb);
>
> /* Update live ranges according to PHI. */
> - update_local_live_ranges (other_loop_vinfo, program_points_per_bb,
> + update_local_live_ranges (loop_vinfo, program_points_per_bb,
> live_ranges_per_bb, &biggest_mode);
>
> - int lmul = compute_estimated_lmul (other_loop_vinfo, biggest_mode);
> + int lmul = compute_estimated_lmul (loop_vinfo, biggest_mode);
> /* TODO: We calculate the maximum live vars base on current STMTS
> sequence. We can support live range shrink if it can give us
> big improvement in the future. */
> - if (!live_ranges_per_bb.is_empty ())
> + if (lmul > RVV_M1)
> {
> - unsigned int max_nregs = 0;
> - for (hash_map<basic_block, hash_map<tree, pair>>::iterator iter
> - = live_ranges_per_bb.begin ();
> - iter != live_ranges_per_bb.end (); ++iter)
> + if (!live_ranges_per_bb.is_empty ())
> {
> - basic_block bb = (*iter).first;
> - unsigned int max_point
> - = (*program_points_per_bb.get (bb)).length () + 1;
> - if ((*iter).second.is_empty ())
> - continue;
> - /* We prefer larger LMUL unless it causes register spillings. */
> - unsigned int nregs
> - = max_number_of_live_regs (bb, (*iter).second, max_point,
> - biggest_mode, lmul);
> - if (nregs > max_nregs)
> - max_nregs = nregs;
> + unsigned int max_nregs = 0;
> + for (hash_map<basic_block, hash_map<tree, pair>>::iterator iter
> + = live_ranges_per_bb.begin ();
> + iter != live_ranges_per_bb.end (); ++iter)
> + {
> + basic_block bb = (*iter).first;
> + unsigned int max_point
> + = (*program_points_per_bb.get (bb)).length () + 1;
> + if ((*iter).second.is_empty ())
> + continue;
> + /* We prefer larger LMUL unless it causes register spillings. */
> + unsigned int nregs
> + = max_number_of_live_regs (bb, (*iter).second, max_point,
> + biggest_mode, lmul);
> + if (nregs > max_nregs)
> + max_nregs = nregs;
> + }
> + live_ranges_per_bb.empty ();
> + if (max_nregs > V_REG_NUM)
> + return true;
> }
> - live_ranges_per_bb.empty ();
> - return max_nregs > V_REG_NUM;
> }
> if (!program_points_per_bb.is_empty ())
> {
> @@ -632,7 +637,7 @@ preferred_new_lmul_p (loop_vec_info other_loop_vinfo)
> }
> program_points_per_bb.empty ();
> }
> - return lmul > RVV_M1;
> + return false;
> }
>
> costs::costs (vec_info *vinfo, bool costing_for_scalar)
> @@ -667,6 +672,25 @@ costs::analyze_loop_vinfo (loop_vec_info loop_vinfo)
> /* Detect whether we're vectorizing for VLA and should apply the unrolling
> heuristic described above m_unrolled_vls_niters. */
> record_potential_vls_unrolling (loop_vinfo);
> +
> + /* Detect whether the LOOP has unexpected spills. */
> + record_potential_unexpected_spills (loop_vinfo);
> +}
> +
> +/* Analyze the vectorized program stataments and use dynamic LMUL
> + heuristic to detect whether the loop has unexpected spills. */
> +void
> +costs::record_potential_unexpected_spills (loop_vec_info loop_vinfo)
> +{
> + if (riscv_autovec_lmul == RVV_DYNAMIC)
> + {
> + bool post_dom_available_p = dom_info_available_p (CDI_POST_DOMINATORS);
> + if (!post_dom_available_p)
> + calculate_dominance_info (CDI_POST_DOMINATORS);
> + m_has_unexpected_spills_p = has_unexpected_spills_p (loop_vinfo);
> + if (!post_dom_available_p)
> + free_dominance_info (CDI_POST_DOMINATORS);
> + }
> }
>
> /* Decide whether to use the unrolling heuristic described above
> @@ -762,19 +786,19 @@ costs::better_main_loop_than_p (const vector_costs *uncast_other) const
> return other_prefer_unrolled;
> }
> }
> -
> - if (!LOOP_VINFO_NITERS_KNOWN_P (this_loop_vinfo)
> - && riscv_autovec_lmul == RVV_DYNAMIC)
> + else if (riscv_autovec_lmul == RVV_DYNAMIC
> + && !LOOP_VINFO_NITERS_KNOWN_P (other_loop_vinfo))
> {
> - if (!riscv_v_ext_vector_mode_p (this_loop_vinfo->vector_mode))
> + if (other->m_has_unexpected_spills_p)
> + {
> + if (dump_enabled_p ())
> + dump_printf_loc (MSG_NOTE, vect_location,
> + "Preferring smaller LMUL loop because"
> + " it has unexpected spills\n");
> + return true;
> + }
> + else
> return false;
> - bool post_dom_available_p = dom_info_available_p (CDI_POST_DOMINATORS);
> - if (!post_dom_available_p)
> - calculate_dominance_info (CDI_POST_DOMINATORS);
> - bool preferred_p = preferred_new_lmul_p (other_loop_vinfo);
> - if (!post_dom_available_p)
> - free_dominance_info (CDI_POST_DOMINATORS);
> - return preferred_p;
> }
>
> return vector_costs::better_main_loop_than_p (other);
> diff --git a/gcc/config/riscv/riscv-vector-costs.h b/gcc/config/riscv/riscv-vector-costs.h
> index ff294a60aaf..ed7fff94d07 100644
> --- a/gcc/config/riscv/riscv-vector-costs.h
> +++ b/gcc/config/riscv/riscv-vector-costs.h
> @@ -92,6 +92,14 @@ private:
> void analyze_loop_vinfo (loop_vec_info);
> void record_potential_vls_unrolling (loop_vec_info);
> bool prefer_unrolled_loop () const;
> +
> + /* Analyze the vectorized program statements and compute the maximum live
> + V_REGS live at some program point if we enable dynamic LMUL cost model.
> +
> + It's true when LMUL of loop vectorization factor > 1 and has unexpected
> + V_REGS spills according to the analysis. */
> + bool m_has_unexpected_spills_p = false;
> + void record_potential_unexpected_spills (loop_vec_info);
> };
>
> } // namespace riscv_vector
> diff --git a/gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul-mixed-1.c b/gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul-mixed-1.c
> index 9e2c65110e8..e654fc6bf84 100644
> --- a/gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul-mixed-1.c
> +++ b/gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul-mixed-1.c
> @@ -44,7 +44,4 @@ foo (int32_t *__restrict a, int32_t *__restrict b, int32_t *__restrict c,
> /* { dg-final { scan-assembler {e32,m2} } } */
> /* { dg-final { scan-assembler {e32,m8} } } */
> /* { dg-final { scan-assembler-not {csrr} } } */
> -/* { dg-final { scan-tree-dump "Maximum lmul = 8" "vect" } } */
> -/* { dg-final { scan-tree-dump-times "Maximum lmul = 4" 1 "vect" } } */
> -/* { dg-final { scan-tree-dump "Maximum lmul = 2" "vect" } } */
> -/* { dg-final { scan-tree-dump-not "Maximum lmul = 1" "vect" } } */
> +/* { dg-final { scan-tree-dump-times "Preferring smaller LMUL loop because it has unexpected spills" 2 "vect" } } */
> diff --git a/gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul1-1.c b/gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul1-1.c
> index f0f6cd5a70f..76c47dde936 100644
> --- a/gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul1-1.c
> +++ b/gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul1-1.c
> @@ -85,7 +85,4 @@ foo (int32_t *__restrict a, int32_t *__restrict b, int32_t *__restrict c,
>
> /* { dg-final { scan-assembler {e32,m1} } } */
> /* { dg-final { scan-assembler-not {csrr} } } */
> -/* { dg-final { scan-tree-dump-times "Maximum lmul = 8" 1 "vect" } } */
> -/* { dg-final { scan-tree-dump-times "Maximum lmul = 4" 1 "vect" } } */
> -/* { dg-final { scan-tree-dump-times "Maximum lmul = 2" 1 "vect" } } */
> -/* { dg-final { scan-tree-dump-times "Maximum lmul = 1" 1 "vect" } } */
> +/* { dg-final { scan-tree-dump-times "Preferring smaller LMUL loop because it has unexpected spills" 3 "vect" } } */
> diff --git a/gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul1-2.c b/gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul1-2.c
> index 0db3cae754b..f2ca677f1b0 100644
> --- a/gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul1-2.c
> +++ b/gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul1-2.c
> @@ -57,7 +57,4 @@ foo (int32_t *__restrict a, int32_t *__restrict b, int32_t *__restrict c,
> /* FIXME: Choosing LMUL = 1 is not the optimal since it can be LMUL = 2 if we apply instruction scheduler. */
> /* { dg-final { scan-assembler {e32,m1} } } */
> /* { dg-final { scan-assembler-not {csrr} } } */
> -/* { dg-final { scan-tree-dump-times "Maximum lmul = 8" 1 "vect" } } */
> -/* { dg-final { scan-tree-dump-times "Maximum lmul = 4" 1 "vect" } } */
> -/* { dg-final { scan-tree-dump-times "Maximum lmul = 2" 1 "vect" } } */
> -/* { dg-final { scan-tree-dump-times "Maximum lmul = 1" 1 "vect" } } */
> +/* { dg-final { scan-tree-dump-times "Preferring smaller LMUL loop because it has unexpected spills" 3 "vect" } } */
> diff --git a/gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul1-3.c b/gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul1-3.c
> index e2511da135e..49553a39cb9 100644
> --- a/gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul1-3.c
> +++ b/gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul1-3.c
> @@ -85,7 +85,4 @@ foo (int8_t *__restrict a, int8_t *__restrict b, int8_t *__restrict c,
>
> /* { dg-final { scan-assembler {e8,m1} } } */
> /* { dg-final { scan-assembler-not {csrr} } } */
> -/* { dg-final { scan-tree-dump-times "Maximum lmul = 8" 1 "vect" } } */
> -/* { dg-final { scan-tree-dump-times "Maximum lmul = 4" 1 "vect" } } */
> -/* { dg-final { scan-tree-dump-times "Maximum lmul = 2" 1 "vect" } } */
> -/* { dg-final { scan-tree-dump "Maximum lmul = 1" "vect" } } */
> +/* { dg-final { scan-tree-dump-times "Preferring smaller LMUL loop because it has unexpected spills" 3 "vect" } } */
> diff --git a/gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul1-4.c b/gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul1-4.c
> index c1f0f1e50ef..6afbbf87683 100644
> --- a/gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul1-4.c
> +++ b/gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul1-4.c
> @@ -115,7 +115,4 @@ foo (int32_t *__restrict a, int32_t *__restrict b, int32_t *__restrict c,
>
> /* { dg-final { scan-assembler {e32,m1} } } */
> /* { dg-final { scan-assembler-not {csrr} } } */
> -/* { dg-final { scan-tree-dump-times "Maximum lmul = 8" 1 "vect" } } */
> -/* { dg-final { scan-tree-dump-times "Maximum lmul = 4" 1 "vect" } } */
> -/* { dg-final { scan-tree-dump-times "Maximum lmul = 2" 1 "vect" } } */
> -/* { dg-final { scan-tree-dump-times "Maximum lmul = 1" 1 "vect" } } */
> +/* { dg-final { scan-tree-dump-times "Preferring smaller LMUL loop because it has unexpected spills" 3 "vect" } } */
> diff --git a/gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul1-5.c b/gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul1-5.c
> index 1ce980306c0..9037187dd30 100644
> --- a/gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul1-5.c
> +++ b/gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul1-5.c
> @@ -143,7 +143,4 @@ foo (int32_t *__restrict a, int32_t *__restrict b, int32_t *__restrict c,
>
> /* { dg-final { scan-assembler {e32,m1} } } */
> /* { dg-final { scan-assembler-not {csrr} } } */
> -/* { dg-final { scan-tree-dump-times "Maximum lmul = 8" 1 "vect" } } */
> -/* { dg-final { scan-tree-dump-times "Maximum lmul = 4" 1 "vect" } } */
> -/* { dg-final { scan-tree-dump-times "Maximum lmul = 2" 1 "vect" } } */
> -/* { dg-final { scan-tree-dump-times "Maximum lmul = 1" 1 "vect" } } */
> +/* { dg-final { scan-tree-dump-times "Preferring smaller LMUL loop because it has unexpected spills" 3 "vect" } } */
> diff --git a/gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul1-6.c b/gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul1-6.c
> index f6be585b927..cabb5f54a93 100644
> --- a/gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul1-6.c
> +++ b/gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul1-6.c
> @@ -144,7 +144,4 @@ foo (int8_t *__restrict a, int8_t *__restrict b, int8_t *__restrict c,
>
> /* { dg-final { scan-assembler {e8,m1} } } */
> /* { dg-final { scan-assembler-not {csrr} } } */
> -/* { dg-final { scan-tree-dump-times "Maximum lmul = 8" 1 "vect" } } */
> -/* { dg-final { scan-tree-dump-times "Maximum lmul = 4" 1 "vect" } } */
> -/* { dg-final { scan-tree-dump-times "Maximum lmul = 2" 1 "vect" } } */
> -/* { dg-final { scan-tree-dump "Maximum lmul = 1" "vect" } } */
> +/* { dg-final { scan-tree-dump-times "Preferring smaller LMUL loop because it has unexpected spills" 3 "vect" } } */
> diff --git a/gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul1-7.c b/gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul1-7.c
> index 8e6610b0e11..b3902e2d4b3 100644
> --- a/gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul1-7.c
> +++ b/gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul1-7.c
> @@ -42,7 +42,4 @@ foo (int32_t *__restrict a, int32_t *__restrict b, int32_t *__restrict c,
>
> /* { dg-final { scan-assembler {e32,m1} } } */
> /* { dg-final { scan-assembler-not {csrr} } } */
> -/* { dg-final { scan-tree-dump-times "Maximum lmul = 8" 1 "vect" } } */
> -/* { dg-final { scan-tree-dump-times "Maximum lmul = 4" 1 "vect" } } */
> -/* { dg-final { scan-tree-dump-times "Maximum lmul = 2" 1 "vect" } } */
> -/* { dg-final { scan-tree-dump-times "Maximum lmul = 1" 1 "vect" } } */
> +/* { dg-final { scan-tree-dump-times "Preferring smaller LMUL loop because it has unexpected spills" 3 "vect" } } */
> diff --git a/gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul2-1.c b/gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul2-1.c
> index 81cb6954d49..2145cb86c43 100644
> --- a/gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul2-1.c
> +++ b/gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul2-1.c
> @@ -45,7 +45,4 @@ foo (int32_t *__restrict a, int32_t *__restrict b, int32_t *__restrict c,
>
> /* { dg-final { scan-assembler {e32,m2} } } */
> /* { dg-final { scan-assembler-not {csrr} } } */
> -/* { dg-final { scan-tree-dump-times "Maximum lmul = 8" 1 "vect" } } */
> -/* { dg-final { scan-tree-dump-times "Maximum lmul = 4" 1 "vect" } } */
> -/* { dg-final { scan-tree-dump "Maximum lmul = 2" "vect" } } */
> -/* { dg-final { scan-tree-dump-not "Maximum lmul = 1" "vect" } } */
> +/* { dg-final { scan-tree-dump-times "Preferring smaller LMUL loop because it has unexpected spills" 2 "vect" } } */
> diff --git a/gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul2-2.c b/gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul2-2.c
> index a0e2311c2e0..a5bf4b67a92 100644
> --- a/gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul2-2.c
> +++ b/gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul2-2.c
> @@ -45,7 +45,4 @@ foo (int8_t *__restrict a, int8_t *__restrict b, int8_t *__restrict c,
>
> /* { dg-final { scan-assembler {e8,m2} } } */
> /* { dg-final { scan-assembler-not {csrr} } } */
> -/* { dg-final { scan-tree-dump-times "Maximum lmul = 8" 1 "vect" } } */
> -/* { dg-final { scan-tree-dump-times "Maximum lmul = 4" 1 "vect" } } */
> -/* { dg-final { scan-tree-dump "Maximum lmul = 2" "vect" } } */
> -/* { dg-final { scan-tree-dump-not "Maximum lmul = 1" "vect" } } */
> +/* { dg-final { scan-tree-dump-times "Preferring smaller LMUL loop because it has unexpected spills" 2 "vect" } } */
> diff --git a/gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul2-3.c b/gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul2-3.c
> index 81cb6954d49..2145cb86c43 100644
> --- a/gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul2-3.c
> +++ b/gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul2-3.c
> @@ -45,7 +45,4 @@ foo (int32_t *__restrict a, int32_t *__restrict b, int32_t *__restrict c,
>
> /* { dg-final { scan-assembler {e32,m2} } } */
> /* { dg-final { scan-assembler-not {csrr} } } */
> -/* { dg-final { scan-tree-dump-times "Maximum lmul = 8" 1 "vect" } } */
> -/* { dg-final { scan-tree-dump-times "Maximum lmul = 4" 1 "vect" } } */
> -/* { dg-final { scan-tree-dump "Maximum lmul = 2" "vect" } } */
> -/* { dg-final { scan-tree-dump-not "Maximum lmul = 1" "vect" } } */
> +/* { dg-final { scan-tree-dump-times "Preferring smaller LMUL loop because it has unexpected spills" 2 "vect" } } */
> diff --git a/gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul2-4.c b/gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul2-4.c
> index 5169dcba846..6ed9eea5aa0 100644
> --- a/gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul2-4.c
> +++ b/gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul2-4.c
> @@ -43,7 +43,4 @@ foo (int32_t *__restrict a, int32_t *__restrict b, int32_t *__restrict c,
>
> /* { dg-final { scan-assembler {e32,m2} } } */
> /* { dg-final { scan-assembler-not {csrr} } } */
> -/* { dg-final { scan-tree-dump-times "Maximum lmul = 8" 1 "vect" } } */
> -/* { dg-final { scan-tree-dump-times "Maximum lmul = 4" 1 "vect" } } */
> -/* { dg-final { scan-tree-dump "Maximum lmul = 2" "vect" } } */
> -/* { dg-final { scan-tree-dump-not "Maximum lmul = 1" "vect" } } */
> +/* { dg-final { scan-tree-dump-times "Preferring smaller LMUL loop because it has unexpected spills" 2 "vect" } } */
> diff --git a/gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul2-5.c b/gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul2-5.c
> index 2bc4c6831fc..72c1cb49e7c 100644
> --- a/gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul2-5.c
> +++ b/gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul2-5.c
> @@ -46,7 +46,4 @@ foo (int32_t *__restrict a, int32_t *__restrict b, int32_t *__restrict c,
> /* { dg-final { scan-assembler {e32,m2} } } */
> /* { dg-final { scan-assembler {e8,m8} } } */
> /* { dg-final { scan-assembler-not {csrr} } } */
> -/* { dg-final { scan-tree-dump-times "Maximum lmul = 8" 1 "vect" } } */
> -/* { dg-final { scan-tree-dump-times "Maximum lmul = 4" 1 "vect" } } */
> -/* { dg-final { scan-tree-dump "Maximum lmul = 2" "vect" } } */
> -/* { dg-final { scan-tree-dump-not "Maximum lmul = 1" "vect" } } */
> +/* { dg-final { scan-tree-dump-times "Preferring smaller LMUL loop because it has unexpected spills" 2 "vect" } } */
> diff --git a/gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul2-6.c b/gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul2-6.c
> index c667ab78a3c..5eec2b0c4da 100644
> --- a/gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul2-6.c
> +++ b/gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul2-6.c
> @@ -48,7 +48,4 @@ foo (int32_t *__restrict a, int32_t *__restrict b, int32_t *__restrict c,
> /* { dg-final { scan-assembler {e32,m2} } } */
> /* { dg-final { scan-assembler {e8,m8} } } */
> /* { dg-final { scan-assembler-not {csrr} } } */
> -/* { dg-final { scan-tree-dump "Maximum lmul = 8" "vect" } } */
> -/* { dg-final { scan-tree-dump-times "Maximum lmul = 4" 1 "vect" } } */
> -/* { dg-final { scan-tree-dump "Maximum lmul = 2" "vect" } } */
> -/* { dg-final { scan-tree-dump-not "Maximum lmul = 1" "vect" } } */
> +/* { dg-final { scan-tree-dump-times "Preferring smaller LMUL loop because it has unexpected spills" 2 "vect" } } */
> diff --git a/gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul4-1.c b/gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul4-1.c
> index 28fc49a2252..a87ff6744f2 100644
> --- a/gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul4-1.c
> +++ b/gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul4-1.c
> @@ -29,7 +29,4 @@ foo (int32_t *__restrict a, int32_t *__restrict b, int32_t *__restrict c,
>
> /* { dg-final { scan-assembler {e32,m4} } } */
> /* { dg-final { scan-assembler-not {csrr} } } */
> -/* { dg-final { scan-tree-dump-times "Maximum lmul = 8" 1 "vect" } } */
> -/* { dg-final { scan-tree-dump "Maximum lmul = 4" "vect" } } */
> -/* { dg-final { scan-tree-dump-not "Maximum lmul = 2" "vect" } } */
> -/* { dg-final { scan-tree-dump-not "Maximum lmul = 1" "vect" } } */
> +/* { dg-final { scan-tree-dump-times "Preferring smaller LMUL loop because it has unexpected spills" 1 "vect" } } */
> diff --git a/gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul4-10.c b/gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul4-10.c
> index 74e629168f8..f3c2315c2c5 100644
> --- a/gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul4-10.c
> +++ b/gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul4-10.c
> @@ -20,7 +20,4 @@ bar (int *x, int a, int b, int n)
> /* { dg-final { scan-assembler {e32,m4} } } */
> /* { dg-final { scan-assembler-not {jr} } } */
> /* { dg-final { scan-assembler-times {ret} 2 } } *
> -/* { dg-final { scan-tree-dump-times "Maximum lmul = 8" 1 "vect" } } */
> -/* { dg-final { scan-tree-dump "Maximum lmul = 4" "vect" } } */
> -/* { dg-final { scan-tree-dump-not "Maximum lmul = 2" "vect" } } */
> -/* { dg-final { scan-tree-dump-not "Maximum lmul = 1" "vect" } } */
> +/* { dg-final { scan-tree-dump-times "Preferring smaller LMUL loop because it has unexpected spills" 1 "vect" } } */
> diff --git a/gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul4-2.c b/gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul4-2.c
> index 4b6bd85b4a8..3d7dc92db9b 100644
> --- a/gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul4-2.c
> +++ b/gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul4-2.c
> @@ -29,7 +29,4 @@ foo (int8_t *__restrict a, int8_t *__restrict b, int8_t *__restrict c,
>
> /* { dg-final { scan-assembler {e8,m4} } } */
> /* { dg-final { scan-assembler-not {csrr} } } */
> -/* { dg-final { scan-tree-dump-times "Maximum lmul = 8" 1 "vect" } } */
> -/* { dg-final { scan-tree-dump "Maximum lmul = 4" "vect" } } */
> -/* { dg-final { scan-tree-dump-not "Maximum lmul = 2" "vect" } } */
> -/* { dg-final { scan-tree-dump-not "Maximum lmul = 1" "vect" } } */
> +/* { dg-final { scan-tree-dump-times "Preferring smaller LMUL loop because it has unexpected spills" 1 "vect" } } */
> diff --git a/gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul4-3.c b/gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul4-3.c
> index c61c53be803..09eacca1a2c 100644
> --- a/gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul4-3.c
> +++ b/gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul4-3.c
> @@ -41,7 +41,4 @@ void foo2 (int64_t *__restrict a,
>
> /* { dg-final { scan-assembler {e64,m4} } } */
> /* { dg-final { scan-assembler-not {csrr} } } */
> -/* { dg-final { scan-tree-dump-times "Maximum lmul = 8" 1 "vect" } } */
> -/* { dg-final { scan-tree-dump "Maximum lmul = 4" "vect" } } */
> -/* { dg-final { scan-tree-dump-not "Maximum lmul = 2" "vect" } } */
> -/* { dg-final { scan-tree-dump-not "Maximum lmul = 1" "vect" } } */
> +/* { dg-final { scan-tree-dump-times "Preferring smaller LMUL loop because it has unexpected spills" 1 "vect" } } */
> diff --git a/gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul4-5.c b/gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul4-5.c
> index 1df1cca5e43..88f58446aba 100644
> --- a/gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul4-5.c
> +++ b/gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul4-5.c
> @@ -41,7 +41,4 @@ void foo2 (int16_t *__restrict a,
>
> /* { dg-final { scan-assembler {e16,m2} } } */
> /* { dg-final { scan-assembler-not {csrr} } } */
> -/* { dg-final { scan-tree-dump-times "Maximum lmul = 8" 1 "vect" } } */
> -/* { dg-final { scan-tree-dump "Maximum lmul = 4" "vect" } } */
> -/* { dg-final { scan-tree-dump-not "Maximum lmul = 2" "vect" } } */
> -/* { dg-final { scan-tree-dump-not "Maximum lmul = 1" "vect" } } */
> +/* { dg-final { scan-tree-dump-times "Preferring smaller LMUL loop because it has unexpected spills" 1 "vect" } } */
> diff --git a/gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul4-6.c b/gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul4-6.c
> index 0abbdb61493..aa4f4b170f0 100644
> --- a/gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul4-6.c
> +++ b/gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul4-6.c
> @@ -21,7 +21,5 @@ foo (uint8_t *restrict a, uint8_t *restrict b, int n)
>
> /* { dg-final { scan-assembler {e8,m4} } } */
> /* { dg-final { scan-assembler-times {csrr} 1 } } */
> -/* { dg-final { scan-tree-dump-not "Maximum lmul = 8" "vect" } } */
> -/* { dg-final { scan-tree-dump "Maximum lmul = 4" "vect" } } */
> -/* { dg-final { scan-tree-dump-not "Maximum lmul = 2" "vect" } } */
> -/* { dg-final { scan-tree-dump-not "Maximum lmul = 1" "vect" } } */
> +/* Since we don't support VLA SLP for LMUL = 8, dynamic LMUL cost model start from LMUL = 4. */
> +/* { dg-final { scan-tree-dump-not "Preferring smaller LMUL loop because it has unexpected spills" "vect" } } */
> diff --git a/gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul4-7.c b/gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul4-7.c
> index e4769df316a..0606320f50a 100644
> --- a/gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul4-7.c
> +++ b/gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul4-7.c
> @@ -41,7 +41,4 @@ void foo2 (int8_t *__restrict a,
>
> /* { dg-final { scan-assembler {e64,m4} } } */
> /* { dg-final { scan-assembler-not {csrr} } } */
> -/* { dg-final { scan-tree-dump-times "Maximum lmul = 8" 1 "vect" } } */
> -/* { dg-final { scan-tree-dump "Maximum lmul = 4" "vect" } } */
> -/* { dg-final { scan-tree-dump-not "Maximum lmul = 2" "vect" } } */
> -/* { dg-final { scan-tree-dump-not "Maximum lmul = 1" "vect" } } */
> +/* { dg-final { scan-tree-dump-times "Preferring smaller LMUL loop because it has unexpected spills" 1 "vect" } } */
> diff --git a/gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul4-8.c b/gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul4-8.c
> index 6d2a5647428..717cce97304 100644
> --- a/gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul4-8.c
> +++ b/gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul4-8.c
> @@ -30,7 +30,5 @@ foo (uint8_t *restrict a, uint8_t *restrict b, int n)
>
> /* { dg-final { scan-assembler {e8,m4} } } */
> /* { dg-final { scan-assembler-times {csrr} 1 } } */
> -/* { dg-final { scan-tree-dump-not "Maximum lmul = 8" "vect" } } */
> -/* { dg-final { scan-tree-dump "Maximum lmul = 4" "vect" } } */
> -/* { dg-final { scan-tree-dump-not "Maximum lmul = 2" "vect" } } */
> -/* { dg-final { scan-tree-dump-not "Maximum lmul = 1" "vect" } } */
> +/* Since we don't support VLA SLP for LMUL = 8, dynamic LMUL cost model start from LMUL = 4. */
> +/* { dg-final { scan-tree-dump-not "Preferring smaller LMUL loop because it has unexpected spills" "vect" } } */
> diff --git a/gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul8-1.c b/gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul8-1.c
> index 31ee58a4b13..7eda6b0f123 100644
> --- a/gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul8-1.c
> +++ b/gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul8-1.c
> @@ -12,7 +12,4 @@ foo (int32_t *__restrict a, int32_t *__restrict b, int n)
>
> /* { dg-final { scan-assembler {e32,m8} } } */
> /* { dg-final { scan-assembler-not {csrr} } } */
> -/* { dg-final { scan-tree-dump "Maximum lmul = 8" "vect" } } */
> -/* { dg-final { scan-tree-dump-not "Maximum lmul = 4" "vect" } } */
> -/* { dg-final { scan-tree-dump-not "Maximum lmul = 2" "vect" } } */
> -/* { dg-final { scan-tree-dump-not "Maximum lmul = 1" "vect" } } */
> +/* { dg-final { scan-tree-dump-not "Preferring smaller LMUL loop because it has unexpected spills" "vect" } } */
> diff --git a/gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul8-10.c b/gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul8-10.c
> index d767d2726a6..b0f8f8f0dac 100644
> --- a/gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul8-10.c
> +++ b/gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul8-10.c
> @@ -16,7 +16,4 @@ foo (int *x, int n, int res)
>
> /* { dg-final { scan-assembler {e32,m8} } } */
> /* { dg-final { scan-assembler-times {csrr} 1 } } */
> -/* { dg-final { scan-tree-dump "Maximum lmul = 8" "vect" } } */
> -/* { dg-final { scan-tree-dump-not "Maximum lmul = 4" "vect" } } */
> -/* { dg-final { scan-tree-dump-not "Maximum lmul = 2" "vect" } } */
> -/* { dg-final { scan-tree-dump-not "Maximum lmul = 1" "vect" } } */
> +/* { dg-final { scan-tree-dump-not "Preferring smaller LMUL loop because it has unexpected spills" "vect" } } */
> diff --git a/gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul8-11.c b/gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul8-11.c
> index 01c976dd67b..3b37c8928cc 100644
> --- a/gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul8-11.c
> +++ b/gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul8-11.c
> @@ -41,7 +41,4 @@ void foo2 (int64_t *__restrict a,
>
> /* { dg-final { scan-assembler {e64,m8} } } */
> /* { dg-final { scan-assembler-not {csrr} } } */
> -/* { dg-final { scan-tree-dump "Maximum lmul = 8" "vect" } } */
> -/* { dg-final { scan-tree-dump-not "Maximum lmul = 4" "vect" } } */
> -/* { dg-final { scan-tree-dump-not "Maximum lmul = 2" "vect" } } */
> -/* { dg-final { scan-tree-dump-not "Maximum lmul = 1" "vect" } } */
> +/* { dg-final { scan-tree-dump-not "Preferring smaller LMUL loop because it has unexpected spills" "vect" } } */
> diff --git a/gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul8-2.c b/gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul8-2.c
> index 4fa6d2f5b28..802a4dddfaf 100644
> --- a/gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul8-2.c
> +++ b/gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul8-2.c
> @@ -12,7 +12,4 @@ foo (int32_t *__restrict a, int16_t *__restrict b, int n)
>
> /* { dg-final { scan-assembler {e16,m4} } } */
> /* { dg-final { scan-assembler-not {csrr} } } */
> -/* { dg-final { scan-tree-dump "Maximum lmul = 8" "vect" } } */
> -/* { dg-final { scan-tree-dump-not "Maximum lmul = 4" "vect" } } */
> -/* { dg-final { scan-tree-dump-not "Maximum lmul = 2" "vect" } } */
> -/* { dg-final { scan-tree-dump-not "Maximum lmul = 1" "vect" } } */
> +/* { dg-final { scan-tree-dump-not "Preferring smaller LMUL loop because it has unexpected spills" "vect" } } */
> diff --git a/gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul8-3.c b/gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul8-3.c
> index c9f4fbca0d8..b55863de54c 100644
> --- a/gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul8-3.c
> +++ b/gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul8-3.c
> @@ -12,7 +12,4 @@ foo (int8_t *__restrict a, int8_t *__restrict b, int n)
>
> /* { dg-final { scan-assembler {e8,m8} } } */
> /* { dg-final { scan-assembler-not {csrr} } } */
> -/* { dg-final { scan-tree-dump "Maximum lmul = 8" "vect" } } */
> -/* { dg-final { scan-tree-dump-not "Maximum lmul = 4" "vect" } } */
> -/* { dg-final { scan-tree-dump-not "Maximum lmul = 2" "vect" } } */
> -/* { dg-final { scan-tree-dump-not "Maximum lmul = 1" "vect" } } */
> +/* { dg-final { scan-tree-dump-not "Preferring smaller LMUL loop because it has unexpected spills" "vect" } } */
> diff --git a/gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul8-4.c b/gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul8-4.c
> index e6d1b167041..faa4428eb26 100644
> --- a/gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul8-4.c
> +++ b/gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul8-4.c
> @@ -13,7 +13,4 @@ foo (size_t *__restrict a, size_t *__restrict b, int n)
>
> /* { dg-final { scan-assembler {e64,m8} } } */
> /* { dg-final { scan-assembler-not {csrr} } } */
> -/* { dg-final { scan-tree-dump "Maximum lmul = 8" "vect" } } */
> -/* { dg-final { scan-tree-dump-not "Maximum lmul = 4" "vect" } } */
> -/* { dg-final { scan-tree-dump-not "Maximum lmul = 2" "vect" } } */
> -/* { dg-final { scan-tree-dump-not "Maximum lmul = 1" "vect" } } */
> +/* { dg-final { scan-tree-dump-not "Preferring smaller LMUL loop because it has unexpected spills" "vect" } } */
> diff --git a/gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul8-5.c b/gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul8-5.c
> index 3276585bacd..944c2395163 100644
> --- a/gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul8-5.c
> +++ b/gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul8-5.c
> @@ -19,7 +19,4 @@ foo (int8_t *__restrict a, int8_t *__restrict b, int n)
>
> /* { dg-final { scan-assembler {e8,m8} } } */
> /* { dg-final { scan-assembler-not {csrr} } } */
> -/* { dg-final { scan-tree-dump "Maximum lmul = 8" "vect" } } */
> -/* { dg-final { scan-tree-dump-not "Maximum lmul = 4" "vect" } } */
> -/* { dg-final { scan-tree-dump-not "Maximum lmul = 2" "vect" } } */
> -/* { dg-final { scan-tree-dump-not "Maximum lmul = 1" "vect" } } */
> +/* { dg-final { scan-tree-dump-not "Preferring smaller LMUL loop because it has unexpected spills" "vect" } } */
> diff --git a/gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul8-6.c b/gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul8-6.c
> index 918b47f301a..2aeb7dfa73f 100644
> --- a/gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul8-6.c
> +++ b/gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul8-6.c
> @@ -17,7 +17,4 @@ foo (int8_t *__restrict a, int8_t *__restrict b, int8_t *__restrict a2,
>
> /* { dg-final { scan-assembler {e8,m8} } } */
> /* { dg-final { scan-assembler-not {csrr} } } */
> -/* { dg-final { scan-tree-dump "Maximum lmul = 8" "vect" } } */
> -/* { dg-final { scan-tree-dump-not "Maximum lmul = 4" "vect" } } */
> -/* { dg-final { scan-tree-dump-not "Maximum lmul = 2" "vect" } } */
> -/* { dg-final { scan-tree-dump-not "Maximum lmul = 1" "vect" } } */
> +/* { dg-final { scan-tree-dump-not "Preferring smaller LMUL loop because it has unexpected spills" "vect" } } */
> diff --git a/gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul8-7.c b/gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul8-7.c
> index b0fb62aebb0..37757c81d79 100644
> --- a/gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul8-7.c
> +++ b/gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul8-7.c
> @@ -17,7 +17,4 @@ foo (int32_t *__restrict a, int32_t *__restrict b, int32_t *__restrict a2,
>
> /* { dg-final { scan-assembler {e32,m8} } } */
> /* { dg-final { scan-assembler-not {csrr} } } */
> -/* { dg-final { scan-tree-dump "Maximum lmul = 8" "vect" } } */
> -/* { dg-final { scan-tree-dump-not "Maximum lmul = 4" "vect" } } */
> -/* { dg-final { scan-tree-dump-not "Maximum lmul = 2" "vect" } } */
> -/* { dg-final { scan-tree-dump-not "Maximum lmul = 1" "vect" } } */
> +/* { dg-final { scan-tree-dump-not "Preferring smaller LMUL loop because it has unexpected spills" "vect" } } */
> diff --git a/gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul8-8.c b/gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul8-8.c
> index d64c30ae114..90ccbf15be3 100644
> --- a/gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul8-8.c
> +++ b/gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul8-8.c
> @@ -13,7 +13,4 @@ foo (int8_t *__restrict a, int8_t init, int n)
>
> /* { dg-final { scan-assembler {e8,m8} } } */
> /* { dg-final { scan-assembler-not {csrr} } } */
> -/* { dg-final { scan-tree-dump "Maximum lmul = 8" "vect" } } */
> -/* { dg-final { scan-tree-dump-not "Maximum lmul = 4" "vect" } } */
> -/* { dg-final { scan-tree-dump-not "Maximum lmul = 2" "vect" } } */
> -/* { dg-final { scan-tree-dump-not "Maximum lmul = 1" "vect" } } */
> +/* { dg-final { scan-tree-dump-not "Preferring smaller LMUL loop because it has unexpected spills" "vect" } } */
> diff --git a/gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul8-9.c b/gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul8-9.c
> index 2cf7de44e44..7ad5799c10f 100644
> --- a/gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul8-9.c
> +++ b/gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/dynamic-lmul8-9.c
> @@ -13,7 +13,4 @@ foo (int64_t *__restrict a, int64_t init, int n)
>
> /* { dg-final { scan-assembler {e64,m8} } } */
> /* { dg-final { scan-assembler-not {csrr} } } */
> -/* { dg-final { scan-tree-dump "Maximum lmul = 8" "vect" } } */
> -/* { dg-final { scan-tree-dump-not "Maximum lmul = 4" "vect" } } */
> -/* { dg-final { scan-tree-dump-not "Maximum lmul = 2" "vect" } } */
> -/* { dg-final { scan-tree-dump-not "Maximum lmul = 1" "vect" } } */
> +/* { dg-final { scan-tree-dump-not "Preferring smaller LMUL loop because it has unexpected spills" "vect" } } */
> diff --git a/gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/no-dynamic-lmul-1.c b/gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/no-dynamic-lmul-1.c
> index 7b5e9eb2476..6752f254fee 100644
> --- a/gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/no-dynamic-lmul-1.c
> +++ b/gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/no-dynamic-lmul-1.c
> @@ -59,6 +59,6 @@ foo8 (int64_t *restrict a)
> a[i] = a[i]-16;
> }
>
> -/* { dg-final { scan-tree-dump-not "Maximum lmul" "vect" } } */
> +/* { dg-final { scan-tree-dump-not "Preferring smaller LMUL loop because it has unexpected spills" "vect" } } */
> /* { dg-final { scan-assembler-times {vsetvli} 4 } } */
> /* { dg-final { scan-assembler-times {vsetivli} 4 } } */
> diff --git a/gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/pr111848.c b/gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/pr111848.c
> index 533f6d6dec9..5a673f509f4 100644
> --- a/gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/pr111848.c
> +++ b/gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/pr111848.c
> @@ -31,7 +31,4 @@ f3 (uint8_t *restrict a, uint8_t *restrict b,
> /* { dg-final { scan-assembler {e8,m4} } } */
> /* { dg-final { scan-assembler-not {jr} } } */
> /* { dg-final { scan-assembler-times {ret} 1 } } */
> -/* { dg-final { scan-tree-dump-not "Maximum lmul = 8" "vect" } } */
> -/* { dg-final { scan-tree-dump "Maximum lmul = 4" "vect" } } */
> -/* { dg-final { scan-tree-dump-not "Maximum lmul = 2" "vect" } } */
> -/* { dg-final { scan-tree-dump-not "Maximum lmul = 1" "vect" } } */
> +/* { dg-final { scan-tree-dump-not "Preferring smaller LMUL loop because it has unexpected spills" "vect" } } */
> diff --git a/gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/pr113112-1.c b/gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/pr113112-1.c
> index 31b41ba707e..cd0fe19b98d 100644
> --- a/gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/pr113112-1.c
> +++ b/gcc/testsuite/gcc.dg/vect/costmodel/riscv/rvv/pr113112-1.c
> @@ -23,10 +23,7 @@ foo (int n){
> /* { dg-final { scan-assembler {e32,m4} } } */
> /* { dg-final { scan-assembler-not {jr} } } */
> /* { dg-final { scan-assembler-times {ret} 1 } } */
> -/* { dg-final { scan-tree-dump "Maximum lmul = 8" "vect" } } */
> -/* { dg-final { scan-tree-dump "Maximum lmul = 4" "vect" } } */
> -/* { dg-final { scan-tree-dump-not "Maximum lmul = 2" "vect" } } */
> -/* { dg-final { scan-tree-dump-not "Maximum lmul = 1" "vect" } } */
> +/* { dg-final { scan-tree-dump-times "Preferring smaller LMUL loop because it has unexpected spills" 1 "vect" } } */
> /* { dg-final { scan-tree-dump "At most 8 number of live V_REG at program point 0 for bb 4" "vect" } } */
> /* { dg-final { scan-tree-dump "At most 40 number of live V_REG at program point 0 for bb 3" "vect" } } */
> /* { dg-final { scan-tree-dump "At most 8 number of live V_REG at program point 0 for bb 5" "vect" } } */
> --
> 2.36.3
>
@@ -390,14 +390,13 @@ non_contiguous_memory_access_p (stmt_vec_info stmt_info)
/* Return the LMUL of the current analysis. */
static int
-compute_estimated_lmul (loop_vec_info other_loop_vinfo, machine_mode mode)
+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 (other_loop_vinfo->vector_mode);
- if (known_eq (LOOP_VINFO_SLP_UNROLLING_FACTOR (other_loop_vinfo), 1U))
+ int regno_alignment = riscv_get_v_regno_alignment (loop_vinfo->vector_mode);
+ if (known_eq (LOOP_VINFO_SLP_UNROLLING_FACTOR (loop_vinfo), 1U))
{
- int estimated_vf = vect_vf_for_cost (other_loop_vinfo);
+ int estimated_vf = vect_vf_for_cost (loop_vinfo);
return estimated_vf * GET_MODE_BITSIZE (mode).to_constant ()
/ TARGET_MIN_VLEN;
}
@@ -407,12 +406,11 @@ compute_estimated_lmul (loop_vec_info other_loop_vinfo, machine_mode mode)
{
int ratio;
if (can_div_trunc_p (BYTES_PER_RISCV_VECTOR,
- LOOP_VINFO_SLP_UNROLLING_FACTOR (other_loop_vinfo),
+ LOOP_VINFO_SLP_UNROLLING_FACTOR (loop_vinfo),
&ratio))
return TARGET_MAX_LMUL / ratio;
- else
- gcc_unreachable ();
}
+ return 0;
}
/* Update the live ranges according PHI.
@@ -576,14 +574,17 @@ update_local_live_ranges (
}
}
-/* Return true that the LMUL of new COST model is preferred. */
+/* Compute the maximum live V_REGS. */
static bool
-preferred_new_lmul_p (loop_vec_info other_loop_vinfo)
+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;
- compute_local_program_points (other_loop_vinfo, program_points_per_bb);
+ compute_local_program_points (loop_vinfo, program_points_per_bb);
/* Compute local live ranges. */
hash_map<basic_block, hash_map<tree, pair>> live_ranges_per_bb;
@@ -591,34 +592,38 @@ preferred_new_lmul_p (loop_vec_info other_loop_vinfo)
= compute_local_live_ranges (program_points_per_bb, live_ranges_per_bb);
/* Update live ranges according to PHI. */
- update_local_live_ranges (other_loop_vinfo, program_points_per_bb,
+ update_local_live_ranges (loop_vinfo, program_points_per_bb,
live_ranges_per_bb, &biggest_mode);
- int lmul = compute_estimated_lmul (other_loop_vinfo, biggest_mode);
+ int lmul = compute_estimated_lmul (loop_vinfo, biggest_mode);
/* TODO: We calculate the maximum live vars base on current STMTS
sequence. We can support live range shrink if it can give us
big improvement in the future. */
- if (!live_ranges_per_bb.is_empty ())
+ if (lmul > RVV_M1)
{
- unsigned int max_nregs = 0;
- for (hash_map<basic_block, hash_map<tree, pair>>::iterator iter
- = live_ranges_per_bb.begin ();
- iter != live_ranges_per_bb.end (); ++iter)
+ if (!live_ranges_per_bb.is_empty ())
{
- basic_block bb = (*iter).first;
- unsigned int max_point
- = (*program_points_per_bb.get (bb)).length () + 1;
- if ((*iter).second.is_empty ())
- continue;
- /* We prefer larger LMUL unless it causes register spillings. */
- unsigned int nregs
- = max_number_of_live_regs (bb, (*iter).second, max_point,
- biggest_mode, lmul);
- if (nregs > max_nregs)
- max_nregs = nregs;
+ unsigned int max_nregs = 0;
+ for (hash_map<basic_block, hash_map<tree, pair>>::iterator iter
+ = live_ranges_per_bb.begin ();
+ iter != live_ranges_per_bb.end (); ++iter)
+ {
+ basic_block bb = (*iter).first;
+ unsigned int max_point
+ = (*program_points_per_bb.get (bb)).length () + 1;
+ if ((*iter).second.is_empty ())
+ continue;
+ /* We prefer larger LMUL unless it causes register spillings. */
+ unsigned int nregs
+ = max_number_of_live_regs (bb, (*iter).second, max_point,
+ biggest_mode, lmul);
+ if (nregs > max_nregs)
+ max_nregs = nregs;
+ }
+ live_ranges_per_bb.empty ();
+ if (max_nregs > V_REG_NUM)
+ return true;
}
- live_ranges_per_bb.empty ();
- return max_nregs > V_REG_NUM;
}
if (!program_points_per_bb.is_empty ())
{
@@ -632,7 +637,7 @@ preferred_new_lmul_p (loop_vec_info other_loop_vinfo)
}
program_points_per_bb.empty ();
}
- return lmul > RVV_M1;
+ return false;
}
costs::costs (vec_info *vinfo, bool costing_for_scalar)
@@ -667,6 +672,25 @@ costs::analyze_loop_vinfo (loop_vec_info loop_vinfo)
/* Detect whether we're vectorizing for VLA and should apply the unrolling
heuristic described above m_unrolled_vls_niters. */
record_potential_vls_unrolling (loop_vinfo);
+
+ /* Detect whether the LOOP has unexpected spills. */
+ record_potential_unexpected_spills (loop_vinfo);
+}
+
+/* Analyze the vectorized program stataments and use dynamic LMUL
+ heuristic to detect whether the loop has unexpected spills. */
+void
+costs::record_potential_unexpected_spills (loop_vec_info loop_vinfo)
+{
+ if (riscv_autovec_lmul == RVV_DYNAMIC)
+ {
+ bool post_dom_available_p = dom_info_available_p (CDI_POST_DOMINATORS);
+ if (!post_dom_available_p)
+ calculate_dominance_info (CDI_POST_DOMINATORS);
+ m_has_unexpected_spills_p = has_unexpected_spills_p (loop_vinfo);
+ if (!post_dom_available_p)
+ free_dominance_info (CDI_POST_DOMINATORS);
+ }
}
/* Decide whether to use the unrolling heuristic described above
@@ -762,19 +786,19 @@ costs::better_main_loop_than_p (const vector_costs *uncast_other) const
return other_prefer_unrolled;
}
}
-
- if (!LOOP_VINFO_NITERS_KNOWN_P (this_loop_vinfo)
- && riscv_autovec_lmul == RVV_DYNAMIC)
+ else if (riscv_autovec_lmul == RVV_DYNAMIC
+ && !LOOP_VINFO_NITERS_KNOWN_P (other_loop_vinfo))
{
- if (!riscv_v_ext_vector_mode_p (this_loop_vinfo->vector_mode))
+ if (other->m_has_unexpected_spills_p)
+ {
+ if (dump_enabled_p ())
+ dump_printf_loc (MSG_NOTE, vect_location,
+ "Preferring smaller LMUL loop because"
+ " it has unexpected spills\n");
+ return true;
+ }
+ else
return false;
- bool post_dom_available_p = dom_info_available_p (CDI_POST_DOMINATORS);
- if (!post_dom_available_p)
- calculate_dominance_info (CDI_POST_DOMINATORS);
- bool preferred_p = preferred_new_lmul_p (other_loop_vinfo);
- if (!post_dom_available_p)
- free_dominance_info (CDI_POST_DOMINATORS);
- return preferred_p;
}
return vector_costs::better_main_loop_than_p (other);
@@ -92,6 +92,14 @@ private:
void analyze_loop_vinfo (loop_vec_info);
void record_potential_vls_unrolling (loop_vec_info);
bool prefer_unrolled_loop () const;
+
+ /* Analyze the vectorized program statements and compute the maximum live
+ V_REGS live at some program point if we enable dynamic LMUL cost model.
+
+ It's true when LMUL of loop vectorization factor > 1 and has unexpected
+ V_REGS spills according to the analysis. */
+ bool m_has_unexpected_spills_p = false;
+ void record_potential_unexpected_spills (loop_vec_info);
};
} // namespace riscv_vector
@@ -44,7 +44,4 @@ foo (int32_t *__restrict a, int32_t *__restrict b, int32_t *__restrict c,
/* { dg-final { scan-assembler {e32,m2} } } */
/* { dg-final { scan-assembler {e32,m8} } } */
/* { dg-final { scan-assembler-not {csrr} } } */
-/* { dg-final { scan-tree-dump "Maximum lmul = 8" "vect" } } */
-/* { dg-final { scan-tree-dump-times "Maximum lmul = 4" 1 "vect" } } */
-/* { dg-final { scan-tree-dump "Maximum lmul = 2" "vect" } } */
-/* { dg-final { scan-tree-dump-not "Maximum lmul = 1" "vect" } } */
+/* { dg-final { scan-tree-dump-times "Preferring smaller LMUL loop because it has unexpected spills" 2 "vect" } } */
@@ -85,7 +85,4 @@ foo (int32_t *__restrict a, int32_t *__restrict b, int32_t *__restrict c,
/* { dg-final { scan-assembler {e32,m1} } } */
/* { dg-final { scan-assembler-not {csrr} } } */
-/* { dg-final { scan-tree-dump-times "Maximum lmul = 8" 1 "vect" } } */
-/* { dg-final { scan-tree-dump-times "Maximum lmul = 4" 1 "vect" } } */
-/* { dg-final { scan-tree-dump-times "Maximum lmul = 2" 1 "vect" } } */
-/* { dg-final { scan-tree-dump-times "Maximum lmul = 1" 1 "vect" } } */
+/* { dg-final { scan-tree-dump-times "Preferring smaller LMUL loop because it has unexpected spills" 3 "vect" } } */
@@ -57,7 +57,4 @@ foo (int32_t *__restrict a, int32_t *__restrict b, int32_t *__restrict c,
/* FIXME: Choosing LMUL = 1 is not the optimal since it can be LMUL = 2 if we apply instruction scheduler. */
/* { dg-final { scan-assembler {e32,m1} } } */
/* { dg-final { scan-assembler-not {csrr} } } */
-/* { dg-final { scan-tree-dump-times "Maximum lmul = 8" 1 "vect" } } */
-/* { dg-final { scan-tree-dump-times "Maximum lmul = 4" 1 "vect" } } */
-/* { dg-final { scan-tree-dump-times "Maximum lmul = 2" 1 "vect" } } */
-/* { dg-final { scan-tree-dump-times "Maximum lmul = 1" 1 "vect" } } */
+/* { dg-final { scan-tree-dump-times "Preferring smaller LMUL loop because it has unexpected spills" 3 "vect" } } */
@@ -85,7 +85,4 @@ foo (int8_t *__restrict a, int8_t *__restrict b, int8_t *__restrict c,
/* { dg-final { scan-assembler {e8,m1} } } */
/* { dg-final { scan-assembler-not {csrr} } } */
-/* { dg-final { scan-tree-dump-times "Maximum lmul = 8" 1 "vect" } } */
-/* { dg-final { scan-tree-dump-times "Maximum lmul = 4" 1 "vect" } } */
-/* { dg-final { scan-tree-dump-times "Maximum lmul = 2" 1 "vect" } } */
-/* { dg-final { scan-tree-dump "Maximum lmul = 1" "vect" } } */
+/* { dg-final { scan-tree-dump-times "Preferring smaller LMUL loop because it has unexpected spills" 3 "vect" } } */
@@ -115,7 +115,4 @@ foo (int32_t *__restrict a, int32_t *__restrict b, int32_t *__restrict c,
/* { dg-final { scan-assembler {e32,m1} } } */
/* { dg-final { scan-assembler-not {csrr} } } */
-/* { dg-final { scan-tree-dump-times "Maximum lmul = 8" 1 "vect" } } */
-/* { dg-final { scan-tree-dump-times "Maximum lmul = 4" 1 "vect" } } */
-/* { dg-final { scan-tree-dump-times "Maximum lmul = 2" 1 "vect" } } */
-/* { dg-final { scan-tree-dump-times "Maximum lmul = 1" 1 "vect" } } */
+/* { dg-final { scan-tree-dump-times "Preferring smaller LMUL loop because it has unexpected spills" 3 "vect" } } */
@@ -143,7 +143,4 @@ foo (int32_t *__restrict a, int32_t *__restrict b, int32_t *__restrict c,
/* { dg-final { scan-assembler {e32,m1} } } */
/* { dg-final { scan-assembler-not {csrr} } } */
-/* { dg-final { scan-tree-dump-times "Maximum lmul = 8" 1 "vect" } } */
-/* { dg-final { scan-tree-dump-times "Maximum lmul = 4" 1 "vect" } } */
-/* { dg-final { scan-tree-dump-times "Maximum lmul = 2" 1 "vect" } } */
-/* { dg-final { scan-tree-dump-times "Maximum lmul = 1" 1 "vect" } } */
+/* { dg-final { scan-tree-dump-times "Preferring smaller LMUL loop because it has unexpected spills" 3 "vect" } } */
@@ -144,7 +144,4 @@ foo (int8_t *__restrict a, int8_t *__restrict b, int8_t *__restrict c,
/* { dg-final { scan-assembler {e8,m1} } } */
/* { dg-final { scan-assembler-not {csrr} } } */
-/* { dg-final { scan-tree-dump-times "Maximum lmul = 8" 1 "vect" } } */
-/* { dg-final { scan-tree-dump-times "Maximum lmul = 4" 1 "vect" } } */
-/* { dg-final { scan-tree-dump-times "Maximum lmul = 2" 1 "vect" } } */
-/* { dg-final { scan-tree-dump "Maximum lmul = 1" "vect" } } */
+/* { dg-final { scan-tree-dump-times "Preferring smaller LMUL loop because it has unexpected spills" 3 "vect" } } */
@@ -42,7 +42,4 @@ foo (int32_t *__restrict a, int32_t *__restrict b, int32_t *__restrict c,
/* { dg-final { scan-assembler {e32,m1} } } */
/* { dg-final { scan-assembler-not {csrr} } } */
-/* { dg-final { scan-tree-dump-times "Maximum lmul = 8" 1 "vect" } } */
-/* { dg-final { scan-tree-dump-times "Maximum lmul = 4" 1 "vect" } } */
-/* { dg-final { scan-tree-dump-times "Maximum lmul = 2" 1 "vect" } } */
-/* { dg-final { scan-tree-dump-times "Maximum lmul = 1" 1 "vect" } } */
+/* { dg-final { scan-tree-dump-times "Preferring smaller LMUL loop because it has unexpected spills" 3 "vect" } } */
@@ -45,7 +45,4 @@ foo (int32_t *__restrict a, int32_t *__restrict b, int32_t *__restrict c,
/* { dg-final { scan-assembler {e32,m2} } } */
/* { dg-final { scan-assembler-not {csrr} } } */
-/* { dg-final { scan-tree-dump-times "Maximum lmul = 8" 1 "vect" } } */
-/* { dg-final { scan-tree-dump-times "Maximum lmul = 4" 1 "vect" } } */
-/* { dg-final { scan-tree-dump "Maximum lmul = 2" "vect" } } */
-/* { dg-final { scan-tree-dump-not "Maximum lmul = 1" "vect" } } */
+/* { dg-final { scan-tree-dump-times "Preferring smaller LMUL loop because it has unexpected spills" 2 "vect" } } */
@@ -45,7 +45,4 @@ foo (int8_t *__restrict a, int8_t *__restrict b, int8_t *__restrict c,
/* { dg-final { scan-assembler {e8,m2} } } */
/* { dg-final { scan-assembler-not {csrr} } } */
-/* { dg-final { scan-tree-dump-times "Maximum lmul = 8" 1 "vect" } } */
-/* { dg-final { scan-tree-dump-times "Maximum lmul = 4" 1 "vect" } } */
-/* { dg-final { scan-tree-dump "Maximum lmul = 2" "vect" } } */
-/* { dg-final { scan-tree-dump-not "Maximum lmul = 1" "vect" } } */
+/* { dg-final { scan-tree-dump-times "Preferring smaller LMUL loop because it has unexpected spills" 2 "vect" } } */
@@ -45,7 +45,4 @@ foo (int32_t *__restrict a, int32_t *__restrict b, int32_t *__restrict c,
/* { dg-final { scan-assembler {e32,m2} } } */
/* { dg-final { scan-assembler-not {csrr} } } */
-/* { dg-final { scan-tree-dump-times "Maximum lmul = 8" 1 "vect" } } */
-/* { dg-final { scan-tree-dump-times "Maximum lmul = 4" 1 "vect" } } */
-/* { dg-final { scan-tree-dump "Maximum lmul = 2" "vect" } } */
-/* { dg-final { scan-tree-dump-not "Maximum lmul = 1" "vect" } } */
+/* { dg-final { scan-tree-dump-times "Preferring smaller LMUL loop because it has unexpected spills" 2 "vect" } } */
@@ -43,7 +43,4 @@ foo (int32_t *__restrict a, int32_t *__restrict b, int32_t *__restrict c,
/* { dg-final { scan-assembler {e32,m2} } } */
/* { dg-final { scan-assembler-not {csrr} } } */
-/* { dg-final { scan-tree-dump-times "Maximum lmul = 8" 1 "vect" } } */
-/* { dg-final { scan-tree-dump-times "Maximum lmul = 4" 1 "vect" } } */
-/* { dg-final { scan-tree-dump "Maximum lmul = 2" "vect" } } */
-/* { dg-final { scan-tree-dump-not "Maximum lmul = 1" "vect" } } */
+/* { dg-final { scan-tree-dump-times "Preferring smaller LMUL loop because it has unexpected spills" 2 "vect" } } */
@@ -46,7 +46,4 @@ foo (int32_t *__restrict a, int32_t *__restrict b, int32_t *__restrict c,
/* { dg-final { scan-assembler {e32,m2} } } */
/* { dg-final { scan-assembler {e8,m8} } } */
/* { dg-final { scan-assembler-not {csrr} } } */
-/* { dg-final { scan-tree-dump-times "Maximum lmul = 8" 1 "vect" } } */
-/* { dg-final { scan-tree-dump-times "Maximum lmul = 4" 1 "vect" } } */
-/* { dg-final { scan-tree-dump "Maximum lmul = 2" "vect" } } */
-/* { dg-final { scan-tree-dump-not "Maximum lmul = 1" "vect" } } */
+/* { dg-final { scan-tree-dump-times "Preferring smaller LMUL loop because it has unexpected spills" 2 "vect" } } */
@@ -48,7 +48,4 @@ foo (int32_t *__restrict a, int32_t *__restrict b, int32_t *__restrict c,
/* { dg-final { scan-assembler {e32,m2} } } */
/* { dg-final { scan-assembler {e8,m8} } } */
/* { dg-final { scan-assembler-not {csrr} } } */
-/* { dg-final { scan-tree-dump "Maximum lmul = 8" "vect" } } */
-/* { dg-final { scan-tree-dump-times "Maximum lmul = 4" 1 "vect" } } */
-/* { dg-final { scan-tree-dump "Maximum lmul = 2" "vect" } } */
-/* { dg-final { scan-tree-dump-not "Maximum lmul = 1" "vect" } } */
+/* { dg-final { scan-tree-dump-times "Preferring smaller LMUL loop because it has unexpected spills" 2 "vect" } } */
@@ -29,7 +29,4 @@ foo (int32_t *__restrict a, int32_t *__restrict b, int32_t *__restrict c,
/* { dg-final { scan-assembler {e32,m4} } } */
/* { dg-final { scan-assembler-not {csrr} } } */
-/* { dg-final { scan-tree-dump-times "Maximum lmul = 8" 1 "vect" } } */
-/* { dg-final { scan-tree-dump "Maximum lmul = 4" "vect" } } */
-/* { dg-final { scan-tree-dump-not "Maximum lmul = 2" "vect" } } */
-/* { dg-final { scan-tree-dump-not "Maximum lmul = 1" "vect" } } */
+/* { dg-final { scan-tree-dump-times "Preferring smaller LMUL loop because it has unexpected spills" 1 "vect" } } */
@@ -20,7 +20,4 @@ bar (int *x, int a, int b, int n)
/* { dg-final { scan-assembler {e32,m4} } } */
/* { dg-final { scan-assembler-not {jr} } } */
/* { dg-final { scan-assembler-times {ret} 2 } } *
-/* { dg-final { scan-tree-dump-times "Maximum lmul = 8" 1 "vect" } } */
-/* { dg-final { scan-tree-dump "Maximum lmul = 4" "vect" } } */
-/* { dg-final { scan-tree-dump-not "Maximum lmul = 2" "vect" } } */
-/* { dg-final { scan-tree-dump-not "Maximum lmul = 1" "vect" } } */
+/* { dg-final { scan-tree-dump-times "Preferring smaller LMUL loop because it has unexpected spills" 1 "vect" } } */
@@ -29,7 +29,4 @@ foo (int8_t *__restrict a, int8_t *__restrict b, int8_t *__restrict c,
/* { dg-final { scan-assembler {e8,m4} } } */
/* { dg-final { scan-assembler-not {csrr} } } */
-/* { dg-final { scan-tree-dump-times "Maximum lmul = 8" 1 "vect" } } */
-/* { dg-final { scan-tree-dump "Maximum lmul = 4" "vect" } } */
-/* { dg-final { scan-tree-dump-not "Maximum lmul = 2" "vect" } } */
-/* { dg-final { scan-tree-dump-not "Maximum lmul = 1" "vect" } } */
+/* { dg-final { scan-tree-dump-times "Preferring smaller LMUL loop because it has unexpected spills" 1 "vect" } } */
@@ -41,7 +41,4 @@ void foo2 (int64_t *__restrict a,
/* { dg-final { scan-assembler {e64,m4} } } */
/* { dg-final { scan-assembler-not {csrr} } } */
-/* { dg-final { scan-tree-dump-times "Maximum lmul = 8" 1 "vect" } } */
-/* { dg-final { scan-tree-dump "Maximum lmul = 4" "vect" } } */
-/* { dg-final { scan-tree-dump-not "Maximum lmul = 2" "vect" } } */
-/* { dg-final { scan-tree-dump-not "Maximum lmul = 1" "vect" } } */
+/* { dg-final { scan-tree-dump-times "Preferring smaller LMUL loop because it has unexpected spills" 1 "vect" } } */
@@ -41,7 +41,4 @@ void foo2 (int16_t *__restrict a,
/* { dg-final { scan-assembler {e16,m2} } } */
/* { dg-final { scan-assembler-not {csrr} } } */
-/* { dg-final { scan-tree-dump-times "Maximum lmul = 8" 1 "vect" } } */
-/* { dg-final { scan-tree-dump "Maximum lmul = 4" "vect" } } */
-/* { dg-final { scan-tree-dump-not "Maximum lmul = 2" "vect" } } */
-/* { dg-final { scan-tree-dump-not "Maximum lmul = 1" "vect" } } */
+/* { dg-final { scan-tree-dump-times "Preferring smaller LMUL loop because it has unexpected spills" 1 "vect" } } */
@@ -21,7 +21,5 @@ foo (uint8_t *restrict a, uint8_t *restrict b, int n)
/* { dg-final { scan-assembler {e8,m4} } } */
/* { dg-final { scan-assembler-times {csrr} 1 } } */
-/* { dg-final { scan-tree-dump-not "Maximum lmul = 8" "vect" } } */
-/* { dg-final { scan-tree-dump "Maximum lmul = 4" "vect" } } */
-/* { dg-final { scan-tree-dump-not "Maximum lmul = 2" "vect" } } */
-/* { dg-final { scan-tree-dump-not "Maximum lmul = 1" "vect" } } */
+/* Since we don't support VLA SLP for LMUL = 8, dynamic LMUL cost model start from LMUL = 4. */
+/* { dg-final { scan-tree-dump-not "Preferring smaller LMUL loop because it has unexpected spills" "vect" } } */
@@ -41,7 +41,4 @@ void foo2 (int8_t *__restrict a,
/* { dg-final { scan-assembler {e64,m4} } } */
/* { dg-final { scan-assembler-not {csrr} } } */
-/* { dg-final { scan-tree-dump-times "Maximum lmul = 8" 1 "vect" } } */
-/* { dg-final { scan-tree-dump "Maximum lmul = 4" "vect" } } */
-/* { dg-final { scan-tree-dump-not "Maximum lmul = 2" "vect" } } */
-/* { dg-final { scan-tree-dump-not "Maximum lmul = 1" "vect" } } */
+/* { dg-final { scan-tree-dump-times "Preferring smaller LMUL loop because it has unexpected spills" 1 "vect" } } */
@@ -30,7 +30,5 @@ foo (uint8_t *restrict a, uint8_t *restrict b, int n)
/* { dg-final { scan-assembler {e8,m4} } } */
/* { dg-final { scan-assembler-times {csrr} 1 } } */
-/* { dg-final { scan-tree-dump-not "Maximum lmul = 8" "vect" } } */
-/* { dg-final { scan-tree-dump "Maximum lmul = 4" "vect" } } */
-/* { dg-final { scan-tree-dump-not "Maximum lmul = 2" "vect" } } */
-/* { dg-final { scan-tree-dump-not "Maximum lmul = 1" "vect" } } */
+/* Since we don't support VLA SLP for LMUL = 8, dynamic LMUL cost model start from LMUL = 4. */
+/* { dg-final { scan-tree-dump-not "Preferring smaller LMUL loop because it has unexpected spills" "vect" } } */
@@ -12,7 +12,4 @@ foo (int32_t *__restrict a, int32_t *__restrict b, int n)
/* { dg-final { scan-assembler {e32,m8} } } */
/* { dg-final { scan-assembler-not {csrr} } } */
-/* { dg-final { scan-tree-dump "Maximum lmul = 8" "vect" } } */
-/* { dg-final { scan-tree-dump-not "Maximum lmul = 4" "vect" } } */
-/* { dg-final { scan-tree-dump-not "Maximum lmul = 2" "vect" } } */
-/* { dg-final { scan-tree-dump-not "Maximum lmul = 1" "vect" } } */
+/* { dg-final { scan-tree-dump-not "Preferring smaller LMUL loop because it has unexpected spills" "vect" } } */
@@ -16,7 +16,4 @@ foo (int *x, int n, int res)
/* { dg-final { scan-assembler {e32,m8} } } */
/* { dg-final { scan-assembler-times {csrr} 1 } } */
-/* { dg-final { scan-tree-dump "Maximum lmul = 8" "vect" } } */
-/* { dg-final { scan-tree-dump-not "Maximum lmul = 4" "vect" } } */
-/* { dg-final { scan-tree-dump-not "Maximum lmul = 2" "vect" } } */
-/* { dg-final { scan-tree-dump-not "Maximum lmul = 1" "vect" } } */
+/* { dg-final { scan-tree-dump-not "Preferring smaller LMUL loop because it has unexpected spills" "vect" } } */
@@ -41,7 +41,4 @@ void foo2 (int64_t *__restrict a,
/* { dg-final { scan-assembler {e64,m8} } } */
/* { dg-final { scan-assembler-not {csrr} } } */
-/* { dg-final { scan-tree-dump "Maximum lmul = 8" "vect" } } */
-/* { dg-final { scan-tree-dump-not "Maximum lmul = 4" "vect" } } */
-/* { dg-final { scan-tree-dump-not "Maximum lmul = 2" "vect" } } */
-/* { dg-final { scan-tree-dump-not "Maximum lmul = 1" "vect" } } */
+/* { dg-final { scan-tree-dump-not "Preferring smaller LMUL loop because it has unexpected spills" "vect" } } */
@@ -12,7 +12,4 @@ foo (int32_t *__restrict a, int16_t *__restrict b, int n)
/* { dg-final { scan-assembler {e16,m4} } } */
/* { dg-final { scan-assembler-not {csrr} } } */
-/* { dg-final { scan-tree-dump "Maximum lmul = 8" "vect" } } */
-/* { dg-final { scan-tree-dump-not "Maximum lmul = 4" "vect" } } */
-/* { dg-final { scan-tree-dump-not "Maximum lmul = 2" "vect" } } */
-/* { dg-final { scan-tree-dump-not "Maximum lmul = 1" "vect" } } */
+/* { dg-final { scan-tree-dump-not "Preferring smaller LMUL loop because it has unexpected spills" "vect" } } */
@@ -12,7 +12,4 @@ foo (int8_t *__restrict a, int8_t *__restrict b, int n)
/* { dg-final { scan-assembler {e8,m8} } } */
/* { dg-final { scan-assembler-not {csrr} } } */
-/* { dg-final { scan-tree-dump "Maximum lmul = 8" "vect" } } */
-/* { dg-final { scan-tree-dump-not "Maximum lmul = 4" "vect" } } */
-/* { dg-final { scan-tree-dump-not "Maximum lmul = 2" "vect" } } */
-/* { dg-final { scan-tree-dump-not "Maximum lmul = 1" "vect" } } */
+/* { dg-final { scan-tree-dump-not "Preferring smaller LMUL loop because it has unexpected spills" "vect" } } */
@@ -13,7 +13,4 @@ foo (size_t *__restrict a, size_t *__restrict b, int n)
/* { dg-final { scan-assembler {e64,m8} } } */
/* { dg-final { scan-assembler-not {csrr} } } */
-/* { dg-final { scan-tree-dump "Maximum lmul = 8" "vect" } } */
-/* { dg-final { scan-tree-dump-not "Maximum lmul = 4" "vect" } } */
-/* { dg-final { scan-tree-dump-not "Maximum lmul = 2" "vect" } } */
-/* { dg-final { scan-tree-dump-not "Maximum lmul = 1" "vect" } } */
+/* { dg-final { scan-tree-dump-not "Preferring smaller LMUL loop because it has unexpected spills" "vect" } } */
@@ -19,7 +19,4 @@ foo (int8_t *__restrict a, int8_t *__restrict b, int n)
/* { dg-final { scan-assembler {e8,m8} } } */
/* { dg-final { scan-assembler-not {csrr} } } */
-/* { dg-final { scan-tree-dump "Maximum lmul = 8" "vect" } } */
-/* { dg-final { scan-tree-dump-not "Maximum lmul = 4" "vect" } } */
-/* { dg-final { scan-tree-dump-not "Maximum lmul = 2" "vect" } } */
-/* { dg-final { scan-tree-dump-not "Maximum lmul = 1" "vect" } } */
+/* { dg-final { scan-tree-dump-not "Preferring smaller LMUL loop because it has unexpected spills" "vect" } } */
@@ -17,7 +17,4 @@ foo (int8_t *__restrict a, int8_t *__restrict b, int8_t *__restrict a2,
/* { dg-final { scan-assembler {e8,m8} } } */
/* { dg-final { scan-assembler-not {csrr} } } */
-/* { dg-final { scan-tree-dump "Maximum lmul = 8" "vect" } } */
-/* { dg-final { scan-tree-dump-not "Maximum lmul = 4" "vect" } } */
-/* { dg-final { scan-tree-dump-not "Maximum lmul = 2" "vect" } } */
-/* { dg-final { scan-tree-dump-not "Maximum lmul = 1" "vect" } } */
+/* { dg-final { scan-tree-dump-not "Preferring smaller LMUL loop because it has unexpected spills" "vect" } } */
@@ -17,7 +17,4 @@ foo (int32_t *__restrict a, int32_t *__restrict b, int32_t *__restrict a2,
/* { dg-final { scan-assembler {e32,m8} } } */
/* { dg-final { scan-assembler-not {csrr} } } */
-/* { dg-final { scan-tree-dump "Maximum lmul = 8" "vect" } } */
-/* { dg-final { scan-tree-dump-not "Maximum lmul = 4" "vect" } } */
-/* { dg-final { scan-tree-dump-not "Maximum lmul = 2" "vect" } } */
-/* { dg-final { scan-tree-dump-not "Maximum lmul = 1" "vect" } } */
+/* { dg-final { scan-tree-dump-not "Preferring smaller LMUL loop because it has unexpected spills" "vect" } } */
@@ -13,7 +13,4 @@ foo (int8_t *__restrict a, int8_t init, int n)
/* { dg-final { scan-assembler {e8,m8} } } */
/* { dg-final { scan-assembler-not {csrr} } } */
-/* { dg-final { scan-tree-dump "Maximum lmul = 8" "vect" } } */
-/* { dg-final { scan-tree-dump-not "Maximum lmul = 4" "vect" } } */
-/* { dg-final { scan-tree-dump-not "Maximum lmul = 2" "vect" } } */
-/* { dg-final { scan-tree-dump-not "Maximum lmul = 1" "vect" } } */
+/* { dg-final { scan-tree-dump-not "Preferring smaller LMUL loop because it has unexpected spills" "vect" } } */
@@ -13,7 +13,4 @@ foo (int64_t *__restrict a, int64_t init, int n)
/* { dg-final { scan-assembler {e64,m8} } } */
/* { dg-final { scan-assembler-not {csrr} } } */
-/* { dg-final { scan-tree-dump "Maximum lmul = 8" "vect" } } */
-/* { dg-final { scan-tree-dump-not "Maximum lmul = 4" "vect" } } */
-/* { dg-final { scan-tree-dump-not "Maximum lmul = 2" "vect" } } */
-/* { dg-final { scan-tree-dump-not "Maximum lmul = 1" "vect" } } */
+/* { dg-final { scan-tree-dump-not "Preferring smaller LMUL loop because it has unexpected spills" "vect" } } */
@@ -59,6 +59,6 @@ foo8 (int64_t *restrict a)
a[i] = a[i]-16;
}
-/* { dg-final { scan-tree-dump-not "Maximum lmul" "vect" } } */
+/* { dg-final { scan-tree-dump-not "Preferring smaller LMUL loop because it has unexpected spills" "vect" } } */
/* { dg-final { scan-assembler-times {vsetvli} 4 } } */
/* { dg-final { scan-assembler-times {vsetivli} 4 } } */
@@ -31,7 +31,4 @@ f3 (uint8_t *restrict a, uint8_t *restrict b,
/* { dg-final { scan-assembler {e8,m4} } } */
/* { dg-final { scan-assembler-not {jr} } } */
/* { dg-final { scan-assembler-times {ret} 1 } } */
-/* { dg-final { scan-tree-dump-not "Maximum lmul = 8" "vect" } } */
-/* { dg-final { scan-tree-dump "Maximum lmul = 4" "vect" } } */
-/* { dg-final { scan-tree-dump-not "Maximum lmul = 2" "vect" } } */
-/* { dg-final { scan-tree-dump-not "Maximum lmul = 1" "vect" } } */
+/* { dg-final { scan-tree-dump-not "Preferring smaller LMUL loop because it has unexpected spills" "vect" } } */
@@ -23,10 +23,7 @@ foo (int n){
/* { dg-final { scan-assembler {e32,m4} } } */
/* { dg-final { scan-assembler-not {jr} } } */
/* { dg-final { scan-assembler-times {ret} 1 } } */
-/* { dg-final { scan-tree-dump "Maximum lmul = 8" "vect" } } */
-/* { dg-final { scan-tree-dump "Maximum lmul = 4" "vect" } } */
-/* { dg-final { scan-tree-dump-not "Maximum lmul = 2" "vect" } } */
-/* { dg-final { scan-tree-dump-not "Maximum lmul = 1" "vect" } } */
+/* { dg-final { scan-tree-dump-times "Preferring smaller LMUL loop because it has unexpected spills" 1 "vect" } } */
/* { dg-final { scan-tree-dump "At most 8 number of live V_REG at program point 0 for bb 4" "vect" } } */
/* { dg-final { scan-tree-dump "At most 40 number of live V_REG at program point 0 for bb 3" "vect" } } */
/* { dg-final { scan-tree-dump "At most 8 number of live V_REG at program point 0 for bb 5" "vect" } } */