diff options
author | Sebastian Graf <sebastian.graf@kit.edu> | 2022-02-28 14:52:36 +0100 |
---|---|---|
committer | Marge Bot <ben+marge-bot@smart-cactus.org> | 2022-03-13 18:12:48 -0400 |
commit | 76b94b726f6e21bb2a46ae04e4a1be2cba45a3dc (patch) | |
tree | 8db126a5c8718140a6cd7bdd8f3a20df257f580c /compiler/profiling-notes | |
parent | ad83553153278947f439951d79a842527f2f0983 (diff) | |
download | haskell-76b94b726f6e21bb2a46ae04e4a1be2cba45a3dc.tar.gz |
Worker/wrapper: Preserve float barriers (#21150)
Issue #21150 shows that worker/wrapper allocated a worker function for a
function with multiple calls that said "called at most once" when the first
argument was absent. That's bad!
This patch makes it so that WW preserves at least one non-one-shot value lambda
(see `Note [Preserving float barriers]`) by passing around `void#` in place of
absent arguments.
Fixes #21150.
Since the fix is pretty similar to `Note [Protecting the last value argument]`,
I put the logic in `mkWorkerArgs`. There I realised (#21204) that
`-ffun-to-thunk` is basically useless with `-ffull-laziness`, so I deprecated
the flag, simplified and split into `needsVoidWorkerArg`/`addVoidWorkerArg`.
SpecConstr is another client of that API.
Fixes #21204.
Metric Decrease:
T14683
Diffstat (limited to 'compiler/profiling-notes')
0 files changed, 0 insertions, 0 deletions