There's a potential performance issue when backend returns some unreasonable value for the mode which can be never be allocate with reg class.
Bootstrapped and regtested on x86_64-pc-linux-gnu{-m32,}. Ok for trunk(or GCC14 stage1)? gcc/ChangeLog: PR rtl-optimization/109351 * ira.cc (setup_class_subset_and_memory_move_costs): Check hard_regno_mode_ok before setting lowest memory move cost for the mode with different reg classes. --- gcc/ira.cc | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/gcc/ira.cc b/gcc/ira.cc index 6c7f4901e4c..02dea5d49ee 100644 --- a/gcc/ira.cc +++ b/gcc/ira.cc @@ -588,6 +588,10 @@ setup_class_subset_and_memory_move_costs (void) /* Costs for NO_REGS are used in cost calculation on the 1st pass when the preferred register classes are not known yet. In this case we take the best scenario. */ + if (!targetm.hard_regno_mode_ok (ira_class_hard_regs[cl][0], + (machine_mode) mode)) + continue; + if (ira_memory_move_cost[mode][NO_REGS][0] > ira_memory_move_cost[mode][cl][0]) ira_max_memory_move_cost[mode][NO_REGS][0] -- 2.39.1.388.g2fc9e9ca3c