使用SplitBlockAndInsertIfThenElse

时间:2016-03-03 10:34:03

标签: c++11 llvm llvm-ir

我试图构建一个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 ;  
 }
} 

1 个答案:

答案 0 :(得分:0)

不要执行指令列表的并发迭代和修改。迭代直到找到你关心的第一条指令,然后中断退出循环,执行修改,并重新启动循环,从分割前的下一条指令开始(所以下一条指令) {{1}}之后,在你的情况下)。