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

通过llvm的死代码消除过程删除指令,llvm,llvm-ir,Llvm,Llvm Ir,我在LLVM中的通行证生成一个IR,如下所示: %5 = icmp eq i32 %4, 0 %7 = or i1 %5, %5 ... 由于实际上不需要或指令(死代码),因此我将所有出现的%7替换为%5。现在,应该删除或指令。我可以从我的pass调用LLVM的死代码消除pass吗,或者是否有任何方法删除该或指令?为什么不在pass manager中安排DCE在您的pass之后运行呢。让它进行分析,并决定它想扔掉什么。一个更符合LLVM设计理念的解决方案是,与其在你的通行证中进行替换,不如让我

我在LLVM中的通行证生成一个
IR
,如下所示:

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

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

为什么不在pass manager中安排DCE在您的pass之后运行呢。让它进行分析,并决定它想扔掉什么。

一个更符合LLVM设计理念的解决方案是,与其在你的通行证中进行替换,不如让我们来做这项工作。这样您就不必担心运行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
}
>cat foo.ll
定义i32@foo(i32%a,i32%b)#0{
条目:
%或=或i32%a,%a
ret i32%或
}
>opt-S-instcombine