Как LLVM выполняет анализ живучести? - PullRequest
1 голос
/ 27 февраля 2020

Я новичок, который только что изучил основы компилятора.

Во время копания LLVM я не уверен, где искать часть анализа живучести.

Насколько я понимаю, Программа, которая превратилась в LLVM IR, превращается в DAG, а затем в MIR.

На этих слайдах вводится отслеживание жизнеспособности, и я предположил, что анализ жизнеспособности происходит в MIR.

Итак, я смотрю на исходные коды, такие как LiveVariables. cpp, LiveIntervalAnalysis. cpp, но я не уверен, как код определяет такие вещи, как def, kill, imp-use.

Может кто-нибудь сказать мне, где я могу найти эти коды и как вывести информацию в процессе?

Спасибо,

Джейк

1 Ответ

2 голосов
/ 02 марта 2020

LLVM использует промежуточное представление в форме SSA. SSA-форма IR означает, что каждая переменная определяется ровно один раз, и каждое ее использование доминирует по определению. Доминирование - это понятие в теории графов, которое, по сути, означает, что каждый путь к использованию в графе потока управления должен проходить через его определение. Существует множество информации о SSA и о том, как создать SSA из традиционного IR в Интернете, если вы посмотрите.

На практике этот выбор делает ненужным традиционный анализ жизнеспособности, основанный на уравнениях потока данных. Вместо вычисления живого набора каждого базового c блока, компиляторы SSA просто предоставляют функцию для ответа на вопрос «жива ли эта переменная в этом месте?»

Анализ живучести LLVM для целей регистра распределение выполняется в независимом от цели генераторе кода, что означает, что большая часть кода находится в каталоге lib/CodeGen. В частности, вы, вероятно, заинтересованы в MachineBasicBlock :: computeRegisterLiveness, а также lib/CodeGen/LiveVariables.cpp

...