I've always wondered why more compilers don't use parameters with basic blocks rather than phi nodes.
I enjoyed this post discussing tradeoffs, including comments on how GHC and Swift model blocks:
miniblog.
Related Posts
Implementing interactive languages, and the tradeoffs of interpreters, JIT compilers, and AOT compilers:
Interpreters versus compilers as a spectrum, and a fun worked example of optimising Brainfuck:
It's strange how AOT compilers usually have different modes for optimising time or space usage, but JITs rarely have modes like "prefer fast startup".
The vast majority of JITs seem to focus on runtime of hot code after warming up.