2016-03-03 155 views
0

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

为什么你有一个'break'呢? –

+0

我尝试过不使用它,它给出编译错误 –

+0

如果你想让任何人都能够帮助你,你必须要更加具体。 –

回答

0

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