摆脱LLVM的无条件分支

时间:2018-02-13 16:50:07

标签: clang llvm llvm-ir

考虑这个IR:

label0:
  ret i32 0   
  br label %1 

如何摆脱无条件分支指令?我已将其类型转换为BranchInst类并使用removeFromParent()eraseFromParent(),但我收到this错误。

BranchInst *BI = dyn_cast<BranchInst>(i);
if(BI->isUnconditional())
  BI->removeFromParent();

1 个答案:

答案 0 :(得分:0)

首先,有一个pass / transform可以消除带有无条件分支的块。请参阅simplifycfg(有关条件)和相关的API

但是,通过在示例基本块中结束两个终结符指令,我认为您可能正试图以某种方式转换IR。

如果您查看BasicBlock的文档,请说明:

  

良好形成的基本块由非终止列表组成   指令后面跟着一条TerminatorInst指令。

目前尚不清楚你是如何结束这个基本块的,但也许在删除旧的终结符之后,你可以使用getTerminator方法;如果它返回nullptr,则表示基本块格式不正确。

我不知道你是怎么做的ATM(你显示的代码不足),但在删除旧的终结符后,你可以使用ReturnInstCreate()方法,将BasicBlock作为第二个参数来为您设置新的终结符指令。