08-从 SSA 翻译指令

问题关键:翻译/消除ϕ\phi函数

  • 以下方法均不可行:优化后变量间的依赖十分复杂,前一条语句计算出了新值,后一条语句仍然使用旧值,盲目变动后就会出现依赖问题

ϕ\phi函数中的变量替换成同一个

  • 不可行:预期的中间值可能会被覆盖

// 原始代码
a = x + y;
b = x + y;
a = 17;
c = x + y;
// ssa 优化后版本,此时再替换同名变量,`c`的赋值就会出现问题
a0 = x0 + y0;
b0 = a0;
a1 = 17;
c0 = a0;

ϕ\phi函数替换为赋值语句

Lost-Copy Problem

  • Critical Edge:起点有多条出边,终点有多条入边

解决方案

  • ai完成计算后,增加块ai'=ai

  • 把原始的ϕ\phi函数替换为a'=phi(a1’, a2’)

  • ϕ\phi函数后增加新变量a=a'

  • 把所有带'的变量替换成其他名称

  • 通过加入赋值语句替换掉ϕ\phi函数

  • 取出其余的冗余语句

Swap Problem

  • ϕ\phi函数在汇合处通过数据流向确定最终值,位于赋值之前,和赋值语句的顺序无关

  • 改成赋值语句后带来依赖错乱

解决方案

  • ai完成计算后,增加块ai'=ai,在赋值的等号后面标记编号以显示同时性

  • 把原始的ϕ\phi函数替换为a'=phi(a1’, a2’)

  • ϕ\phi函数后增加新变量a=a'

  • 把所有带'的变量替换成其他名称

  • 通过加入赋值语句替换掉ϕ\phi函数

  • 将并行的赋值序列化,找出存在变量交换的同组语句,使用中间变量替换

  • 取出其余的冗余语句

最后更新于