Static single assignment for functional programmers (2011)
wingolog.org
wingolog.org
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.