问:SSA静态单赋值。如果没有分支,顺序执行的代码上,例如int a;........; a = 3;.......;a = 4; 最终可能会变成a_1,a_2.但是如果直接使用变量a会怎样呢?ssa有什么优势(顺序执行代码)

关注者
32
被浏览
3433
没有分支、顺序执行的代码,那就是在同一个基本块内的代码。这样最好不过,因为连Phi都不需要了。现实中也有类似这样的SSA形式,常见于trace-based编译器里——一个trace除了guard/side exit之外,其它部分就是一条直线的trace;guard和side exit通常有特殊处理不看作(普通的)分支,于是SSA形式的trace就跟楼主问题里说的类似了。实例有Andreas Gal系的trace-based编译器,例如Hotpath,它用的SSA形式叫做Trace SSA(TSSA)。可以参考这篇论文:
static.usenix.org/event

构造SSA形式的IR自身隐含的若干优化,例如:
*复写传播(copy propagation):所有 x = y 形式的纯拷贝在构造SSA形式时可以自然的优化掉
*无用代码消除(dead code elimination):SSA形式的IR通常会有显式的use-def信息,如果IR里有特殊节点是一定存活的(例如函数的return节点),那么以这些节点为根集合跟着use-def去遍历IR就能找到所有活跃的节点,而剩下的节点就肯定是无用的了(因为没有活节点use了它们的def)。这跟GC是一样的。
楼主可以想像一下构造SSA就自然做了上面俩优化,算不算是优势。不构造SSA形式当然也能做这俩优化,就是稍微麻烦点而已。

另外,常量折叠、算术简化、公共子表达式消除等优化也经常混在构造SSA形式的过程中做。算是“顺便”,反正也要遍历一次所有的代码来构建SSA。