вс, 12 янв. 2025 г. в 15:38, Georg-Johann Lay <a...@gjlay.de>:
>
> Am 11.01.25 um 19:15 schrieb Denis Chertykov:
> > The fix for PR117868.
> > [...]
> >
> >      PR rtl-optimization/117868
> > gcc/
> >      * lra-spills.cc (assign_stack_slot_num_and_sort_pseudos): Reuse slots
> >      only without allocated memory or only with equal or smaller registers
> >      with equal or smaller alignment.
> >      (lra_spill): Print slot size as width.
> >
> >
> > diff --git a/gcc/lra-spills.cc b/gcc/lra-spills.cc
> > index db78dcd28a3..93a0c92db9f 100644
> > --- a/gcc/lra-spills.cc
> > +++ b/gcc/lra-spills.cc
> > @@ -386,7 +386,18 @@ assign_stack_slot_num_and_sort_pseudos (int
> > *pseudo_regnos, int n)
> >           && ! (lra_intersected_live_ranges_p
> >                 (slots[j].live_ranges,
> >                  lra_reg_info[regno].live_ranges)))
> > -          break;
> > +          {
> > +        /* A slot without allocated memory can be shared.  */
> > +        if (slots[j].mem == NULL_RTX)
> > +          break;
> > +
> > +        /* A slot with allocated memory can be shared only with equal
> > +           or smaller register with equal or smaller alignment.  */
> > +        if (slots[j].align >= spill_slot_alignment (mode)
> > +            && compare_sizes_for_sort (slots[j].size,
> > +                           GET_MODE_SIZE (mode)) != -1)
> > +          break;
> > +          }
> >       }
> >         if (j >= slots_num)
> >       {
> > @@ -656,8 +667,7 @@ lra_spill (void)
> >         for (i = 0; i < slots_num; i++)
> >       {
> >         fprintf (lra_dump_file, "  Slot %d regnos (width = ", i);
> > -      print_dec (GET_MODE_SIZE (GET_MODE (slots[i].mem)),
> > -             lra_dump_file, SIGNED);
> > +      print_dec (slots[i].size, lra_dump_file, SIGNED);
> >         fprintf (lra_dump_file, "):");
> >         for (curr_regno = slots[i].regno;;
> >              curr_regno = pseudo_slots[curr_regno].next - pseudo_slots)
> >
>
> Trying to apply this, I am getting:
>
> .../gcc$ patch -p2 <  ~/gnu/patches/pr117868.diff
> patching file lra-spills.cc
> Hunk #1 FAILED at 386.
> Hunk #2 FAILED at 656.
> 2 out of 2 hunks FAILED -- saving rejects to file lra-spills.cc.rej
>
> Maybe it's because in the mail TABs have been replaced by spaces?

Maybe.
Regenerated against the updated git tree in the attachment.

Denis.
PS: I'm using Thunderbird for sending emails with patches.
    According to this guide:
https://www.kernel.org/doc/html/v4.14/process/email-clients.html
    Maybe you can suggest a better method ?
diff --git a/gcc/lra-spills.cc b/gcc/lra-spills.cc
index db78dcd28a3..93a0c92db9f 100644
--- a/gcc/lra-spills.cc
+++ b/gcc/lra-spills.cc
@@ -386,7 +386,18 @@ assign_stack_slot_num_and_sort_pseudos (int *pseudo_regnos, int n)
 		&& ! (lra_intersected_live_ranges_p
 		      (slots[j].live_ranges,
 		       lra_reg_info[regno].live_ranges)))
-	      break;
+	      {
+		/* A slot without allocated memory can be shared.  */
+		if (slots[j].mem == NULL_RTX)
+		  break;
+
+		/* A slot with allocated memory can be shared only with equal
+		   or smaller register with equal or smaller alignment.  */
+		if (slots[j].align >= spill_slot_alignment (mode)
+		    && compare_sizes_for_sort (slots[j].size,
+					       GET_MODE_SIZE (mode)) != -1)
+		  break;
+	      }
 	}
       if (j >= slots_num)
 	{
@@ -656,8 +667,7 @@ lra_spill (void)
       for (i = 0; i < slots_num; i++)
 	{
 	  fprintf (lra_dump_file, "  Slot %d regnos (width = ", i);
-	  print_dec (GET_MODE_SIZE (GET_MODE (slots[i].mem)),
-		     lra_dump_file, SIGNED);
+	  print_dec (slots[i].size, lra_dump_file, SIGNED);
 	  fprintf (lra_dump_file, "):");
 	  for (curr_regno = slots[i].regno;;
 	       curr_regno = pseudo_slots[curr_regno].next - pseudo_slots)

Reply via email to