-adce: Aggressive Dead Code Elimination
Description
-adce 的全称如标题所示,主要就是对 Program IR 进行 dead code elimination 的 code transformation。
其实和 -dce pass 做的事一样,不过更 aggressive 一些,这个区别在 -dce: Dead Code Elimination 那里讲。
从 high-level 上来说,-adce pass 可以 identify 那些在程序中一定 不会运行 的 code (both instruction- and basic block-levels),然后 remove 他们。
这种一定不会运行的 code 主要包括:
Control-flow 没有一个可以到达这个 basic block 的,而且对后续变量没有任何影响的(e.g. 我写了个函数,但是没有任何地方调用它)
Data-flow 无关的变量。(e.g. 我定义了一个变量,但是后面压根没使用它)
Code Example
下面是一段原始的 LLVM IR。
define i32 @foo(i32 %x, i32 %y) {
entry:
%a = add i32 %x, %y
%b = add i32 %a, 1
%c = add i32 %a, 2
%d = icmp slt i32 %y, 0
br i1 %d, label %then, label %else
then:
%e = add i32 %b, 1
ret i32 %e
else:
%f = add i32 %c, 1
ret i32 %f
}
这是经过 -adce pass 之后的 IR。
define i32 @foo(i32 %x, i32 %y) {
entry:
%a = add i32 %x, %y
%b = add i32 %a, 1
%d = icmp slt i32 %y, 0
br i1 %d, label %then, label %else
then:
%e = add i32 %b, 1
ret i32 %e
else:
%f = add i32 %b, 2
ret i32 %f
}
因为 %c 变量这里没被使用,所以就被 eliminate 了。