知识卡片
SSA利于优化
内容
SSA(静态单赋值)是编译器遍历函数后生成的中间表示层:每个值只定义一次;多分支都会赋值时,用 Phi 函数合并不同分支来源的值。这是编译器 IR 层的性质,不是源码变量只能赋一次——源码变量仍可重复赋值,转换到 SSA 时才生成新版本号。单一定义让常量传播、死代码消除更易识别,是 [[编译器三阶段]] 中间层的关键抓手。
参考来源
- 位置:《Go语言底层原理剖析》第1章《深入Go语言编译器》1.12节《SSA生成》
- 结论依据:原文明确定义"在SSA生成阶段,每个变量在声明之前都需要被定义,并且,每个变量只会被赋值一次",并用 y 被赋值两次不符合 SSA 规则、需要拆成 y、y1 两个版本的例子说明;对于条件分支场景,原文进一步说明需要引入 Phi 函数(Φ)接收不同分支的变量版本产生新变量,因此可以推出"SSA 是中间表示层的单赋值规则,靠 Phi 表达分支汇合"的结论,而非源码变量赋值规则。
- 原始内容:遍历函数后,编译器会将抽象语法树转换为下一个重要的中间表示形态,称为SSA(Static Single Assignment,静态单赋值)……在SSA生成阶段,每个变量在声明之前都需要被定义,并且,每个变量只会被赋值一次……为了解决以上问题,在SSA生成阶段需要引入额外的函数Φ接收x_1和x_2产生新的变量x_v,x_v的大小取决于代码运行的路径。SSA生成阶段是编译器进行后续优化的保证,例如常量传播、无效代码清除、消除冗余、强度降低等。