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.
HIR: https://github.com/rust-lang/rfcs/blob/master/text/1191-hir....
MIR: https://github.com/rust-lang/rfcs/blob/master/text/1211-mir....