我在LLVM中的传递会生成IR
,如下所示:
%5 = icmp eq i32 %4, 0
%7 = or i1 %5, %5
...
由于实际上不需要or
指令(死代码),因此我将所有%7
替换为%5
。现在,or
指令应该被删除。我可以从我的传递中调用死代码消除传递LLVM,还是有任何方法可以删除or
指令?
答案 0 :(得分:2)
与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
}
答案 1 :(得分:1)
为什么不安排DCE在传递管理器中传递后运行。让它进行分析并决定它想扔掉的东西。