SSA
- SSA(Static Single Assignment,静态单一赋值)
- 静态 –> 只依赖于代码(Code)或文本(Text)
- 单一 –> 单一名称
- 赋值 –> 比如y = x + 1
- SSA的应用
- GCC、LLVM、Java虚拟机HotSpot、JavaScript V8引擎
- 即时(Just-In-Time,JIT)编译器,用于Java的字节码、.NET的MSIL、LLVM的bitcode
- 计算机图形学,用于OpenGL、Vulkan的SPIR-V
- SSA的例子
- 同一变量的不同赋值,使用不同名称
- 控制流使用Phi函数表示
// Non-SSA
x = input()
if (x == 42)
y = 1
else
y = x + 2
print(y)
// SSA
x = input()
if (x == 42)
y1 = 1
else
y2 = x + 2
y3 = Phi(y1, y2)
print(y3)
代码生成
- 由计算和信息可知,指令选择(Instruction Selection)对应于计算,寄存器分配(Register Allocation)对应于信息
- 计算需要时间 –> 指令数量
- 信息需要空间 –> 寄存器溢出
- 在编译器中,中间表示通常用于有限时空下的优化