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.