ira: Fix old-reload targets [PR103974]

The new IRA heuristics would need more work on old-reload targets,
since flattening needs to be able to undo the cost propagation.
It's doable, but hardly seems worth it.

This patch therefore makes all the new calls to
ira_subloop_allocnos_can_differ_p return false if !ira_use_lra_p.
The color_pass code that predated the new function (and that was
the source of ira_subloop_allocnos_can_differ_p) continues to
behave as before.

It's a hack, but at least it has the advantage that the new parameter
would become obviously unused if reload and (!)ira_use_lra_p were
removed.  The hack should therefore disappear alongside reload.

gcc/
	PR rtl-optimization/103974
	* ira-int.h (ira_subloop_allocnos_can_differ_p): Take an
	extra argument, default true, that says whether old-reload
	targets should be excluded.
	* ira-color.c (color_pass): Pass false.
This commit is contained in:
Richard Sandiford 2022-01-11 19:24:59 +00:00
parent 8b35f02ed5
commit db8d94a057
2 changed files with 10 additions and 3 deletions

View File

@ -3664,7 +3664,8 @@ color_pass (ira_loop_tree_node_t loop_tree_node)
ira_assert (bitmap_bit_p (subloop_node->all_allocnos, ira_assert (bitmap_bit_p (subloop_node->all_allocnos,
ALLOCNO_NUM (subloop_allocno))); ALLOCNO_NUM (subloop_allocno)));
if (ira_single_region_allocno_p (a, subloop_allocno) if (ira_single_region_allocno_p (a, subloop_allocno)
|| !ira_subloop_allocnos_can_differ_p (a, hard_regno >= 0)) || !ira_subloop_allocnos_can_differ_p (a, hard_regno >= 0,
false))
{ {
gcc_assert (!ALLOCNO_MIGHT_CONFLICT_WITH_PARENT_P gcc_assert (!ALLOCNO_MIGHT_CONFLICT_WITH_PARENT_P
(subloop_allocno)); (subloop_allocno));

View File

@ -1607,10 +1607,16 @@ ira_loop_border_costs::move_between_loops_cost () const
/* Return true if subloops that contain allocnos for A's register can /* Return true if subloops that contain allocnos for A's register can
use a different assignment from A. ALLOCATED_P is true for the case use a different assignment from A. ALLOCATED_P is true for the case
in which allocation succeeded for A. */ in which allocation succeeded for A. EXCLUDE_OLD_RELOAD is true if
we should always return false for non-LRA targets. (This is a hack
and should be removed along with old reload.) */
inline bool inline bool
ira_subloop_allocnos_can_differ_p (ira_allocno_t a, bool allocated_p = true) ira_subloop_allocnos_can_differ_p (ira_allocno_t a, bool allocated_p = true,
bool exclude_old_reload = true)
{ {
if (exclude_old_reload && !ira_use_lra_p)
return false;
auto regno = ALLOCNO_REGNO (a); auto regno = ALLOCNO_REGNO (a);
if (pic_offset_table_rtx != NULL if (pic_offset_table_rtx != NULL