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:
parent
8b35f02ed5
commit
db8d94a057
@ -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));
|
||||||
|
@ -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
|
||||||
|
Loading…
Reference in New Issue
Block a user