考虑这个IR:
label0:
ret i32 0
br label %1
如何摆脱无条件分支指令?我已将其类型转换为BranchInst
类并使用removeFromParent()
或eraseFromParent()
,但我收到this错误。
BranchInst *BI = dyn_cast<BranchInst>(i);
if(BI->isUnconditional())
BI->removeFromParent();
答案 0 :(得分:0)
首先,有一个pass / transform可以消除带有无条件分支的块。请参阅simplifycfg
(有关条件)和相关的API。
但是,通过在示例基本块中结束两个终结符指令,我认为您可能正试图以某种方式转换IR。
如果您查看BasicBlock
的文档,请说明:
良好形成的基本块由非终止列表组成 指令后面跟着一条TerminatorInst指令。
目前尚不清楚你是如何结束这个基本块的,但也许在删除旧的终结符之后,你可以使用getTerminator
方法;如果它返回nullptr
,则表示基本块格式不正确。
我不知道你是怎么做的ATM(你显示的代码不足),但在删除旧的终结符后,你可以使用ReturnInst
的Create()
方法,将BasicBlock
作为第二个参数来为您设置新的终结符指令。