Сбой ADCE в LLVM из-за зависания после Def - PullRequest
0 голосов
/ 30 апреля 2019

Я использую 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 () && "Использование сохраняется, когда значение уничтожено!"

...