Bernd Schmidt wrote:
Joern RENNECKE wrote:
Because the new code as of December actually updated life information
incorrectly, the global updates that were done had also quite a lot
of work to do (and didn't really do it right, because of the presence
of fake edges).
Could you elaborate on the problem with fake edges?
A fake edge is an edge from a node where there control might flow out of
the function (or not at all), e.g. a call to a noreturn function, to the
exit block. As far as I can tell, these are inserted for the
crossjumping pass so that we will cover matches involving such nodes, as
they otherwise might not have any successor.
The problem with doing live updates in the presence of fake edges is
that a number of registers are live in the exit block, in particular all
the call-saved registers with are restored in the epilogue (the epilogue
is a proper predecessor of the exit block, and the register restores are
kept live by marking these registers as live in the exit block).
If you do an live update while fake edges are present, the liveness of
registers in the exit block is propagated into the sources of the fake
edges, even though most or all of these registers
are not actually live there.