Created originally on Bitbucket by plan_rich (Richard Plangger)
During the sprint in Leysin (2016) Remi and I have refactored the register allocator. The most notably change is to take call sites into account and prefer callee saved regsiters for live ranges that survive the call site. Another change was that live ranges do not change the register they are assigned to, unless a spilling operation takes place. Before that a live range could just change the assigned register at e.g. a int_add operation. The last property described can make reasoning a lot easier, but currently seems to generate some more moves (registers).
There where some gains and some losses at others. So it was around +/- 1%.
We still think there is more that can be improved going the following way:
Live range splits. This is the most sensible feature we need to implement! Because of unroll we can have very very long live ranges that allocate a register. We probably want to split them be for entering the peeled loop.
The changes are located in the branch fix-longevity.