Generate (old + 0) instead of Sp in stack checks
authorJan Stolarek <jan.stolarek@p.lodz.pl>
Wed, 16 Oct 2013 07:45:56 +0000 (09:45 +0200)
committerJan Stolarek <jan.stolarek@p.lodz.pl>
Wed, 16 Oct 2013 11:04:45 +0000 (13:04 +0200)
commit94125c97e49987e91fa54da6c86bc6d17417f5cf
tree28f14168e453b5545edd64c394c35e1ce38819bb
parentcb0fd91a57014ce28edaa9dbf6e6d1fd2cc95875
Generate (old + 0) instead of Sp in stack checks

When compiling a function we can determine how much stack space it will
use. We therefore need to perform only a single stack check at the beginning
of a function to see if we have enough stack space. Instead of referring
directly to Sp - as we used to do in the past - the code generator uses
(old + 0) in the stack check. Stack layout phase turns (old + 0) into Sp.

The idea here is that, while we need to perform only one stack check for
each function, we could in theory place more stack checks later in the
function. They would be redundant, but not incorrect (in a sense that they
should not change program behaviour). We need to make sure however that a
stack check inserted after incrementing the stack pointer checks for a
respectively smaller stack space. This would not be the case if the code
generator produced direct references to Sp. By referencing (old + 0) we make
sure that we always check for a correct amount of stack: when converting
(old + 0) to Sp the stack layout phase takes into account changes already
made to stack pointer. The idea for this change came from observations made
while debugging #8275.
compiler/cmm/CmmLayoutStack.hs
compiler/codeGen/StgCmmHeap.hs