Skip to content

Extract loops from toplevel function into helper functions#2245

Open
vouillon wants to merge 2 commits into
masterfrom
loops-intermediate
Open

Extract loops from toplevel function into helper functions#2245
vouillon wants to merge 2 commits into
masterfrom
loops-intermediate

Conversation

@vouillon
Copy link
Copy Markdown
Member

Extract outermost loops of the entry function into helper closures, so engines tier up the small helpers instead of the giant initialization code. The pass benefits both JavaScript and WebAssembly output.

@vouillon vouillon changed the title Compiler: add loop hoisting at the Code IR level Extract loops from toplevel function into helper functions May 21, 2026
@vouillon vouillon force-pushed the loops-intermediate branch 3 times, most recently from a3449b6 to 397fa09 Compare May 21, 2026 17:00
The [no_code_pointer] optimisation gives some closures a different
env type body (no supertype, no function-ref field). At the
registration sites, [arity] was normalised to 0 for these closures,
so they registered as [cps_env_0_<id>] / [env_0_<id>]. That was not
sufficient, though: a genuine arity-0 closure with a code pointer
registers the very same name with an incompatible (with-supertype,
function-ref-bearing) body. The two clashed — the first one to
register won, and the loser emitted a [struct.new] inconsistent
with the recorded type.

Loop hoisting and CPS-mode effect handlers are two natural sources
of arity-0 closures, making the collision easy to trigger.

Drop the arity from the type name when there is no code pointer
(arity is implicit in that case, since the struct has no function-ref
field). The [arity = 0] normalisation is then redundant in
[Closure.bind_environment]; in [Closure.translate] the same applies,
with [need_curry_fun] guarded directly on [no_code_pointer] so no
unused curry function is emitted.
Extract outermost loops of the entry function into helper closures, so
engines tier up the small helpers instead of the giant initialization
code. The pass benefits both JavaScript and WebAssembly output.
@vouillon vouillon force-pushed the loops-intermediate branch from 397fa09 to 5b45df5 Compare May 22, 2026 10:09
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant