From: Ju-Zhe Zhong <juzhe.zh...@rivai.ai> Notice that the PASS is just simpily pick the probability >= 50% to do the backward fusion which will create endless loop on Phase 3.
Adding this probability to fix this bug. gcc/ChangeLog: * config/riscv/riscv-vsetvl.cc (vector_infos_manager::vector_infos_manager): Add probability. (vector_infos_manager::dump): Ditto. (pass_vsetvl::compute_probabilities): Ditto. * config/riscv/riscv-vsetvl.h (struct vector_block_info): Ditto. --- gcc/config/riscv/riscv-vsetvl.cc | 39 ++++++++++++++++++++++++++++++++ gcc/config/riscv/riscv-vsetvl.h | 3 +++ 2 files changed, 42 insertions(+) diff --git a/gcc/config/riscv/riscv-vsetvl.cc b/gcc/config/riscv/riscv-vsetvl.cc index 0f12d4ddb23..7d8c3a32aaa 100644 --- a/gcc/config/riscv/riscv-vsetvl.cc +++ b/gcc/config/riscv/riscv-vsetvl.cc @@ -1465,6 +1465,7 @@ vector_infos_manager::vector_infos_manager () vector_block_infos[bb->index ()].reaching_out = vector_insn_info (); for (insn_info *insn : bb->real_insns ()) vector_insn_infos[insn->uid ()].parse_insn (insn); + vector_block_infos[bb->index ()].probability = profile_probability (); } } } @@ -1642,6 +1643,8 @@ vector_infos_manager::dump (FILE *file) const } fprintf (file, "<FOOTER>="); vector_block_infos[cfg_bb->index].reaching_out.dump (file); + fprintf (file, "<Probability>="); + vector_block_infos[cfg_bb->index].probability.dump (file); fprintf (file, "\n\n"); } @@ -1764,6 +1767,7 @@ private: void init (void); void done (void); + void compute_probabilities (void); public: pass_vsetvl (gcc::context *ctxt) : rtl_opt_pass (pass_data_vsetvl, ctxt) {} @@ -2629,6 +2633,41 @@ pass_vsetvl::done (void) m_vector_manager = nullptr; } +/* Compute probability for each block. */ +void +pass_vsetvl::compute_probabilities (void) +{ + /* Don't compute it in -O0 since we don't need it. */ + if (!optimize) + return; + edge e; + edge_iterator ei; + + for (const bb_info *bb : crtl->ssa->bbs ()) + { + basic_block cfg_bb = bb->cfg_bb (); + auto &curr_prob + = m_vector_manager->vector_block_infos[cfg_bb->index].probability; + if (ENTRY_BLOCK_PTR_FOR_FN (cfun) == cfg_bb) + curr_prob = profile_probability::always (); + gcc_assert (curr_prob.initialized_p ()); + FOR_EACH_EDGE (e, ei, cfg_bb->succs) + { + auto &new_prob + = m_vector_manager->vector_block_infos[e->dest->index].probability; + if (!new_prob.initialized_p ()) + new_prob = curr_prob * e->probability; + else if (new_prob == profile_probability::always ()) + continue; + else + new_prob += curr_prob * e->probability; + } + } + auto &exit_block + = m_vector_manager->vector_block_infos[EXIT_BLOCK_PTR_FOR_FN (cfun)->index]; + exit_block.probability = profile_probability::always (); +} + /* Lazy vsetvl insertion for optimize > 0. */ void pass_vsetvl::lazy_vsetvl (void) diff --git a/gcc/config/riscv/riscv-vsetvl.h b/gcc/config/riscv/riscv-vsetvl.h index 563ad3084ed..fb3ebb9db79 100644 --- a/gcc/config/riscv/riscv-vsetvl.h +++ b/gcc/config/riscv/riscv-vsetvl.h @@ -291,6 +291,9 @@ struct vector_block_info /* The reaching_out vector insn_info of the block. */ vector_insn_info reaching_out; + /* The static execute probability of the demand info. */ + profile_probability probability; + vector_block_info () = default; }; -- 2.36.1