SSA是什么?
时间:2023-04-10 18:07:00
[WebKit] JavaScriptCore分析-高级篇(1) SSA (static single assignment) - jlins - 博客园
在编译器优化领域,数据结构的选择将直接影响程序优化的有效性。
SSA编译器使用的中间语言(intermediate language), 作为编译优化的基础(也是DFG JIT和Control Dependence Graph用来表示程序的数据流和控制流。
众所周知,编译器是这样工作的:分析、优化、生成代码。
中间会使用到一个中间语言的进行过度,好的中间语言一定要
1. 简单,这样优化工作就可以变得简单。
2. 表达能力好,从源代码中很容易生成。
3. 实效性(utilitarian), 它的结构可以让你做很多优化。
SSA简介
编译优化领域的关键问题是如何为循环生成有效的机器代码。
要处理大量的控制流操作,都集中在一阶控制流问题上, 也就是说,直线代码(Straight-line code)。
SSA变量不会改变,它们只会被指定一次。
给一个变量一个新值会导致一个新的绑定。
例如,以下函数:
function clamp (x, lower, upper) { if (x < lower) x = lower; else if (x > upper) x = upper; return x; }
SSA转换结果如下:
entry: x0, lower0, upper0 = args; goto b0; b0: t0 = x0 < lower0; goto t0 ? b1 : b2; b1: x1 = lower0; goto exit; b2: t1 = x0 > upper0; goto t1 ? b3 : exit; b3: x2 = upper0; goto exit; exit: x4 = phi(x0, x1, x2); return x4;
SSA将过程区分为几个基本块(basic blocks),每一块在结尾或条件允许,或无条件转向其他分支。临时变量也有自己的名称,以便以后优化。