It seems a shame that all these different users of LLVM are having to do their own IR. Tools like RPython and Truffle don't seem to need language-specific IRs to perform well. Why does LLVM? Could it at least be made into a single shared LLVM-IR project?
RPython and Truffle essentially derive language-specific IRs from a specification of an interpreter, with RPython using meta-tracing and Truffle using traditional partial evaluation.
RPython's technique also only works for JITs, and neither Swift nor Rust use a JIT in their normal compilation pipeline. Generation of compilers by partial evaluation of an interpreter is interesting, but as far as I know it has never been used in an industrial strength implementation of a language.
Yeah, the basic block arguments are nice. The one thing that would complicate their use in a low-level IR is that they are awkward in cases where you want to pass different arguments to different successors. If you don't want every control-flow transfer instruction to pass additional per-target args then you have to split edges, but you may have edges that you can't or don't want to split.
It's a little frightening that they talk about reimplementing Swift and reusing code and all that, then if you dig deeply enough you find that in their language, collections and strings are reference types, not value types. That's a huge difference and makes their language decidedly not Swift.
HIR: https://github.com/rust-lang/rfcs/blob/master/text/1191-hir....
MIR: https://github.com/rust-lang/rfcs/blob/master/text/1211-mir....