diff options
author | Vladimir N. Makarov <vmakarov@redhat.com> | 2023-08-17 11:57:45 -0400 |
---|---|---|
committer | Vladimir N. Makarov <vmakarov@redhat.com> | 2023-08-17 12:01:49 -0400 |
commit | bd7257f08c9b18bdd66a59bff2e02801a8aaf340 (patch) | |
tree | fffbac0cfcb0a271f931837fdb40008ca05ff14d | |
parent | e1f45bea2741c271efbc4c2f9dfad93cbcd644c0 (diff) | |
download | gcc-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.cc | 3 |
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]); |