Я использую llvm для создания кода оптимизации ADCE:
"При удалении инструкции I обязательно уведомите инструкции, которые я использую, что я был удален, чтобы они больше не называли егоПользователь. Это можно сделать следующим образом: I-> dropAllReferences (); Удаление инструкции из базового блока с использованием итератора делает недействительным этот итератор. Убедитесь, что отслеживаете следующий итератор, прежде чем удалить инструкцию. "
Я попытался записать код ниже, но я все еще получал ошибки.
else if (!isTriviallyLive(Inst) && Inst->isSafeToRemove()) {
DI = Inst->eraseFromParent();
Inst->dropAllReferences();
}
bool isTriviallyLive(Instruction *I)
{
if (I->mayHaveSideEffects() || I->mayWriteToMemory() || I->isTerminator())
return true;
return false;
}
Ошибка: Использование все еще застревает после уничтожения Def:% r7 = загрузка i32, i32 *% rx,выровнять 4
Использовать все еще застрявший после уничтожения Def:% r4 = загрузить i32, i32 *% rx, выровнять 4
Использовать все еще застрявший после уничтожения Def:% r1 = загрузить i32, i32 *% rx, выровнять 4
Использовать все еще застрявший после уничтожения Def:% r0 = загрузить i32, i32 *% rx, выровнять 4
Использовать все еще застрявший после уничтожения Def: store i32% x, i32 *% rx, align 4
Утверждение не выполнено: use_empty () && "Использование сохраняется, когда значение уничтожено!"