This is very well written. I want to mention two other IL that takes SSA even closer to a functional representation:
thinned gated single-assignment (TGSA) form and the Value Dependence Graph.
I've used the former with pleasure as a lot of traditional passes become trivially done by construction: global common subexpression elimination, copy propagation, dead code elimination, and constant propagation. With very little extra work you also get strength reduction, expression hoisting, and a host of other things that I'm forgetting.
I never understood why this wasn't more popular as old-school SSA, as used by even LLVM, is so terribly clunky and inefficient.
I always love reading his blog posts. I honestly don't know how one finds the time to write that well at that length and still turn out guile et al., plus whatever his "day job" is.
I've used the former with pleasure as a lot of traditional passes become trivially done by construction: global common subexpression elimination, copy propagation, dead code elimination, and constant propagation. With very little extra work you also get strength reduction, expression hoisting, and a host of other things that I'm forgetting.
I never understood why this wasn't more popular as old-school SSA, as used by even LLVM, is so terribly clunky and inefficient.