GCC Forward Propagation
Table of Contents
1. GCC Forward Propagation
forward propagation (pass_forwprop) GCC Constant Propagation 类似, 但它的功能不是替换表达式为常量, 而是替换多个表达式为一个表达式, 例如:
int foo(int x) { int y = 2 * x; int z = y + 3; if (x > 0) { z = y * 3; } else { z = y * 4; } return z; }
经过 forwprop 后大约会变成类似下面的代码:
int foo(int x) { int y = 2 * x; int z = y + 3; if (x > 0) { z = x * 6; } else { z = x * 8; } return z; }
后续的 pass 在 forwprop 基础上可以进一步优化成:
int foo(int x) { if (x > 0) { z = x * 6; } else { z = x * 8; } return z; }
与 ccp 类似: 如果某个变量 x 通过所有的 path 到达代码 u 处时都是同一个表达式, 则 u 处的 x 可以替换为该表达式
1.1. impls
forwprop 实际时需要考虑两个东西:
- 哪些变量是不变的可能被 fold, 例如前面的 y 是可以被替换的
- 什么样的操作可以被 fold, 例如 y*3 可以被替换成 x*6, 但 y+3 并不会被替换成 x*2+3
对于前者, 使用类似于 ccp 的 lattice 实现.
对于后者, gcc 在 `match.pd` 中定义了许多可以被 fold 的 pattern (看不懂 Orz…)
Backlinks
GCC Pass (GCC Pass > tree pass > pass_fowrprop): pass_fowrprop