https://gcc.gnu.org/bugzilla/show_bug.cgi?id=104686

Richard Biener <rguenth at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
     Ever confirmed|0                           |1
   Last reconfirmed|                            |2022-03-01
             Status|UNCONFIRMED                 |NEW

--- Comment #15 from Richard Biener <rguenth at gcc dot gnu.org> ---
So we have a lot of allocnos and do

      Popping a2027(r13053,l1)  --         assign reg 46
      Popping a2217(r12829,l1)  --         assign reg 46
      Popping a2407(r12603,l1)  --         assign reg 45
      Popping a2015(r162,l1)  --         assign reg 48
...

thus pop_allocnos_from_stack () which will eventually call
assign_hard_reg (allocno, false) which then calls
update_conflict_hard_regno_costs twice for the ALLOCNO_CLASS.

I wonder if it makes sense to pop allocnos of the same class w/o updating
the hard regno cost and do the update only after each such group.

I know nothing about IRA but

diff --git a/gcc/ira-color.cc b/gcc/ira-color.cc
index 8b6db1bb417..3a531c0e537 100644
--- a/gcc/ira-color.cc
+++ b/gcc/ira-color.cc
@@ -2905,7 +2905,11 @@ pop_allocnos_from_stack (void)
          if (internal_flag_ira_verbose > 3 && ira_dump_file != NULL)
            fprintf (ira_dump_file, "assign memory\n");
        }
-      else if (assign_hard_reg (allocno, false))
+      else if (assign_hard_reg (allocno,
+                               allocno_stack_vec.is_empty ()
+                               || (ALLOCNO_CLASS (allocno_stack_vec.last ())
+                                   != aclass)
+                               ? false : true))
        {
          if (internal_flag_ira_verbose > 3 && ira_dump_file != NULL)
            fprintf (ira_dump_file, "        assign reg %d\n",

speeds up compilation (with -O0 cc1) to

 integrated RA                      :   5.27 ( 29%)   0.27 ( 13%)   5.67 ( 28%)
 3429k ( 11%)
 TOTAL                              :  18.26          2.02         20.52       
   31M

from

 integrated RA                      :  74.11 ( 94%)   0.02 ( 29%)  74.67 ( 94%)
 3429k ( 11%)
 TOTAL                              :  78.73          0.07         79.39       
   31M

on the partially reduced testcase.

Maybe that's too aggressive of course.  From the dump we also see we
assign the same hardreg to adjacent popped allocnos so maybe that's
another way to "group" the cost adjustments:

      Popping a20939(r7366,l0: a16841(r7366,l1: a8854(r7366,l2)))  --        
assign reg 50
      Popping a20951(r7347,l0: a16853(r7347,l1: a8866(r7347,l2)))  --        
assign reg 50
...  172 times assigning reg 50
      Popping a21383(r6857,l0: a17285(r6857,l1: a9298(r6857,l2)))  --        
assign reg 50

Reply via email to