Я пытаюсь реализовать анализ активности, чтобы удалить мертвые инструкции. Я знаю, что существует isInstructionTriviallyDead()
, но я хочу узнать, как удалить код, используя def-use (или use-def) цепочки.LLVM - Анализ Liveness для удаления мертвого кода
Способ, которым я в настоящее время это выполняю, я повторяю все инструкции в блоке (используя 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();
}
}
Проблема есть, команда возврата не имеет применения assosciated с это (и я уверен, что есть другие определения без использования). Однако команда возврата не должна удаляться, так как это приведет к получению семантически неправильного кода.
Является ли мой общий подход к удалению инструкций с помощью анализа жизнеспособности? Что я могу сделать, чтобы гарантировать, что инструкции, такие как возврат, не удаляются?
Все указатели очень ценятся :)
Hi. Спасибо за ответ. Не могли бы вы более подробно рассказать об этом? Вы имеете в виду что-то вроде 'if (deadInst &&! Inst-> isTerminator())'?Что такое функция терминатора? – user3186023