简介
死代码消除(DCE dead code eliminate),如果编译器能够确定给定操作不会影响程序结果,那么它完全可以消除该操作,一般有两种不同的效应可以使操作成为消除的合格对象。
- 操作时无用的,即结果没有外部可见的效应。无用指的是如果没有其他操作使用其结果,或使用其结果的所有指令本身都是死代码。
- 操作可能是不可达的,即它不可能执行。
int global;
void fun()
{
int i = 1; //死代码
global = 1; //死代码
global = 2;
if (5 > 2)
{
...
}
else
{
global *= 20; //死代码
}
return;
global = 3; //死代码
}
替换为
int global;
void fun()
{
global = 2;
if (5 > 2)
{
...
}
return;
}
原理
结构
worklist :队列
步骤
1.遍历所有指令,将output标记为alive,并将指令添加到worklist。
2.取出worklist的第一个指令,将指令的源操作数的def指令标记为alive,并将之添加到worklist;继续取指令,直到worklist为空。
3.遍历所有指令,如果指令不是alive的,那么在du chain中删除def与usage,并且删除指令;如果是,那么跳过这条指令。
示例
0: mul r2, r1, 20.0
1: mov r3, r2
2: mul r4, r1, 20.0
3: mov r3, r4
其中r3为output。
1.遍历所有指令,将id:3标记为alive,并将指令添加到worklist。
2.取出指令id:3,源操作数r4的def是指令id:2标记为alive,将之添加到worklist;取出指令id:2,源操作数r1在当前无def指令;worklist为空。
3.指令id0-1不是alive,所以删除,同时更新du chain。
输出如下
2: mul r4, r1, 20.0
3: mov r3, r4
未完待续…