IR-оптимизация LLVM

Я пытаюсь перейти по этой ссылке, чтобы создать представление IR для кода c. Код c, который я использую, выглядит следующим образом:

void main() {
 int c1 = 17;
 int c2 = 25;
 int c3 = c1 + c2;
 printf("Value = %d\n", c3);
}

Который я сохраняю как const.c. После сохранения я использую следующую команду для создания файла .bc.

clang -c -emit-llvm const.c -o const.bc


После создания файла .bc я хочу использовать следующую команду для создания оптимизированной версии файла const.bc с именем const.reg.bc.

opt -mem2reg const.bc > const.reg.bc

У меня нет проблем с созданием этих файлов, но по какой-то причине они оба одинаковы, и оптимизации не происходит. Результаты должны быть другими, я имею в виду, что const.reg.bc должен быть оптимизированной версией файла const.bc. Но почему-то этого не происходит. Может кто-нибудь сказать мне, что я делаю не так?


person Rouzbeh    schedule 23.02.2019    source источник


Ответы (2)


Когда вы запускаете clang somefile.c, по умолчанию используется уровень оптимизации -O0, который генерирует основную функцию с атрибутом optnone. Этот атрибут предотвращает оптимизацию, поэтому вы не видите результат mem2reg.

Вы должны удалить атрибут optnone, если хотите, чтобы opt работало:

clang -S -emit-llvm const.c -o - | sed s/optnone// | opt -S -mem2reg

Обратите внимание, что mem2reg и его аналог reg2mem проходы строго не оптимизируют. Они просто преобразуют IR из/в форму SSA.

person arrowd    schedule 23.02.2019
comment
Спасибо @arrowd. Однако ниже, на странице 17, они оптимизируют его с помощью тех же команд, которые я разместил здесь. Почему несоответствие между моим оптимизатором и их? Когда я вывожу текстовый IR, мой отличается от их. Оптимизированная версия и неоптимизированная версия моего IR в основном одинаковы. В то время как для них это другое. Я имею в виду, что в их текстовом ИР действительно происходит оптимизация. laure.gonnord.org/pro/research/ER03_2015/lab1_intro.pdf - person Rouzbeh; 24.02.2019
comment
А, я понял. clang по умолчанию используется уровень оптимизации -O0, который генерирует функцию main с атрибутом optnone. Отредактируйте файл const.ll в текстовом редакторе и удалите ключевое слово optnone из перечисления attributes #0. После этого mem2reg успешно применяется. - person arrowd; 24.02.2019
comment
Спасибо @arrowd. Есть ли способ избежать этого, не просматривая файл и не удаляя ключевое слово? Кроме того, пожалуйста, отредактируйте свой ответ выше, чтобы я мог пометить его как решенный. - person Rouzbeh; 25.02.2019
comment
Вы можете использовать sed для этого. - person arrowd; 25.02.2019

Эту опцию можно использовать с clang -Xclang -disable-O0-optnone, чтобы предотвратить создание атрибута optnone.

person DTharun    schedule 08.03.2019