Commit 5c8a1211 by Vladimir N. Makarov

Fix for PR93272 - LRA: EH reg allocated to hold local variable

2020-01-28  Vladimir Makarov  <vmakarov@redhat.com>

	PR rtl-optimization/93272
	* ira-lives.c (process_out_of_region_eh_regs): New function.
	(process_bb_node_lives): Call it.
parent 32387f76
2020-01-28 Vladimir Makarov <vmakarov@redhat.com>
PR rtl-optimization/93272
* ira-lives.c (process_out_of_region_eh_regs): New function.
(process_bb_node_lives): Call it.
2020-01-28 Jan Hubicka <hubicka@ucw.cz> 2020-01-28 Jan Hubicka <hubicka@ucw.cz>
* coverage.c (read_counts_file): Make error message lowercase. * coverage.c (read_counts_file): Make error message lowercase.
......
...@@ -1160,6 +1160,50 @@ non_conflicting_reg_copy_p (rtx_insn *insn) ...@@ -1160,6 +1160,50 @@ non_conflicting_reg_copy_p (rtx_insn *insn)
return SET_SRC (set); return SET_SRC (set);
} }
#ifdef EH_RETURN_DATA_REGNO
/* Add EH return hard registers as conflict hard registers to allocnos
living at end of BB. For most allocnos it is already done in
process_bb_node_lives when we processing input edges but it does
not work when and EH edge is edge out of the current region. This
function covers such out of region edges. */
static void
process_out_of_region_eh_regs (basic_block bb)
{
edge e;
edge_iterator ei;
unsigned int i;
bitmap_iterator bi;
bool eh_p = false;
FOR_EACH_EDGE (e, ei, bb->succs)
if ((e->flags & EDGE_EH)
&& IRA_BB_NODE (e->dest)->parent != IRA_BB_NODE (bb)->parent)
eh_p = true;
if (! eh_p)
return;
EXECUTE_IF_SET_IN_BITMAP (df_get_live_out (bb), FIRST_PSEUDO_REGISTER, i, bi)
{
ira_allocno_t a = ira_curr_regno_allocno_map[i];
for (int n = ALLOCNO_NUM_OBJECTS (a) - 1; n >= 0; n--)
{
ira_object_t obj = ALLOCNO_OBJECT (a, n);
for (int k = 0; ; k++)
{
unsigned int regno = EH_RETURN_DATA_REGNO (k);
if (regno == INVALID_REGNUM)
break;
SET_HARD_REG_BIT (OBJECT_CONFLICT_HARD_REGS (obj), regno);
SET_HARD_REG_BIT (OBJECT_TOTAL_CONFLICT_HARD_REGS (obj), regno);
}
}
}
}
#endif
/* Process insns of the basic block given by its LOOP_TREE_NODE to /* Process insns of the basic block given by its LOOP_TREE_NODE to
update allocno live ranges, allocno hard register conflicts, update allocno live ranges, allocno hard register conflicts,
intersected calls, and register pressure info for allocnos for the intersected calls, and register pressure info for allocnos for the
...@@ -1213,6 +1257,10 @@ process_bb_node_lives (ira_loop_tree_node_t loop_tree_node) ...@@ -1213,6 +1257,10 @@ process_bb_node_lives (ira_loop_tree_node_t loop_tree_node)
EXECUTE_IF_SET_IN_BITMAP (reg_live_out, FIRST_PSEUDO_REGISTER, j, bi) EXECUTE_IF_SET_IN_BITMAP (reg_live_out, FIRST_PSEUDO_REGISTER, j, bi)
mark_pseudo_regno_live (j); mark_pseudo_regno_live (j);
#ifdef EH_RETURN_DATA_REGNO
process_out_of_region_eh_regs (bb);
#endif
freq = REG_FREQ_FROM_BB (bb); freq = REG_FREQ_FROM_BB (bb);
if (freq == 0) if (freq == 0)
freq = 1; freq = 1;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment