2016-03-03 158 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之後,在你的案件)。