2013-12-03 3 views
2

Когда я использую команду clang -emit-llvm -S test.c -o test.ll, в IR-файле нет никакой инструкции «phi». Как я могу его получить?Как получить инструкцию «phi» в llvm без оптимизации

Я знаю, что могу использовать пропуск «-mem2reg» или «-gvn», чтобы получить инструкцию «phi». Но они будут делать некоторую оптимизацию. Я просто хочу получить «phi» без какой-либо оптимизации.

+0

mem2reg (aka PromotePass) не зависит от каких-либо других проходов, кроме анализа DominatorTree, который, очевидно, не изменяет ИК. –

ответ

10

Я не уверен, что вы подразумеваете под «сделать некоторую оптимизацию», но мне кажется, что mem2reg это точно что вам нужно. Вот как это described in the documentation:

Этот файл распространяет ссылки на память для ссылки на регистры. Он поддерживает команды alloca, которые имеют только нагрузки и хранилища в качестве использования. Атрибут transforma преобразуется с использованием границ доминанта для размещения узлов phi , а затем перемещение функции в глубину-первом порядке для перезаписи загружает и хранит в случае необходимости. Это всего лишь стандартный алгоритм построения SSA для построения «обрезанной» формы SSA.

Clang сам не производит оптимизированный ИК LLVM. Он производит довольно простой IR, в котором локали хранятся в памяти (с использованием alloca с). Оптимизации выполняются с помощью opt на уровне LLVM IR, и одна из наиболее важных оптимизаций - это действительно mem2reg, которая гарантирует, что местные жители представлены в значениях SSA LLVM вместо памяти.

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