https://gcc.gnu.org/g:cebbaa2a84586a7345837f74a53b7a0263bf29ee

commit r14-9401-gcebbaa2a84586a7345837f74a53b7a0263bf29ee
Author: Vladimir N. Makarov <vmaka...@redhat.com>
Date:   Fri Mar 8 14:48:33 2024 -0500

    [PR113790][LRA]: Fixing LRA ICE on riscv64
    
      LRA failed to consider all insn alternatives when non-reload pseudo
    did not get a hard register.  This resulted in failure to generate
    code by LRA.  The patch fixes this problem.
    
    gcc/ChangeLog:
    
            PR target/113790
            * lra-assigns.cc (assign_by_spills): Set up all_spilled_pseudos
            for non-reload pseudo too.

Diff:
---
 gcc/lra-assigns.cc | 20 +++++++++++++-------
 1 file changed, 13 insertions(+), 7 deletions(-)

diff --git a/gcc/lra-assigns.cc b/gcc/lra-assigns.cc
index d1b2b35ffc9..7dfa6f70941 100644
--- a/gcc/lra-assigns.cc
+++ b/gcc/lra-assigns.cc
@@ -1430,13 +1430,19 @@ assign_by_spills (void)
            hard_regno = spill_for (regno, &all_spilled_pseudos, iter == 1);
          if (hard_regno < 0)
            {
-             if (reload_p) {
-               /* Put unassigned reload pseudo first in the
-                  array.  */
-               regno2 = sorted_pseudos[nfails];
-               sorted_pseudos[nfails++] = regno;
-               sorted_pseudos[i] = regno2;
-             }
+             if (reload_p)
+               {
+                 /* Put unassigned reload pseudo first in the array.  */
+                 regno2 = sorted_pseudos[nfails];
+                 sorted_pseudos[nfails++] = regno;
+                 sorted_pseudos[i] = regno2;
+               }
+             else
+               {
+                 /* Consider all alternatives on the next constraint
+                    subpass.  */
+                 bitmap_set_bit (&all_spilled_pseudos, regno);
+               }
            }
          else
            {

Reply via email to