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 ;
}
}
爲什麼你有一個'break'呢? –
我嘗試過不使用它,它給出編譯錯誤 –
如果你想讓任何人都能夠幫助你,你必須要更加具體。 –