llvm使用SplitBlockAndInsertIfThenElse的分支指令
问题描述:
我试图构建一个LLVM传递,它会分裂BasicBlock,并在遇到二进制操作时使用“SplitBlockAndInsertIfThenElse”做出决定,但这只允许我分割一次(在第1 binop)。你能帮我让它遍历所有的binop指令吗? 知道改变“休息”的位置运行通行证时出现错误。当我将“SplitBlockAndInsertIfThenElse”放入嵌套循环时,也会发生同样的事情。 这里是我的代码:llvm使用SplitBlockAndInsertIfThenElse的分支指令
for (inst_iterator I = inst_begin(F), E = inst_end(F); I != E; ++I)
{
if (auto *op = dyn_cast<BinaryOperator>(&*I))
{
IRBuilder<> Builder(op);
Value *lhs = op->getOperand(0);
Value *rhs = op->getOperand(1);
Value *xpv = Builder.CreateAlloca(llvm::Type::getInt32Ty(llvm::getGlobalContext()), nullptr, "x");
Value *xpv2 = Builder.CreateAlloca(llvm::Type::getInt32Ty(llvm::getGlobalContext()), nullptr, "x2");
Value *add1 = Builder.CreateAdd(lhs, rhs);
Value *add2 = Builder.CreateAdd(lhs, rhs);
Value *icmp1 = Builder.CreateICmpEQ(add1, add2);
TerminatorInst *ThenTerm , *ElseTerm ;
SplitBlockAndInsertIfThenElse(icmp1, op, &ThenTerm, &ElseTerm,nullptr);
Builder.SetInsertPoint(ThenTerm);
Value *xp1 = Builder.CreateStore(add1, xpv);
Builder.SetInsertPoint(ElseTerm);
break ;
}
}
答
不要执行指令列表并发迭代和修改。迭代,直到找到你关心的第一条指令,然后中断退出循环,执行修改,然后重新启动循环,从分割之前的下一条指令开始之前(所以下一条指令在你的op
之后,在你的案件)。
为什么你有一个'break'呢? –
我尝试过不使用它,它给出编译错误 –
如果你想让任何人都能够帮助你,你必须要更加具体。 –