The next step after improving the spill heuristics is likely to be one of the following: * Spilling context registers directly to the context * Adding a few more primitives (String>>at: and return true, false, or nil) * More work on speeding up compilation * More bug chasing.
There's two reasons to want to spill context registers directly into the context rather than onto the C stack. First it'll reduce memory traffic for sends with many arguments or a deep stack. At the moment the entire stack is copied from the context into registers when the method is entered (and possibly spilled on the C stack) then copied back onto the context on exit. For send heavy code this can lead to code that reads the stack into registers to immediately write it back out again. This is especially wasteful if that section of code doesn't use any of the stack variables copied. The second reason is to allow temporaries and arguments to be held in registers, if they're moved into registers then it's likely there will be more spilling as the x86 only has 6 registers available for general use.
The compiler benchmark can try to inline String>>at: and the large explorers benchmark can try to inline return true and false. Not having these primitives may be causing Exupery to be slower for some parts of both benchmarks than the interpreter. These primitives are inlined into the main interpretation function so are especially efficient to interpret.
Compilation of large methods has been sped up significantly but medium and small methods have only smaller gains. Further performance gains would be nice, if only to make it faster to run larger acceptance tests.
Exupery is currently reliable just enough to develop with. I saw a crash after a few hours of Seaside development. This is barely good enough as it's easy to recover using the changes file. I don't know how to reproduce that crash so haven't tried to debug it.
Bryce
exupery@lists.squeakfoundation.org