From: juewang <[email protected]>

The branch-cost based noce limit is too small for unpredictable branches on 
C950 and blocks profitable Zicond sequences.  Add a per-tune factor, defaulting 
to one, and use five for C950.

This improves 505.mcf_r by nearly 5% on C950.

gcc/ChangeLog:

        * config/riscv/riscv.cc (riscv_tune_param): Add
        noce_ifcvt_unpredictable_cost_factor.
        (xt_c9501_tune_info): Set it to 5.
        (riscv_max_noce_ifcvt_seq_cost): Scale the branch-cost based limit.
---
 gcc/config/riscv/riscv.cc | 6 +++++-
 1 file changed, 5 insertions(+), 1 deletion(-)

diff --git a/gcc/config/riscv/riscv.cc b/gcc/config/riscv/riscv.cc
index 6593d00a7e6..69cff996f5e 100644
--- a/gcc/config/riscv/riscv.cc
+++ b/gcc/config/riscv/riscv.cc
@@ -305,6 +305,7 @@ struct riscv_tune_param
   unsigned short vec_reassoc_width = 1;
   unsigned int small_loop_unroll_ninsns = 4;
   unsigned int small_loop_unroll_factor = 2;
+  unsigned short noce_ifcvt_unpredictable_cost_factor = 1;
 };
 
 
@@ -747,6 +748,7 @@ static const struct riscv_tune_param xt_c9501_tune_info = {
   1,                                           /* vec_reassoc_width.  */
   4,   /* small_loop_unroll_ninsns.  */
   8,   /* small_loop_unroll_factor.  */
+  5,   /* noce_ifcvt_unpredictable_cost_factor.  */
 };
 
 /* Costs to use when optimizing for Tenstorrent Ascalon 8 wide.  */
@@ -5130,7 +5132,9 @@ riscv_max_noce_ifcvt_seq_cost (edge e)
        return param_max_rtl_if_conversion_unpredictable_cost;
     }
 
-  return COSTS_N_INSNS (BRANCH_COST (true, predictable_p));
+  return (BRANCH_COST (true, predictable_p)
+         * COSTS_N_INSNS
+             (tune_param->noce_ifcvt_unpredictable_cost_factor));
 }
 
 /* Implement TARGET_NOCE_CONVERSION_PROFITABLE_P.  We replace the cost of a
-- 
2.34.1

Reply via email to