Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
34
Добавлен:
01.05.2014
Размер:
206.19 Кб
Скачать

Опции оптимизации

-O (--optimize)

-O1 (--optimize 1)

Включить оптимизацию. Оптимизирующая компиляция требует несколько больше времени и существенно больше памяти, если число строк в функции велико.

В отсутствие опции -Oкомпилятор стремится минимизировать затраты на компиляцию и обеспечить наилучшие условия отладки. Операторы программы независимы. Если вы установили точку прерывания перед началом оператора, то после останова в этой точке вы можете присвоить новое значение любой переменной или изменить счетчик команд, установив его на нужный оператор. При этом вы получите в точности тот результат, которого следует ожидать, исходя из содержания текста программы.

Без -Oкомпилятор размещает в регистрах только те переменные, которые были декларированы с квалификаторомregister.

Если задана опция -O, то компилятор стремится уменьшить размер генерируемого кода и время выполнения программы.

Если задана опция -O, то для всех машин включаются опции‑fthread‑jumps, ‑fdefer-pop. Для машин со слотами задержки (в том числе для Багет-23В) включается также опция-fdelayed-branch, а для машин, где отладка возможна и без указателя кадра (в том числе Багет-23В), включается еще и опция-fomit-frame-pointer.

-O2 (--optimize 2)

Усилить оптимизацию. В этом случае выполняются все поддерживаемые виды оптимизации, за исключением тех, которые обеспечивают ускорение готовой программы за счет значительного увеличения ее размера, (т. е. развертывание циклов и встраивание функций). По сравнению с -O, при использовании-O2увеличивается время компиляции, и ускоряется выполнение готовой программы.

-O3 (--optimize 3)

Еще более высокий уровень оптимизации. Соответствует -O2 с встраиванием функций (т. е.-O2 -finline-functions).

-O0

Отключить оптимизацию.

При задании в командной строке нескольких опций -Oс указанием или без указания уровня оптимизации реально используется последняя из них.

Опции вида -fфлагзадают машинно-независимые флаги оптимизации. Напомним, что перечисленные далее опции имеют отрицательную форму (см. гл. 1).

-ffloat-store (--float-store)

Не размещать в регистрах переменные с плавающей точкой.

Эта опция полезна при компиляции некоторых программ, которые полагаются на точные определения для значений с плавающей точкой, принятые в стандарте IEEE.

-fno-defer-pop (--no-defer-pop)

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

-fforce-mem (--force-mem)

Перед выполнением арифметических операций всегда копировать в регистры операнды, находящиеся в памяти. Это может способствовать генерации более качественного кода, поскольку все ссылки на память становятся потенциально общими подвыражениями. В тех случаях, когда они не являются общими подвыражениями, на проходе комбинирования инструкций избыточные загрузки значений в регистры должны удаляться.

-fforce-addr (--force-addr)

Копировать в регистры адресные константы перед выполнением арифметических операций над ними. Это может способствовать порождению более качественного кода по тем же причинам, что и -fforce-mem.

-fomit-frame-pointer (--omit-frame-pointer)

Не хранить в регистре указатель кадра для тех функций, для которых это необязательно. Благодаря этому отпадает необходимость в генерации инструкций для сохранения, установки и восстановления указателя буфера; высвобождается также дополнительный регистр, который можно использовать для других целей.

СКРВ Багет поддерживает эту оптимизацию для функций, которые не обращаются к alloca.

-fno-inline (--no-inline)

Не обращать внимание на ключевое слово inline. Эта опция используется для того чтобы компилятор не обрабатывал никакие функции как встроенные. Заметим, что при неоптимизирующей компиляции встраивание функций вообще никогда не выполняется.

-finline-functions (--inline-functions)

Встраивать все простые функции в местах обращений к ним. Компилятор эвристически принимает решения о том, какие функции считать достаточно простыми для встраивания.

Если все обращения к некоторой функции обработаны как встраивания, и функция декларирована как статическая (static), то эта функция обычно не выводится в результирующий ассемблерный код.

-fkeep-inline-functions (--keep-inline-functions)

Даже если все обращения к некоторой функции обработаны как встраивания, и функция декларирована как статическая (static), все равно сформировать выполняемый код этой функции.

-fno-function-cse (--no-function-cse)

Не помещать адреса функций в регистры; для вызова константных функций генерировать инструкции, в которых явно содержится адрес функции.

-ffast-math (--fast-math)

Эта опция позволяет gccнарушать некоторые правила и спецификации ANSI и IEEE в интересах получения более быстрого выполняемого кода. Например, компилятор может исходить из предположения, что аргумент sqrt всегда неотрицателен, а значения с плавающей точкой никогда не являются нечисловыми (NaN — Not a Number).

Эта опция не подразумевается ни одним из уровней опции -O, поскольку она может привести к генерации некорректного кода для программ, полагающихся на правила и спецификации ANSI или IEEE для математических функций.

Следующие флаги могут понадобиться в редких случаях, когда необходима "тонкая настройка" оптимизации. Все они, за исключением -funroll-loops, подразумеваются опцией-O2.

-fstrength-reduce (--strength-reduce)

Выполнить оптимизацию "снижения сложности циклов" и исключения итерационных переменных.

-fthread-jumps (--thread-jumps)

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

-fcse-follow-jumps (--cse-follow-jumps)

Во время прохода исключения общих подвыражений (CSE) включать в зону просмотра участок, следующий за точкой, в которую выполняется переход, если в эту точку нет других переходов. Например, при обработке оператора if сelse-частью проход CSE проследует вelse-часть, если в нее нет переходов из других мест программы.

-fcse-skip-blocks (--cse-skip-blocks)

Эта опция подобна -fcse-follow-jumps, но она заставляет проход CSE включать в зону просмотра участки, следующие за условно пропускаемыми блоками. Например, при обработке простого оператораifбезelse-части проход CSE продолжит экономию общих подвыражений и на участке, следующем за телом оператораif(если в эту точку нет переходов из других мест программы).

-frerun-cse-after-loop (--rerun-cse-after-loop)

Выполнить повторное исключение общих подвыражений после прохода оптимизации циклов.

-fexpensive-optimizations (--expensive-optimizations)

Выполнить некоторые относительно дорогостоящие виды оптимизации.

-fdelayed-branch (--delayed-branch)

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

Употребление опции -fno-delayed-branch поможет обойти ошибку, которая выражается в неправильном редактировании внешних связей в некоторых фрагментах программ, скомпилированных с включенной оптимизацией -fdelayed-branch.

-fschedule-insns (--schedule-insns)

Выполнить оптимизацию планирования инструкций, т.е. попытаться переупорядочить инструкции таким образом, чтобы исключить задержки выполнения, связанные с тем, что данные, которые нужны для очередной инструкции, еще не вычислены. Это полезно, например для машин с медленной арифметикой для значений с плавающей точкой. За то время, пока вычисляются результаты, необходимые для следующих инструкций, могут быть выполнены некоторые другие инструкции.

-fschedule-insns2 (--schedule-insns2)

Выполнить повторный проход планирования инструкций после распределения регистров. Это полезно для машин с относительно малым числом регистров, где инструкции загрузки из памяти занимают более одного цикла.

-fcaller-saves (--caller-saves)

Допустить размещение значений в регистрах, которые портятся в результате вызовов функций. При этом до (и после) вызовов функций будут генерироваться дополнительные инструкции для сохранения (и восстановления) этих регистров. Выделение таких регистров будет производиться лишь в случаях, когда это, скорее всего приведет к генерации более эффективного кода.

-funroll-loops (--unroll-loops)

-funroll-all-loops (--unroll-all-loops)

Выполнить развертывание циклов.

Соседние файлы в папке Еще материалы