我在 LLVM 中的传递会生成IR
这样的结果:
%5 = icmp eq i32 %4, 0
%7 = or i1 %5, %5
...
由于or
实际上不需要该指令(死代码),我将所有出现%7
的%5
. 现在,该or
指令应该被删除。我可以从我的通行证中调用LLVM 的死代码消除通行证,还是有什么方法可以删除该or
指令?
一个更符合 LLVM 设计理念的解决方案是,让InstCombine完成这项工作,而不是在您的通行证中进行替换。这样您就无需担心运行 DCE。
例如:
>cat foo.ll
define i32 @foo(i32 %a, i32 %b) #0 {
entry:
%or = or i32 %a, %a
ret i32 %or
}
> opt -S -instcombine < foo.ll
define i32 @foo(i32 %a, i32 %b) #0 {
entry:
ret i32 %a
}
为什么不直接安排 DCE 在通行证管理器中运行通行证。让它进行分析并决定要丢弃什么。