• Matthew Pickering's avatar
    rts: Do not traverse nursery for dead closures in LDV profile · 07cffc49
    Matthew Pickering authored
    It is important that `heapCensus` and `LdvCensusForDead` traverse the
    same areas.
    `heapCensus` increases the `not_used` counter which tracks how many
    closures are live but haven't been used yet.
    `LdvCensusForDead` increases the `void_total` counter which tracks how
    many dead closures there are.
    The `LAG` is then calculated by substracting the `void_total` from
    `not_used` and so it is essential that `not_used >= void_total`. This
    fact is checked by quite a few assertions.
    However, if a program has low maximum residency but allocates a lot in
    the nursery then these assertions were failing (see #16753 and #15903)
    because `LdvCensusForDead` was observing dead closures from the nursery
    which totalled more than the `not_used`. The same closures were not
    counted by `heapCensus`.
    Therefore, it seems that the correct fix is to make `LdvCensusForDead`
    agree with `heapCensus` and not traverse the nursery for dead closures.
    Fixes #16100 #16753 #15903 #8982
LdvProfile.c 6.61 KB