2012-03-14 86 views
5

我有followint LLVM IR文件從LLVM IR中清除基本塊中的第一條指令?

%1 = load i32* %i, align 4 
    %2 = load i32* %j, align 4 
    %3 = icmp sgt i32 %1, %2 
    br i1 %3, label %4, label %6 

; <label>:4          ; preds = %0 
    %5 = load i32* %i, align 4 
    store i32 %5, i32* %k, align 4 
    br label %6 

; <label>:6          ; preds = %5, %0 
    ret i32 0 

在它我第一加載vairable%1和變量 「j」 以%2則 「i」 的我比較大於條件爲(i> j)的。基於該分支要麼標籤4或標籤6.我的問題是有兩個加載指令爲變量「我」一個在第一個基本塊和其他在第二個基本塊。這裏我想刪除第二個加載指令。 對此我這樣做,因爲當我達到第二個加載指令的變量「我」我第二條指令的第一條指令代替了所有用途,然後我刪除當前的指令,即第二條。在這裏我無法設置指令迭代器指針。我不想爲下一條指令設置(存儲i32%5,i32 *%k,對齊4)。有其他方法嗎? 如果你知道,請讓我知道。

+0

不知道我理解你的問題。但我很確定後續的傳球應該能夠輕鬆地將你的負荷移除,所以我不會真的打擾。如果您有一個令人信服的理由來刪除負載,請重新提出您的問題,因爲我無法理解您的問題究竟是什麼。 – CAFxX 2012-03-14 05:53:53

+0

我的問題是,刪除第二個加載指令後,我想設置指令迭代器,以便在下一次迭代中它應該達到(存儲i32%5,i32 *%k,align 4),因爲在for循環中,我正在遞增指令迭代器。 – damrudhard 2012-03-14 10:04:51

+0

爲什麼不直接在'inst-> eraseFromParent()'之後調用'BB-> begin()'來獲得新的迭代器呢? – CAFxX 2012-03-14 10:58:59

回答

10

如果我正確地理解了你,你只需要擦除一條指令並不斷迭代代碼。如果這是正確的,看看這個例子從DeadInstElimintation通(其居lib/Transforms/Scalar/DCE.cpp):

virtual bool runOnBasicBlock(BasicBlock &BB) { 
    bool Changed = false; 
    for (BasicBlock::iterator DI = BB.begin(); DI != BB.end();) { 
    Instruction *Inst = DI++; 
    if (isInstructionTriviallyDead(Inst)) { 
     Inst->eraseFromParent(); 
     Changed = true; 
     ++DIEEliminated; 
    } 
    } 
    return Changed; 
} 

有趣的事情要注意的是迭代器是如何遞增。 DI++不是在for的最後一個條款內部完成的,而是分開的,當前的DI分配給Inst。這確保即使刪除了InstDI也已經指向下一條指令,因此循環將繼續在下一條指令上運行。

+0

我從CAFxX得到了一個解決方案。感謝你也爲你提供幫助。 – damrudhard 2012-03-14 13:16:24

+0

@damrudhard:將新迭代器設置爲'BB-> begin()'只有在新指令是基本塊中的第一個時纔會起作用。否則,你會回到幾條指示。如果這對你沒問題,那就沒問題。不過,我認爲我的答案中顯示的解決方案更通用。 – 2012-03-14 13:34:42

+0

在其他情況下,我將指令迭代器設置爲前一條指令,以便在下一次迭代中指向剛剛刪除指令後的指令 。 – damrudhard 2012-03-14 14:19:45