我试图构建一个LLVM传递,它分割BasicBlock并使用" SplitBlockAndInsertIfThenElse"做出决定。每次遇到二进制操作时,这只允许我拆分一次(在第一个binop处拆分)。你可以帮助我让它迭代所有的binop指令吗? 知道改变"休息的位置;"在运行通行证时给我错误。同样的事情发生在我把" 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 ;
}
}
答案 0 :(得分:0)
不要执行指令列表的并发迭代和修改。迭代直到找到你关心的第一条指令,然后中断退出循环,执行修改,并重新启动循环,从分割前的下一条指令开始(所以下一条指令) {{1}}之后,在你的情况下)。