Компиляция с использованием проходов/флагов оптимизации clang

Я пытаюсь скомпилировать программу с помощью clang3.4, а проходы оптимизации (или флаги?!), которые я использовал, игнорируются.

Например, я пытаюсь скомпилировать и передаю следующие параметры" -O1 -instcombine

Я получил:

clang34: warning: argument unused during compilation: '-instcombine'

Список всех доступных проходов оптимизации LLVM можно найти здесь, а в этом вопросе. Я что-то пропустил?

Спасибо.


person Paschalis    schedule 06.06.2014    source источник
comment
Единственный вариант, который я обнаружил, что он не игнорируется, — это -fstrict-aliasing, который не указан в двух ссылках, которые я приложил в вопросе.   -  person Paschalis    schedule 06.06.2014


Ответы (2)


Это проходы оптимизации LLVM, а не clang. Вы не можете вызывать проходы оптимизации LLVM напрямую. Однако вы можете выпустить LLVM IR с опцией -emit-llvm и использовать инструмент opt для вызова любых проходов оптимизации LLVM.

person Anton Korobeynikov    schedule 07.06.2014
comment
У меня есть пара вопросов: Где я могу найти флаги оптимизации clang? Что я должен использовать? флаги clang или пропуски LLVM? Реализованы ли флаги clang с помощью проходов LLVM? - person Paschalis; 08.06.2014
comment
@Paschalis, посмотри мой ответ :) - person Amir; 21.10.2014
comment
Просто отметим: на самом деле вы можете использовать что-то вроде clang -cc1 -backend-option -instcombine для установки проходов LLVM из clang, хотя использование opt вполне может быть лучшим вариантом. - person Max; 04.01.2016

как упоминал @Anton выше, эти проходы компилятора предназначены для использования с llvm-opt, а не с clang, clang поддерживает только стандартный уровень оптимизации -O [X]. Однако, если вы хотите использовать свои флаги компилятора. то есть "-instcombine", сначала вы должны добавить опцию -emit-llvm при использовании clang.

Некоторые комментарии и примеры:

  1. Список LLVM-opt можно найти здесь!

  2. Вот краткий пример использования LLVM-opt:

clang -S -emit-llvm foo.c -lm
opt ${<MY_DESIRED_COMPILER_FLAGS>} -S -o foo_OPTIMIZED.ll foo.ll

clang foo_OPTIMIZED.ll -lm

Теперь, если вы возьмете diff обеих версий файлов LLVM-IR или .ll, вы увидите различия.

  1. OPT всего проекта

В этом отношении вы должны поместить эти команды в цикл и применить выбор к каждому из файлов, которые вам нужны.

OR

Напишите make-файл, который сделает это за вас.

OR

Создайте свой собственный проход, состоящий из желаемых проходов, и включите их в виде файла .so. Подробнее здесь!

Надеюсь, это поможет.

person Amir    schedule 20.10.2014