• Jan Stolarek's avatar
    Generate (old + 0) instead of Sp in stack checks · 94125c97
    Jan Stolarek authored
    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.
StgCmmHeap.hs 21.8 KB