On 08/08/2011 10:06 AM, Richard Guenther wrote:
Like if
register unsigned char *ip;
would increase spill cost of ip compared to
unsigned char *ip;
?
Remember we're talking about a function with 11000 pseudos and 4000
allocnos (not to mention a 1500 basic blocks). You cannot really blame
IRA for not doing the right thing. And actually, ip and sp are live
everywhere, so there's no hope of reserving a register for them,
especially since all x86 callee-save registers have special uses in
string functions.
If I understand the huge dumps correctly, the missing part is trying to
use callee-save registers for spilling, rather than memory. However,
perhaps another way to do it is a specialized region management scheme
for large switch statements, treating each switch arm as a separate
region?? There are few registers live across the switch, and all of
them are used either "a lot" or "almost never" (and always in cold blocks).
BTW, here are some measurements on x86-64:
1) with regalloc hints: 450060432 bytecodes/sec; 12819996 calls/sec
2) without regalloc hints: 263002439 bytecodes/sec; 9458816 sends/sec
Probably even worse on x86-32.
None of -fira-region=all, -fira-region=one, -fira-algorithm=priority had
significant changes. In fact, it's pretty much a "binary" result: I'd
expect register allocation results to be either on par with (1) or
similar to (2); everything else is mostly noise.
Paolo