In SSA form, you only need on value, not a list of values, for each variable.You can also number single-assignment variables by number, rather than by name, and so use simple arrays rather than hashtables to store the results.
If I was designing a compiler frontend and optimizer/backend in concert I would definitely use it unless some other constraint prevented it.
In addition to not having to generate a non-SSA program and then immediately throw it away, it allows you to do basic optimizations during SSA construction that you would probably do immediately after constructing SSA anyways.
OK, english version: in program analysis, you want to know the value of a variable, so you create a "def-use chain" which connects a definition of a variable to all of its uses.
In some cases, you might have very many uses and definitions, esp of the same variable. In SSA form, each variable is only defined once, so you dont get pathological cases here.
I'm basing some of this on a fun paper I wrote ( and stealing directly from my Ph D thesis ( section 3.3)Factored use-def chain: With a def-use chain, dataflow results may be propagated directly from the assignment of a variable to all of its uses.
However, a def-use chain requires an edge from each definition to each use, which may be expensive when a program has many definitions and uses of the same variable.Flow-sensitivity: A flow-insensitive algorithm performed on an SSA form is much more precise than if SSA form were not used.The flow-insensitive problem of multiple definitions to the same variable is solved by the single assignment property.I'm mostly wondering whether there are any non-obvious "gotchas" that aren't apparent to me as a non-expert.1. a well-regarded folklore algorithm, although that paper is the first publication with a detailed analysis.Without SSA, you might have more definitions of that variable, and so not know it's exact value, type, etc, when you go to use it.Without SSA form, to get that data you'd have to analyse the flow of the program (look at loops and if statements, etc).The allows a flow-insensitive algorithm to approach the precision of a flow-sensitive algorithm.English version: if you put something in SSA form, you can connect the use of a value directly to its definition (since it's only defined once, with one value).You can write compilers without, but for most optimizations you'll need to convert to SSA. what makes SSA so special for compiler construction It makes doing immutability and loop invariant reasoning a ton easier, along with constant propagation: https://en.wikipedia.org/wiki/Static_single_assignment_form More generally, SSA means implicit use/def information.Use/def information and traversal are critical components of many static analyses and transformations: having the IR in SSA form greatly simplifies reasoning about and implementing these analyses and transformations.