Commit c724f89
committed
feat(ir): absorb the magic-do thunk into early-split effect workers (#265)
An Effect/ST action of two or more real arguments is saturated at that
arity before magic-do runs, so the uncurrying worker/wrapper split fires
at the real arity and magic-do afterwards rewrites the worker's body into
the nullary thunk an Effect value is. Every fully applied statement site
then allocates that thunk and immediately forces it, two Lua calls with a
closure in between. The late uncurry run cannot repair it: it splits
manifest lambda chains, and the thunk is inside a worker that is already
n-ary.
absorbEffectThunk widens such a worker in place — the thunk's parameter
joins its parameter list, its body becomes the worker's body — and
rewrites every forced site w(a...)(run) to the single call w(a..., run),
still an effect run by its trailing marker. Each wrapper delegating to
the worker grows one parameter, which the delegate passes on, so a
partial application still evaluates to a closure.
The precondition is that every reference is a forced site or such a
delegate, with at least one forced site: the Lua backend drops the
worker's trailing unused parameter run, so any other reference the wider
arity leaves under-applied would become a saturated Lua call and run the
effect at construction time.
Absorbing the marker also makes a recursive driver's self-call a genuine
tail call, so the native-loop lowering turns it into a Lua while loop.
Bench.EffectStep2 gains 1.22x under PUC Lua 5.1 and 1.28x under LuaJIT;
Bench.EffectStep, whose two-argument driver is the same case, gains
1.10x/1.14x, and both trace reports lose their thunk-allocation aborts
with the driver ending as a compiled ILOOP.
The pass runs last, after the late uncurry run and the dce that follows
it: nothing later moves a call, so the reference census is final, and the
wrappers whose sites all went to their workers are already gone.1 parent 79209b1 commit c724f89
15 files changed
Lines changed: 913 additions & 306 deletions
File tree
- bench/goldens
- changelog.d
- lib/Language/PureScript/Backend/IR
- test
- Language/PureScript/Backend/IR/AbsorbEffectThunk
- ps/output
- Golden.EffectWorkerThunk.Test
- Golden.NativeLoopsGuard.Test
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
13 | 13 | | |
14 | 14 | | |
15 | 15 | | |
16 | | - | |
17 | | - | |
18 | | - | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
12 | 12 | | |
13 | 13 | | |
14 | 14 | | |
15 | | - | |
16 | | - | |
| 15 | + | |
17 | 16 | | |
18 | | - | |
19 | | - | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
3 | 3 | | |
4 | 4 | | |
5 | 5 | | |
6 | | - | |
7 | | - | |
| 6 | + | |
8 | 7 | | |
9 | 8 | | |
10 | 9 | | |
11 | 10 | | |
12 | 11 | | |
13 | 12 | | |
14 | 13 | | |
15 | | - | |
16 | | - | |
| 14 | + | |
17 | 15 | | |
18 | 16 | | |
19 | 17 | | |
20 | | - | |
| 18 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
3 | 3 | | |
4 | 4 | | |
5 | 5 | | |
6 | | - | |
7 | | - | |
8 | | - | |
| 6 | + | |
9 | 7 | | |
10 | 8 | | |
11 | 9 | | |
12 | 10 | | |
13 | 11 | | |
14 | 12 | | |
15 | 13 | | |
16 | | - | |
17 | | - | |
18 | | - | |
| 14 | + | |
19 | 15 | | |
20 | 16 | | |
21 | 17 | | |
22 | | - | |
| 18 | + | |
Lines changed: 83 additions & 0 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
| 27 | + | |
| 28 | + | |
| 29 | + | |
| 30 | + | |
| 31 | + | |
| 32 | + | |
| 33 | + | |
| 34 | + | |
| 35 | + | |
| 36 | + | |
| 37 | + | |
| 38 | + | |
| 39 | + | |
| 40 | + | |
| 41 | + | |
| 42 | + | |
| 43 | + | |
| 44 | + | |
| 45 | + | |
| 46 | + | |
| 47 | + | |
| 48 | + | |
| 49 | + | |
| 50 | + | |
| 51 | + | |
| 52 | + | |
| 53 | + | |
| 54 | + | |
| 55 | + | |
| 56 | + | |
| 57 | + | |
| 58 | + | |
| 59 | + | |
| 60 | + | |
| 61 | + | |
| 62 | + | |
| 63 | + | |
| 64 | + | |
| 65 | + | |
| 66 | + | |
| 67 | + | |
| 68 | + | |
| 69 | + | |
| 70 | + | |
| 71 | + | |
| 72 | + | |
| 73 | + | |
| 74 | + | |
| 75 | + | |
| 76 | + | |
| 77 | + | |
| 78 | + | |
| 79 | + | |
| 80 | + | |
| 81 | + | |
| 82 | + | |
| 83 | + | |
0 commit comments