我試圖執行活性分析以刪除死指令。我知道isInstructionTriviallyDead()
存在,但是,我想了解如何使用def-use(或use-def)鏈去除代碼。LLVM - 活性分析以刪除死代碼
我現在正在做的是我遍歷塊中的所有指令(使用inst_iterator
),並且對於每條指令,循環遍歷它的所有用途。最終,如果指令已經沒有用了,那麼我認爲它死了,因此可以使用eraseFromParent()
這看起來像其刪除:
for (inst_iterator I = inst_begin(F), E = inst_end(F); I != E; ++I) {
bool deadInst = true;
Instruction *inst = &*I;
for (User* pUser : inst->users()) {
// If we enter this loop, we have at least one use, so instruction isn't dead
deadInst = false;
}
// deadInst is true if we didn't enter the loop, so has no uses
if (deadInst) {
inst->eraseFromParent();
}
}
的問題是,返回指令沒有與連結的本用途它(我相信有其他定義沒有用途)。但是,返回指令不應該被刪除,因爲它會導致語義錯誤的代碼。
我的一般方法是通過活性分析刪除說明嗎?我能做些什麼來確保退貨等指示不會被刪除?
任何指針都大加讚賞:)
嗨。謝謝回覆。你能提供更多的見解嗎?你的意思是諸如「if(deadInst &&!inst-> isTerminator())'嗎?什麼是終結者功能? – user3186023