通过llvm的死代码消除传递删除指令

时间:2012-02-11 08:43:22

标签: llvm llvm-ir

我在LLVM中的传递会生成IR,如下所示:

%5 = icmp eq i32 %4, 0
%7 = or i1 %5, %5
...

由于实际上不需要or指令(死代码),因此我将所有%7替换为%5。现在,or指令应该被删除。我可以从我的传递中调用死代码消除传递LLVM,还是有任何方法可以删除or指令?

2 个答案:

答案 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在传递管理器中传递后运行。让它进行分析并决定它想扔掉的东西。