2016-12-13 18 views
2

Я пытаюсь реализовать анализ активности, чтобы удалить мертвые инструкции. Я знаю, что существует 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 с это (и я уверен, что есть другие определения без использования). Однако команда возврата не должна удаляться, так как это приведет к получению семантически неправильного кода.

Является ли мой общий подход к удалению инструкций с помощью анализа жизнеспособности? Что я могу сделать, чтобы гарантировать, что инструкции, такие как возврат, не удаляются?

Все указатели очень ценятся :)

ответ

0

также проверить инструкция является ли инструкция терминатор (inst->isTerminator())

+0

Hi. Спасибо за ответ. Не могли бы вы более подробно рассказать об этом? Вы имеете в виду что-то вроде 'if (deadInst &&! Inst-> isTerminator())'?Что такое функция терминатора? – user3186023

1

Вы упомянули llvm::isInstructionTriviallyDead, и это хорошее начало, чтобы получить некоторое представление о том, что могут быть удалены, и что не может.

Вы уже заметили, что вы не можете удалить инструкцию терминатора.

Кроме того, вы не хотите удалять инструкции без использования, но с побочными эффектами. Рассмотрим это:

define void @bar()() { 
    call void @foo()() 
    ret void 
} 

Вы не хотите, чтобы удалить call инструкцию, даже если он не имеет пользы, потому что, он может, например, записать на стандартный вывод или изменить некоторые глобальные переменные. То же самое касается store. Для получения полного списка проверьте Instruction::mayHaveSideEffects.

Вашей живучесть анализа слишком агрессивен: не использует не необходимость, но не достаточно условие инструкции считаться мертвой.

Если вы не хотите использовать isInstructionTriviallyDead для целей обучения, я рекомендую вам начать наоборот: рассмотреть, когда инструкции мертвы наверняка (например, alloca мертв, когда нет использования, так что делает add инструкции. ..), а затем обобщить.

Кроме того, просто выполнить все инструкции и удалить мертвые недостаточно. Например:

%2 = add i32 3, %1 
%3 = add i32 3, %2 

При первой встречи %2, имеет применение в %3, так что не умер. Но после того, как вы устраните %3 как мертвый, %2 тоже будет мертв. Вы можете преодолеть эту проблему, итерации до тех пор, пока не будет найдена новая мертвая инструкция (неэффективная, но простая) или какой-либо рекурсивной процедурой.

+0

Привет. Спасибо за ответ. Могу ли я не использовать такие условия, как 'isTerminator()' или 'mayHaveSideEffects()' в моем 'if (deadInst)' состоянии, чтобы противодействовать агрессивности анализа живой активности? То есть мы можем предположить, что если переменная не имеет использования, не является инструкцией терминатора и не имеет побочных эффектов, то она же удаляется. Или это еще слишком агрессивно? – user3186023

+1

@ user3186023, добавьте [список посадочных площадок] (http://llvm.org/docs/LangRef.html#landingpad-instruction) в список, и я думаю, что этого достаточно для начала, но 'llvm' также пытается сохранить инструкции с информацией об отладке, которую вы можете или не хотите сохранять. – deniss

+0

Ah посадочная площадка - вещь, о которой я очень мало понимаю! Я видел это в исходном коде для 'IsInstructionTriviallyDead()', но не мог понять, что он сделал, и не мог найти никакой документации. Есть ли какая-либо документация LLVM, которая могла бы объяснить, что такое посадочная площадка? – user3186023

 Смежные вопросы

  • Нет связанных вопросов^_^