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:
https://blog.ezyang.com/2020/10/the-hidden-problem-with-basic-block-procedures-in-ssa/