如何将合取/析取转换为TAC且避免临时变量跨基本块问题?
合取表达式转三地址码的优化方案
临时变量跨基本块的影响
临时变量_t1跨基本块确实会干扰后续优化——比如活跃变量分析、寄存器分配这类依赖基本块内局部性的优化,会因为跨块临时变量的存在增加复杂度,甚至无法正常应用局部优化规则。
符合基本块内临时变量要求的TAC生成方案
由于需要独立处理AST分支、不能直接赋值给c,可以通过在每个分支基本块内使用局部临时变量,再在汇合块通过phi节点统一结果的方式实现,具体示例如下:
原代码
int a; int b; bool c = a > 1 && b < 5;
优化后的三地址码
if a <= 1 goto L1 _t_local1 = b < 5 goto L2 L1: _t_local2 = 0 L2: c = phi(_t_local1, _t_local2)
核心思路
- 在每个分支基本块内定义仅属于当前块的临时变量(
_t_local1、_t_local2),各自存储对应分支的计算结果 - 在汇合块(
L2)使用phi节点统一分支结果:phi节点会根据控制流的来源,自动选择对应分支的临时变量值赋值给目标变量,既满足独立AST分支处理的要求,又保证临时变量完全局限在所属基本块内
析取表达式的同理实现
对于析取表达式bool c = a > 1 || b < 5,可采用相同逻辑生成TAC:
if a > 1 goto L1 _t_local1 = b < 5 goto L2 L1: _t_local2 = 1 L2: c = phi(_t_local1, _t_local2)
内容的提问来源于stack exchange,提问作者Traummaennlein
相关产品推荐
相关产品推荐

