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

--- Comment #5 from Feng Xue <fxue at os dot amperecomputing.com> ---
>   I would say that top-down algorithm behaves better than bottom-up one.  I
> implemented Callahan-Koblentz (bottom-up algorithm) in GCC about 10 years
> ago and it behaved worse than the current one.  I think adding an additional
Intuitively, it's better to give preference to regions with higher frequency to
let them pick up registers earlier and with more freedom, which matches with
bottom-up coloring strategy.

> pass over regions probably would solve the problem but it will complicate
> already complicated RA (which is about 60K lines now). In any case I'll
> think about this problem.
> 
>   The problem you are mentioning in this code is quite insignificant (one
> memory access in the top most region).
But it will be significant inside multi-level loop. Actually, the problem is
exposed by a 8-level loop in a real Fortran application. 

>   
>   I also checked the attachments.  What I see is GCC generates a better big
> loop body (a loop with high register pressure).  GCC generated loop body has
> 50 x86-64 insns with 22 memory accesses vs 56 with 26 memory access for LLVM.
As far as how to spilling live range at loop boundary is concerned, gcc is not
very efficient. To make loop body not be the focus, when we remove two
live-range variables in original case, we can get same amount of memory
accesses for gcc and llvm, both of which generates 9 register spills in loop
body. I attached modified case and assembly files.

Reply via email to