-dce: Dead Code Elimination
Description
-dce 的全称如上所示,其实就是 less aggressive 版本的 -adce。
从 high-level 上来说, -adce 可以把那些 conditionally executed but never actually executed at runtime 的 instructions 给 remove 掉;
而 -dce 如果是理论上可以被 conditionaly executed 那么就不 remove 了。
这个 conditional 听起来很玄学,不过我觉得可以这么理解:其实就是 -adce 的 pass 更复杂,可以从逻辑上推理程序的 control-flow,然后进行一些 remove 操作。
当然,如果没有 detect 到类似的代码段,那么 -adce 也就 degrade 成 -dce 了。
Code Example
因为 -adce 那里已经给过 code elimination 的 example 了,那么这里主要是给一个 -dce 和 -adce 不同的 example(i.e. -adce 可以 remove code 但是 -dce 不行)。
下面有三个简单的 C 语言的代码段(C 比较好理解,当然所有的 pass 都是在 IR 上执行的)。
原始的 C code。
int x = 10;
int y;
if(x+1) y=1;
else y=0;
-dce transform 的 C code。
int x = 10;
int y;
if(x+1) y=1;
else y=0;
-adce transform 的 C code。
int x = 10;
int y;
y=1;
这里这个 controlf-low 其实是理论上可以执行到下一段的,但是在当前的常量赋值下一定不会执行 – 因为 10+1 一定会被判定为 true。
-adce 可以推理出来这个情况,然后去 remove 掉对应的 unneccessary control-flow; -dce 没有推理,所以就不改变这里程序的逻辑了(程序没变)。