This is a question about writing compilers. I need to design an IR. Mine is for a pure functional + imperative language. What currently seems popular is SSA with block parameters, not phi nodes, which at least handles the imperative side of my language. My special concern is supporting efficient compile time evaluation (as well as partial evaluation). I guess I want the IR to be a compromise between supporting a fast interpreter (for compile time evaluation) vs supporting conventional compiler optimizations. Does anybody have experience with this?