SSA
wikipedia上关于SSA的定义如下:
In compiler design, static single assignment form (often abbreviated as SSA form or simply SSA) is a property of an intermediate representation (IR), which requires that each variable be assigned exactly once, and every variable be defined before it is used.
Existing variables in the original IR are split into versions, new variables typically indicated by the original name with a subscript in textbooks, so that every definition gets its own version. In SSA form, use-def chains are explicit and each contains a single element.
翻译下来就是,编译器设计中的一种概念,是静态单赋值范式的简称,是中间表达IR的一种属性,该属性要求每个变量只能赋值一次,并且必须在使用前进行赋值。“赋值”这个概念在编译器领域和“定义”是一个概念,所以真实编程语言中的各种变量,如果存在多次赋值并且多次引用不同赋值的情况的话,每次会被引用的赋值会产生一个新的变量(为了方便记忆,新的变量可以是老的变量名加上下标的方式来命名),而那些赋值了却没有引用,或者在多次赋值之间没有引用语句的前一次赋值,会自动被编译器优化掉。
在计算图(一般也称为DAG,Directed Acyclic Graph,有向无环图)中,每个节点需要先定义,再使用,也就是说,每个节点的生命周期是Def-Use的过程。但节点间的关系就是每个节点先Use其他节点的值,然后生成自己的定义,并把自己的定义提供给下一个节点进行Use的过程,Use-Def-Use的关系。
例如下面从C代码:
1 x=1; 2 y=2; 3 x=y+1; 4 z=x*y; 5 a=z+1;
第一轮转换的过程中变成了下面的代码:
1 x1=1; 2 y1=2; 3 x2=y1+1; 4 z1=x2*y1; 5 a1=z1+1;
按照SSA的原则,x1赋值之后没有使用,所以是无用代码,最终按SSA规范优化之后的代码是:
1 y1=2; 2 x2=y1+1; 3 z1=x2*y1; 4 a1=z1+1;
而且,很明显的x2和y1在第三行是最后一次引用,在第三行执行完x2和y1的资源就可以释放了。