aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorliuhongt <hongtao.liu@intel.com>2023-04-03 10:54:55 +0800
committerliuhongt <hongtao.liu@intel.com>2023-04-19 13:23:29 +0800
commit727be65ec40e119a7c864bfaa5d6a73547863c06 (patch)
tree3d35c883aacdfedd3a58d43cc5ed10066f0a4de8 /gcc
parentd5cd3eada416a89e6478b1b1c874115574eb19a8 (diff)
downloadgcc-727be65ec40e119a7c864bfaa5d6a73547863c06.zip
gcc-727be65ec40e119a7c864bfaa5d6a73547863c06.tar.gz
gcc-727be65ec40e119a7c864bfaa5d6a73547863c06.tar.bz2
Check hard_regno_mode_ok before setting lowest memory move cost for the mode with different reg classes.
There's a potential performance issue when backend returns some unreasonable value for the mode which can be never be allocate with reg class. 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.
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ira.cc4
1 files changed, 4 insertions, 0 deletions
diff --git a/gcc/ira.cc b/gcc/ira.cc
index 6c7f490..02dea5d 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]