Improve sinking pass
authorJan Stolarek <jan.stolarek@p.lodz.pl>
Thu, 12 Sep 2013 13:29:37 +0000 (14:29 +0100)
committerJan Stolarek <jan.stolarek@p.lodz.pl>
Thu, 12 Sep 2013 16:04:41 +0000 (17:04 +0100)
commitad15c2b4bd37082ce989268b3d2f86a2cd34386a
tree7e72bd4792691f93f27ae8bae6589963755c4cf7
parent66aa489fcbfca30dc3c3b553fce4f1e4debfb7c1
Improve sinking pass

This commit does two things:

  * Allows duplicating of global registers and literals by inlining
    them. Previously we would only inline global register or literal
    if it was used only once.

  * Changes method of determining conflicts between a node and an
    assignment. New method has two advantages. It relies on
    DefinerOfRegs and UserOfRegs typeclasses, so if a set of registers
    defined or used by a node should ever change, `conflicts` function
    will use the changed definition. This definition also catches
    more cases than the previous one (namely CmmCall and CmmForeignCall)
    which is a step towards making it possible to run sinking pass
    before stack layout (currently this doesn't work).

This patch also adds a lot of comments that are result of about two-week
long investigation of how sinking pass works and why it does what it does.
compiler/cmm/CmmLayoutStack.hs
compiler/cmm/CmmPipeline.hs
compiler/cmm/CmmSink.hs