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

Reply via email to