You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
70 lines
2.0 KiB
70 lines
2.0 KiB
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. |
|
|
|
--- gcc/ira-lives.c |
|
+++ gcc/ira-lives.c |
|
@@ -1116,6 +1116,50 @@ |
|
return cheap_reg; |
|
} |
|
|
|
+#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 |
|
update allocno live ranges, allocno hard register conflicts, |
|
intersected calls, and register pressure info for allocnos for the |
|
@@ -1170,6 +1214,10 @@ |
|
EXECUTE_IF_SET_IN_BITMAP (reg_live_out, FIRST_PSEUDO_REGISTER, j, bi) |
|
mark_pseudo_regno_live (j); |
|
|
|
+#ifdef EH_RETURN_DATA_REGNO |
|
+ process_out_of_region_eh_regs (bb); |
|
+#endif |
|
+ |
|
freq = REG_FREQ_FROM_BB (bb); |
|
if (freq == 0) |
|
freq = 1;
|
|
|