aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVladimir N. Makarov <vmakarov@redhat.com>2023-08-17 11:57:45 -0400
committerVladimir N. Makarov <vmakarov@redhat.com>2023-08-17 12:01:49 -0400
commitbd7257f08c9b18bdd66a59bff2e02801a8aaf340 (patch)
treefffbac0cfcb0a271f931837fdb40008ca05ff14d
parente1f45bea2741c271efbc4c2f9dfad93cbcd644c0 (diff)
downloadgcc-bd7257f08c9b18bdd66a59bff2e02801a8aaf340.zip
gcc-bd7257f08c9b18bdd66a59bff2e02801a8aaf340.tar.gz
gcc-bd7257f08c9b18bdd66a59bff2e02801a8aaf340.tar.bz2
[LRA]: When assigning stack slots to pseudos previously assigned to fp consider other spilled pseudos
The previous LRA patch can assign slot of conflicting pseudos to pseudos spilled after prohibiting fp->sp elimination. This patch fixes this problem. gcc/ChangeLog: * lra-spills.cc (assign_stack_slot_num_and_sort_pseudos): Moving slots_num initialization from here ... (lra_spill): ... to here before the 1st call of assign_stack_slot_num_and_sort_pseudos. Add the 2nd call after fp->sp elimination.
-rw-r--r--gcc/lra-spills.cc3
1 files changed, 2 insertions, 1 deletions
diff --git a/gcc/lra-spills.cc b/gcc/lra-spills.cc
index 7e1d35b..a663a19 100644
--- a/gcc/lra-spills.cc
+++ b/gcc/lra-spills.cc
@@ -363,7 +363,6 @@ assign_stack_slot_num_and_sort_pseudos (int *pseudo_regnos, int n)
{
int i, j, regno;
- slots_num = 0;
/* Assign stack slot numbers to spilled pseudos, use smaller numbers
for most frequently used pseudos. */
for (i = 0; i < n; i++)
@@ -628,6 +627,7 @@ lra_spill (void)
/* Sort regnos according their usage frequencies. */
qsort (pseudo_regnos, n, sizeof (int), regno_freq_compare);
n = assign_spill_hard_regs (pseudo_regnos, n);
+ slots_num = 0;
assign_stack_slot_num_and_sort_pseudos (pseudo_regnos, n);
for (i = 0; i < n; i++)
if (pseudo_slots[pseudo_regnos[i]].mem == NULL_RTX)
@@ -635,6 +635,7 @@ lra_spill (void)
if ((n2 = lra_update_fp2sp_elimination (pseudo_regnos)) > 0)
{
/* Assign stack slots to spilled pseudos assigned to fp. */
+ assign_stack_slot_num_and_sort_pseudos (pseudo_regnos, n2);
for (i = 0; i < n2; i++)
if (pseudo_slots[pseudo_regnos[i]].mem == NULL_RTX)
assign_mem_slot (pseudo_regnos[i]);