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