aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVladimir N. Makarov <vmakarov@redhat.com>2023-11-09 08:51:15 -0500
committerVladimir N. Makarov <vmakarov@redhat.com>2023-11-09 13:24:44 -0500
commita99f6bb142bc4506dcb8aa2b7722310ad92e4528 (patch)
tree2109d5499a386bb4b40cd6fc86a7f8c8465c2b05
parentc4cf9aa247db5e24edcc3f8179915791604491a6 (diff)
downloadgcc-a99f6bb142bc4506dcb8aa2b7722310ad92e4528.zip
gcc-a99f6bb142bc4506dcb8aa2b7722310ad92e4528.tar.gz
gcc-a99f6bb142bc4506dcb8aa2b7722310ad92e4528.tar.bz2
[IRA]: Fixing conflict calculation from region landing pads.
The following patch fixes conflict calculation from exception landing pads. The previous patch processed only one newly created landing pad. Besides it was wrong, it also resulted in large memory consumption by IRA. gcc/ChangeLog: PR rtl-optimization/110215 * ira-lives.cc: (add_conflict_from_region_landing_pads): New function. (process_bb_node_lives): Use it.
-rw-r--r--gcc/ira-lives.cc44
1 files changed, 28 insertions, 16 deletions
diff --git a/gcc/ira-lives.cc b/gcc/ira-lives.cc
index bc84938..81af5c0 100644
--- a/gcc/ira-lives.cc
+++ b/gcc/ira-lives.cc
@@ -1214,6 +1214,32 @@ process_out_of_region_eh_regs (basic_block bb)
#endif
+/* Add conflicts for object OBJ from REGION landing pads using CALLEE_ABI. */
+static void
+add_conflict_from_region_landing_pads (eh_region region, ira_object_t obj,
+ function_abi callee_abi)
+{
+ ira_allocno_t a = OBJECT_ALLOCNO (obj);
+ rtx_code_label *landing_label;
+ basic_block landing_bb;
+
+ for (eh_landing_pad lp = region->landing_pads; lp ; lp = lp->next_lp)
+ {
+ if ((landing_label = lp->landing_pad) != NULL
+ && (landing_bb = BLOCK_FOR_INSN (landing_label)) != NULL
+ && (region->type != ERT_CLEANUP
+ || bitmap_bit_p (df_get_live_in (landing_bb),
+ ALLOCNO_REGNO (a))))
+ {
+ HARD_REG_SET new_conflict_regs
+ = callee_abi.mode_clobbers (ALLOCNO_MODE (a));
+ OBJECT_CONFLICT_HARD_REGS (obj) |= new_conflict_regs;
+ OBJECT_TOTAL_CONFLICT_HARD_REGS (obj) |= new_conflict_regs;
+ return;
+ }
+ }
+}
+
/* 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
@@ -1385,23 +1411,9 @@ process_bb_node_lives (ira_loop_tree_node_t loop_tree_node)
SET_HARD_REG_SET (OBJECT_TOTAL_CONFLICT_HARD_REGS (obj));
}
eh_region r;
- eh_landing_pad lp;
- rtx_code_label *landing_label;
- basic_block landing_bb;
if (can_throw_internal (insn)
- && (r = get_eh_region_from_rtx (insn)) != NULL
- && (lp = gen_eh_landing_pad (r)) != NULL
- && (landing_label = lp->landing_pad) != NULL
- && (landing_bb = BLOCK_FOR_INSN (landing_label)) != NULL
- && (r->type != ERT_CLEANUP
- || bitmap_bit_p (df_get_live_in (landing_bb),
- ALLOCNO_REGNO (a))))
- {
- HARD_REG_SET new_conflict_regs
- = callee_abi.mode_clobbers (ALLOCNO_MODE (a));
- OBJECT_CONFLICT_HARD_REGS (obj) |= new_conflict_regs;
- OBJECT_TOTAL_CONFLICT_HARD_REGS (obj) |= new_conflict_regs;
- }
+ && (r = get_eh_region_from_rtx (insn)) != NULL)
+ add_conflict_from_region_landing_pads (r, obj, callee_abi);
if (sparseset_bit_p (allocnos_processed, num))
continue;
sparseset_set_bit (allocnos_processed, num);