Register banks

What do register banks do that could not have been done by enhancing register classes? Is it a matter of separation of concerns?

As far as I have understood it, register banks gives the ability of analyzing
and making a partial register assignment before selecting the instructions. In
SelectionISel, instructions are selecting without taking any consideration to
register classes, which could potentially result in code with excess copying
between register classes.

This problem can be indeed resolved by adding more abstract forms of register
banks; this is actually what we currently do for our target. Register banks
just gives a uniform way of handling it.