Легко ли достичь уровня оптимизации -O3 с помощью LLVM напрямую? - PullRequest
5 голосов
/ 09 октября 2011

Легко ли достичь высокого уровня оптимизации с LLVM?

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

  • простых функций
  • простые структуры
  • 1010 * Таблица *
  • указатели (с арифметикой)
  • управляющие структуры
  • и т.д.

Я могу довольно легко создать бэкэнд компиляции на C и рассчитывать на clang -O3. Легко ли использовать LLVM API для этой цели?

Ответы [ 2 ]

6 голосов
/ 10 октября 2011

За исключением, возможно, нескольких высокоуровневых (например, осведомленных о высокоуровневых языковых возможностях или деталях, которые не кодируются в LLVM IR) оптимизаций, бэкэнд Clang делает чуть больше, чем просто генерирует IR и запускает некоторый набор LLVM оптимизация проходит по нему. Все они (или, по крайней мере, большинство) должны быть доступны через команду opt, а также в виде вызовов API при использовании библиотек C ++, на которых построены все инструменты LLVM. См. учебник для простого примера. Я вижу несколько преимуществ:

  1. LLVM IR намного проще, чем C, и уже есть удобный API для его генерации программно. Чтобы сгенерировать C, у вас либо есть много уродливых и ненадежных игр с строками, либо вы должны создать AST для языка C самостоятельно. Или оба.
  2. Вы можете сами выбрать набор оптимизаций (вполне возможно, что набор проходов Clang не идеален для кода, поддерживаемого языком, и для IR-представления, создаваемого вашим компилятором). Это также означает, что во время разработки вы можете просто выполнить проходную проверку на корректность IR (обнаружение ошибок компилятора быстрее). Вы можете просто скопировать пропуск Clang, но если вам так хочется, вы также можете поэкспериментировать.
  3. Это позволит лучше компилировать время. Clang быстр для компилятора C, но вы бы добавили ненужные накладные расходы: вы генерируете C-код, затем Clang анализирует его, преобразует его в IR и продолжает делать то, что вы могли бы сделать прямо сейчас.
  4. У вас может быть доступ к более широкому диапазону функций или, по крайней мере, вы получите их проще (т. Е. Без необходимости включать #define s, скрытые прагмы, инстинкты или параметры командной строки) для их предоставления. Я говорю о одинаковых векторах, гарантированных (ну, во всяком случае, больше, чем в C - AFAIK, некоторые генераторы кода игнорируют их) хвостовых вызовов, чисто / только для чтения функций, большего контроля над макетом памяти и преобразованиями типов (например, расширение нуля против знака расширение). Конечно, большинство из них вам может не понадобиться.
0 голосов
/ 10 октября 2011

LLVM имеет встроенные этапы оптимизации, так что вы можете достичь O3-подобных оптимизаций с помощью API.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...