静态单一赋值(附相关示例)
静态单一分配由 Barry K. Rosen、Mark N、Wegman 和 F. Kenneth Zadeck 于 1988 年提出。
在编译器设计中,静态单一赋值(简称 SSA)是一种结构化 IR(中间表示)的方法,这样每个变量只分配一次值,并且每个变量在使用之前都被定义。 SSA 的主要用途是简化和改进编译器优化算法的结果,同时通过简化变量属性。通过应用 SSA 改进了一些算法 –
- 不断传播——
将计算从运行时转换为编译时。例如——指令 v = 2*7+13 被视为 v = 27 - 价值范围传播 –
查找计算可能导致的值的可能范围。 - 死代码消除 –
删除无法访问且不会对结果产生任何影响的代码。 - 强度降低 -
用廉价的计算代替计算上昂贵的计算。 - 注册分配 -
优化使用寄存器进行计算。
任何代码都可以转换为 SSA 形式,只需简单地将每个代码段的目标变量替换为新变量,并将变量的每次使用都替换为到达该点的新版本的变量。版本是通过拆分 IR 中存在的原始变量来创建的,并由带有下标的原始名称表示,这样每个变量都有自己的版本。
示例 #1:
将以下代码段转换为 SSA 形式:
x = y - z
s = x + s
x = s + p
s = z * q
s = x * s
解决方案:
x = y - z
s2 = x + s
x2 = s2 + p
s3 = z * q
s4 = x2 * s3
这里 x,y,z,s,p,q 是原始变量,x 2 , s 2 , s 3 , s 4是 x 和 s 的版本。
示例 #2:
将以下代码段转换为 SSA 形式:
a = s - b
q = a * e
a = q + d
q = b - c
q = a * q
解决方案:
a = s - b
q = a * e
a2 = q + d
q2 = b - c
q3 = a2 * q2
这里 a,b,c,d,e,q,s 是原始变量,a 2 , q 2 , q 3是 a 和 q 的版本。