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 实际时需要考虑两个东西:

  1. 哪些变量是不变的可能被 fold, 例如前面的 y 是可以被替换的
  2. 什么样的操作可以被 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

Author: [email protected]
Date: 2022-04-20 Wed 19:25
Last updated: 2022-04-21 Thu 17:14

知识共享许可协议