📜  静态单一赋值(附相关示例)

📅  最后修改于: 2022-05-13 01:57:01.573000             🧑  作者: Mango

静态单一赋值(附相关示例)

静态单一分配由 Barry K. Rosen、Mark N、Wegman 和 F. Kenneth Zadeck 于 1988 年提出。

在编译器设计中,静态单一赋值(简称 SSA)是一种结构化 IR(中间表示)的方法,这样每个变量只分配一次值,并且每个变量在使用之前都被定义。 SSA 的主要用途是简化和改进编译器优化算法的结果,同时通过简化变量属性。通过应用 SSA 改进了一些算法 –

  1. 不断传播——
    将计算从运行时转换为编译时。例如——指令 v = 2*7+13 被视为 v = 27
  2. 价值范围传播 –
    查找计算可能导致的值的可能范围。
  3. 死代码消除 –
    删除无法访问且不会对结果产生任何影响的代码。
  4. 强度降低 -
    用廉价的计算代替计算上昂贵的计算。
  5. 注册分配 -
    优化使用寄存器进行计算。

任何代码都可以转换为 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 的版本。