joinToTargets to emit fixup code even when movement graph contains cycles
authorClemens Fruhwirth <clemens@endorphin.org>
Sat, 14 Jul 2007 08:32:41 +0000 (08:32 +0000)
committerClemens Fruhwirth <clemens@endorphin.org>
Sat, 14 Jul 2007 08:32:41 +0000 (08:32 +0000)
commit64f0661e56ca19214aed9c917612aeaa125253c6
tree3729837b89356ab1aa9cffed90f849a83ef3aae5
parent57a4597d5a487af65d0a6c9a6701e2efcbbefac2
joinToTargets to emit fixup code even when movement graph contains cycles

First, cycles can only start of with registers and their destination
must involve a register location. This is because memory locations are
allocated exclusively for a virtual register and hence can never cause
a conflict in the assignment, hence need no fixup code. Therefore, we
only have to deal with InReg -> InReg, or InReg -> InReg/InMem
movements.

The strategy is to take the first cycle element, which is guaranteed
to start with a register, spill it to a fresh memory location, compute
the fixup for the rest, and restore from the spill slot to its
destinations. The "rest" will degenerate into an acyclic scc, so we do
not need take care of the empty list case in CyclicScc.
 ***END OF DESCRIPTION***

Place the long patch description above the ***END OF DESCRIPTION*** marker.
The first line of this file will be the patch name.

This patch contains the following changes:

M ./compiler/nativeGen/RegisterAlloc.hs -6 +27
compiler/nativeGen/RegisterAlloc.hs