3.10 Параметры, контролирующие оптимизацию
Эти параметры контролируют различные виды оптимизаций.
Без каких-либо параметров оптимизации цель компилятора — сократить затраты на компиляцию и обеспечить, чтобы отладка давала ожидаемые результаты. Операторы независимы: если вы остановите программу с точкой останова между операторами, вы можете присвоить новое значение любой переменной или изменить счётчик команд на любой другой оператор в функции и получить точно такие же результаты, как ожидается из исходного кода.
Включение флагов оптимизации заставляет компилятор пытаться улучшить производительность и/или размер кода в ущерб времени компиляции и, возможно, способности отладить программу.
Компилятор выполняет оптимизацию, основываясь на знаниях о программе. Режим компиляции нескольких файлов в один выходной файл позволяет компилятору использовать информацию, полученную из всех файлов, при компиляции каждого из них.
Не все оптимизации контролируются напрямую флагом. В этом разделе перечислены только оптимизации, для которых есть флаги.
Большинство оптимизаций включены только в том случае, если на командной строке задан уровень -O. В противном случае они отключены, даже если отдельные флаги оптимизации указаны.
В зависимости от целевой платформы и от того, как был сконфигурирован GCC, немного другой набор оптимизаций может быть включён на каждом уровне -O, чем те, которые перечислены здесь. Вы можете вызвать GCC с -Q --help=optimizers, чтобы узнать точный набор оптимизаций, включённых на каждом уровне. См. Общие параметры для примеров.
-
-O-O1 - Оптимизировать. Компиляция с оптимизацией занимает несколько больше времени и требует больше памяти для больших функций.
С
-Oкомпилятор пытается уменьшить размер кода и время выполнения, не выполняя при этом оптимизаций, которые занимают много времени компиляции.-Oвключает следующие флаги оптимизации:-fauto-inc-dec -fcompare-elim -fcprop-registers -fdce -fdefer-pop -fdelayed-branch -fdse -fguess-branch-probability -fif-conversion2 -fif-conversion -fipa-pure-const -fipa-profile -fipa-reference -fmerge-constants -fsplit-wide-types -ftree-bit-ccp -ftree-builtin-call-dce -ftree-ccp -ftree-ch -ftree-copyrename -ftree-dce -ftree-dominator-opts -ftree-dse -ftree-forwprop -ftree-fre -ftree-phiprop -ftree-slsr -ftree-sra -ftree-pta -ftree-ter -funit-at-a-time
-Oтакже включает-fomit-frame-pointerна машинах, где это не мешает отладке. -O2- Оптимизировать ещё сильнее. GCC выполняет почти все поддерживаемые оптимизации, не связанные с компромиссом между размером и скоростью. По сравнению с
-O, этот параметр увеличивает как время компиляции, так и производительность сгенерированного кода.-O2включает все флаги оптимизации, указанные в-O. Он также включает следующие флаги оптимизации:-fthread-jumps -falign-functions -falign-jumps -falign-loops -falign-labels -fcaller-saves -fcrossjumping -fcse-follow-jumps -fcse-skip-blocks -fdelete-null-pointer-checks -fdevirtualize -fdevirtualize-speculatively -fexpensive-optimizations -fgcse -fgcse-lm -fhoist-adjacent-loads -finline-small-functions -findirect-inlining -fipa-sra -fisolate-erroneous-paths-dereference -foptimize-sibling-calls -fpartial-inlining -fpeephole2 -freorder-blocks -freorder-functions -frerun-cse-after-loop -fsched-interblock -fsched-spec -fschedule-insns -fschedule-insns2 -fstrict-aliasing -fstrict-overflow -ftree-switch-conversion -ftree-tail-merge -ftree-pre -ftree-vrp
Обратите внимание на предупреждение в разделе
-fgcseо вызове-O2для программ, использующих вычисленные переходы. -O3- Оптимизировать ещё сильнее.
-O3включает все оптимизации, указанные в-O2, а также включает параметры-finline-functions,-funswitch-loops,-fpredictive-commoning,-fgcse-after-reload,-ftree-loop-vectorize,-ftree-slp-vectorize,-fvect-cost-model,-ftree-partial-preи-fipa-cp-clone. -O0- Сокращение времени компиляции и обеспечение того, чтобы отладка давала ожидаемые результаты. Это значение по умолчанию.
-Os- Оптимизировать под размер.
-Osвключает все-O2оптимизации, которые обычно не увеличивают размер кода. Он также выполняет дополнительные оптимизации, направленные на уменьшение размера кода.-Osотключает следующие флаги оптимизации:-falign-functions -falign-jumps -falign-loops -falign-labels -freorder-blocks -freorder-blocks-and-partition -fprefetch-loop-arrays
-Ofast- Игнорировать строгое соблюдение стандартов.
-Ofastвключает все-O3оптимизации. Он также включает оптимизации, которые не являются допустимыми для всех программ, соответствующих стандарту. Он включает-ffast-mathи специфические для Fortran оптимизации-fno-protect-parensи-fstack-arrays. -Og- Оптимизировать для отладки.
-Ogвключает оптимизации, не мешающие отладке. Это оптимальный уровень оптимизации для стандартного цикла редактирование-компиляция-отладка, предлагая разумный уровень оптимизации при одновременном сохранении быстрой компиляции и хорошей отладки.Если вы используете несколько
-Oпараметров, с номерами уровней или без, эффективным будет последний такой параметр.
Параметры в формате -fflag задают независимые от машины флаги. Большинство флагов имеют как положительную, так и отрицательную форму; отрицательная форма -ffoo — -fno-foo. В таблице ниже указана только одна из форм — та, которую вы обычно используете. Вы можете определить другую форму, либо удалив ‘no-’, либо добавив её.
Следующие параметры контролируют определённые оптимизации. Они либо активируются параметрами -O, либо связаны с ними. Вы можете использовать следующие флаги в редких случаях, когда требуется «тонкая настройка» выполняемых оптимизаций.
-fno-defer-pop- Всегда извлекайте аргументы каждого вызова функции сразу после возврата этой функции. Для машин, которые должны извлекать аргументы после вызова функции, компилятор обычно позволяет аргументам накапливаться в стеке для нескольких вызовов функций и извлекает их все сразу.
Отключено на уровнях
-O,-O2,-O3,-Os. -fforward-propagate- Выполнить прямой проход по RTL. Проход пытается объединить две инструкции и проверяет, можно ли упростить результат. Если включено развертывание цикла, выполняются два прохода, и второй планируется после развертывания цикла.
Этот параметр включен по умолчанию на уровнях оптимизации
-O,-O2,-O3,-Os. -
-ffp-contract=style -
-ffp-contract=offотключает сокращение выражений с плавающей запятой.-ffp-contract=fastвключает сокращение выражений с плавающей запятой, таких как формирование операций умножения-сложения слиянием, если целевая платформа поддерживает их напрямую.-ffp-contract=onвключает сокращение выражений с плавающей запятой, если это разрешено языковым стандартом. В настоящее время это не реализовано и обрабатывается как-ffp-contract=off.По умолчанию
-ffp-contract=fast. -fomit-frame-pointer- Не сохранять указатель на кадр в регистре для функций, которым он не нужен. Это позволяет избежать инструкций сохранения, настройки и восстановления указателей на кадр; это также освобождает дополнительный регистр во многих функциях. Это также делает отладку невозможной на некоторых машинах.
На некоторых машинах, таких как VAX, этот флаг не имеет эффекта, потому что стандартная последовательность вызовов автоматически обрабатывает указатель на кадр и ничего не сохраняется, делая вид, что его не существует. Макрос описания машины
FRAME_POINTER_REQUIREDуправляет тем, поддерживает ли целевая машина этот флаг. См. Использование регистров.Начиная с версии GCC 4.6, значение по умолчанию (если не оптимизируется под размер) для 32-битных целей GNU/Linux x86 и 32-битных целей Darwin x86 было изменено на
-fomit-frame-pointer. По умолчанию можно вернуться к-fno-omit-frame-pointer, сконфигурировав GCC с помощью параметра конфигурации--enable-frame-pointer.Включено на уровнях
-O,-O2,-O3,-Os. -foptimize-sibling-calls- Оптимизировать вызовы родственных и хвостовых рекурсивных функций.
Включено на уровнях
-O2,-O3,-Os. -fno-inline- Не развёртывать никакие функции встраиванием, кроме отмеченных атрибутом
always_inline. Это значение по умолчанию, если оптимизация не включена.Отдельные функции можно исключить из встраивания, отметив их атрибутом
noinline. -finline-small-functions- Встраивать функции в вызывающие функции, если их тело меньше, чем ожидаемый код вызова функции (чтобы общий размер программы уменьшился). Компилятор эвристически определяет, достаточно ли просты функции, чтобы их стоило встраивать таким образом. Это встраивание применяется ко всем функциям, даже к тем, которые не объявлены как inline.
Включено на уровне
-O2. -findirect-inlining- Также встраивать косвенные вызовы, которые обнаруживаются как известные во время компиляции благодаря предыдущему встраиванию. Этот параметр действует только в том случае, если само встраивание включено параметрами
-finline-functionsили-finline-small-functions.Включено на уровне
-O2. -finline-functions- Рассматривать все функции для встраивания, даже если они не объявлены inline. Компилятор эвристически определяет, стоит ли встраивать данные функции таким образом.
Если все вызовы данной функции встроены, и функция объявлена
static, то функция обычно не выводится как отдельный код ассемблера.Включено на уровне
-O3. -finline-functions-called-once- Рассматривать все
staticфункции, вызываемые один раз, для встраивания в вызывающую функцию, даже если они не помечены какinline. Если вызов данной функции встроен, то функция не выводится как отдельный код ассемблера.Включено на уровнях
-O1,-O2,-O3и-Os. -fearly-inlining- Встраивать функции, помеченные
always_inline, и функции, чье тело кажется меньше накладных расходов на вызов функции, до начала измерения-fprofile-generateи фактического этапа встраивания. Это делает профилирование значительно дешевле и обычно встраивание быстрее для программ, имеющих длинные цепочки вложенных функций-обёрток.Включено по умолчанию.
-fipa-sra- Выполнить межпроцедурную замену скаляров агрегатов, удаление неиспользуемых параметров и замену параметров, передаваемых по ссылке, на параметры, передаваемые по значению.
Включено на уровнях
-O2,-O3и-Os. -
-finline-limit=n - По умолчанию GCC ограничивает размер функций, которые можно встраивать. Этот флаг позволяет более тонко контролировать этот предел. n — это размер функций, которые можно встроить в количестве псевдоинструкций.
Встраивание фактически контролируется рядом параметров, которые могут быть указаны индивидуально с помощью --param name=value. Параметр -finline-limit=n устанавливает некоторые из этих параметров следующим образом:
max-inline-insns-single- устанавливается в n/2.
max-inline-insns-auto- устанавливается в n/2.
См. ниже документацию по отдельным параметрам, управляющим встраиванием, и значениям по умолчанию этих параметров.
Примечание: может не быть значения для
-finline-limit, которое приводит к поведению по умолчанию.Примечание: псевдоинструкция в данном контексте представляет собой абстрактную меру размера функции. Она никоим образом не представляет собой счётчик инструкций ассемблера и, следовательно, её точное значение может меняться от одной версии к другой.
-fno-keep-inline-dllexport- Это более детальная версия
-fkeep-inline-functions, которая применяется только к функциям, объявленным с использованием атрибутаdllexportили спецификатора declspec (см. Объявление атрибутов функций.) -fkeep-inline-functions- В C, генерировать
staticфункции, объявленныеinline, в объектный файл, даже если функция была встроена во все вызывающие её функции. Этот переключатель не влияет на функции, использующие расширениеextern inlineв GNU C90. В C++, генерировать все объявленные inline функции в объектный файл. -fkeep-static-consts- Генерировать переменные, объявленные
static const, когда оптимизация не включена, даже если переменные не используются.GCC включает этот параметр по умолчанию. Если вы хотите заставить компилятор проверять использование переменной независимо от включения оптимизации, используйте параметр
-fno-keep-static-consts. -fmerge-constants- Попытка объединить идентичные константы (строковые константы и константы с плавающей запятой) в разных модулях компиляции.
Этот параметр включен по умолчанию для оптимизированной компиляции, если ассемблер и компоновщик её поддерживают. Используйте
-fno-merge-constants, чтобы отключить это поведение.Включено на уровнях
-O,-O2,-O3,-Os. -fmerge-all-constants- Попытка объединить идентичные константы и идентичные переменные.
Этот параметр подразумевает
-fmerge-constants. В дополнение к-fmerge-constants, он также рассматривает, например, даже массивы, инициализированные константами, или переменные, инициализированные константами, с целочисленными или плавающими типами. Языки, такие как C или C++, требуют, чтобы каждая переменная, включая несколько экземпляров одной переменной в рекурсивных вызовах, имела разные места, поэтому использование этого параметра приводит к несоответствующему поведению. -fmodulo-sched- Выполнить планирование по модулю с качанием сразу перед первым проходом планирования. Этот проход рассматривает вложенные циклы и переупорядочивает их инструкции, перекрывая разные итерации.
-fmodulo-sched-allow-regmoves- Выполнить более агрессивное планирование по модулю на основе SMS с разрешенными перемещениями регистров. Установив этот флаг, некоторые рёбра антизависимостей удаляются, что запускает генерацию перемещений регистров на основе анализа диапазона жизни. Этот параметр эффективен только при включенном
-fmodulo-sched. -fno-branch-count-reg- Не использовать инструкции «декремент и переход» в регистре счётчика, а вместо этого генерировать последовательность инструкций, декрементирующих регистр, сравнивающих его с нулём, а затем переходящих в зависимости от результата. Этот параметр имеет смысл только на архитектурах, которые поддерживают такие инструкции, включая x86, PowerPC, IA-64 и S/390.
Значение по умолчанию
-fbranch-count-reg. -fno-function-cse- Не помещать адреса функций в регистры; сделать так, чтобы каждая инструкция, вызывающая постоянную функцию, содержала адрес функции явно.
Этот параметр приводит к менее эффективному коду, но некоторые странные методы, изменяющие вывод ассемблера, могут быть спутаны оптимизациями, когда этот параметр не используется.
Значение по умолчанию
-ffunction-cse -fno-zero-initialized-in-bss- Если целевая платформа поддерживает секцию BSS, GCC по умолчанию помещает переменные, инициализированные нулём, в BSS. Это может сэкономить место в результирующем коде.
Этот параметр отключает это поведение, поскольку некоторые программы явно полагаются на то, что переменные попадают в секцию данных — например, чтобы результируемый исполняемый файл мог найти начало этой секции и/или делать предположения на основе этого.
Значение по умолчанию
-fzero-initialized-in-bss. -fthread-jumps- Выполнять оптимизации, которые проверяют, переходит ли переход к месту, где другой сравнительный оператор, покрытый первым, найден. Если это так, первый переход перенаправляется либо к месту назначения второго перехода, либо к точке непосредственно после него, в зависимости от того, известно ли, что условие истинно или ложно.
Включено на уровнях
-O2,-O3,-Os. -fsplit-wide-types
- При использовании типа, занимающего несколько регистров, например,
long longна 32-битной системе, разделите регистры и выделяйте их независимо. Это обычно генерирует лучший код для таких типов, но может затруднить отладку.Включено на уровнях
-O,-O2,-O3,-Os. -fcse-follow-jumps- При устранении общих подвыражений (CSE) просматриваются инструкции перехода, когда целевой адрес перехода не достигается другим путем. Например, когда CSE встречает инструкцию
ifс фрагментомelse, CSE следует по переходу, когда проверяемое условие ложно.Включено на уровнях
-O2,-O3,-Os. -fcse-skip-blocks- Это аналогично
-fcse-follow-jumps, но заставляет CSE следовать переходам, которые условно пропускают блоки. Когда CSE встречает простую инструкциюifбез else-фрагмента,-fcse-skip-blocksзаставляет CSE следовать переходу вокруг телаif.Включено на уровнях
-O2,-O3,-Os. -frerun-cse-after-loop- Повторное выполнение устранения общих подвыражений после оптимизаций циклов.
Включено на уровнях
-O2,-O3,-Os. -fgcse- Выполнение глобального устранения общих подвыражений. Этот этап также выполняет глобальную константную и копируемую простановку.
Примечание: При компиляции программы с использованием вычисленных переходов, расширения GCC, вы можете получить лучшую производительность во время выполнения, если отключить глобальное устранение общих подвыражений, добавив
-fno-gcseв командную строку.Включено на уровнях
-O2,-O3,-Os. -fgcse-lm- Когда
-fgcse-lmвключено, глобальное устранение общих подвыражений пытается переместить загрузки, убиваемые только хранением, в себя. Это позволяет изменить цикл, содержащий последовательность загрузка/хранение, на загрузку вне цикла и копирование/хранение внутри цикла.Включается по умолчанию, когда включено
-fgcse. -fgcse-sm- Когда
-fgcse-smвключено, выполняется проход перемещения хранений после глобального устранения общих подвыражений. Этот проход пытается вынести хранение из циклов. При использовании в сочетании с-fgcse-lm, циклы, содержащие последовательность загрузка/хранение, могут быть изменены на загрузку перед циклом и хранение после цикла.Не включено ни на одном уровне оптимизации.
-fgcse-las- Когда
-fgcse-lasвключено, глобальный проход по устранению общих подвыражений устраняет избыточные загрузки, следующие за хранением в той же памяти (как частичные, так и полные избытки).Не включено ни на одном уровне оптимизации.
-fgcse-after-reload- Когда
-fgcse-after-reloadвключено, выполняется проход по устранению избыточных загрузок после перегрузки. Цель этого прохода — очистить избыточное выталкивание. -faggressive-loop-optimizations- Этот параметр сообщает оптимизатору циклов использовать ограничения языка для определения границ числа итераций цикла. Предполагается, что код цикла не вызывает неопределенное поведение, например, вызывая переполнение целых чисел со знаком или доступ к массивам за пределами границ. Границы числа итераций цикла используются для управления оптимизацией развертывания циклов, срезанием и оптимизацией проверки выхода из цикла. Этот параметр включен по умолчанию.
-funsafe-loop-optimizations- Этот параметр сообщает оптимизатору циклов, что предполагает, что индексы циклов не переполняются, и что циклы с нетривиальным условием выхода не бесконечны. Это позволяет оптимизировать более широкий класс циклов, даже если сам оптимизатор циклов не может доказать, что эти предположения верны. Если вы используете
-Wunsafe-loop-optimizations, компилятор предупреждает вас, если находит такой цикл. -fcrossjumping- Выполняется преобразование переходов через переходы. Это преобразование унифицирует эквивалентный код и сохраняет размер кода. Полученный код может быть лучше или хуже, чем без преобразования переходов через переходы.
Включено на уровнях
-O2,-O3,-Os. -fauto-inc-dec- Объединение инкрементов или декрементов адресов с обращениями к памяти. Этот проход всегда пропускается на архитектурах, не поддерживающих такие инструкции. Включено по умолчанию на уровнях
-Oи выше на архитектурах, которые поддерживают это. -fdce- Выполнение устранения неиспользуемого кода (DCE) на RTL. Включено по умолчанию на уровнях
-Oи выше. -fdse- Выполнение устранения неиспользуемого хранения (DSE) на RTL. Включено по умолчанию на уровнях
-Oи выше. -fif-conversion- Попытка преобразовать условные переходы в безусловные эквиваленты. Это включает использование условных перемещений, мин, макс, установки флагов и инструкций abs, а также некоторых трюков, выполнимых стандартной арифметикой. Использование условного выполнения на чипах, где оно доступно, контролируется параметром
if-conversion2.Включено на уровнях
-O,-O2,-O3,-Os. -fif-conversion2- Использование условного выполнения (если доступно) для преобразования условных переходов в безусловные эквиваленты.
Включено на уровнях
-O,-O2,-O3,-Os. -fdeclone-ctor-dtor- C++ ABI требует несколько точек входа для конструкторов и деструкторов: одну для базового подобъекта, одну для полного объекта и одну для виртуального деструктора, который затем вызывает оператор delete. Для иерархии с виртуальными базой базовая и полная варианты являются клонами, что означает две копии функции. С этим параметром базовые и полные варианты изменяются на перехватывающие вызовы общей реализации.
Включено параметром
-Os. -fdelete-null-pointer-checks- Предполагается, что программы не могут безопасно обращаться к нулевым указателям и что ни один элемент кода или данных там не находится. Это позволяет оптимизировать простое свертывание констант на всех уровнях оптимизации. Кроме того, другие этапы оптимизации в GCC используют этот флаг для управления глобальными анализами потоков данных, которые устраняют бесполезные проверки на нулевые указатели; они предполагают, что если указатель проверяется после того, как уже был разыменован, он не может быть нулевым.
Однако в некоторых средах это предположение неверно. Используйте
-fno-delete-null-pointer-checks, чтобы отключить эту оптимизацию для программ, зависящих от этого поведения.Некоторые целевые платформы, особенно встроенные, отключают этот параметр на всех уровнях. В противном случае он включен на всех уровнях:
-O0,-O1,-O2,-O3,-Os. Процессы, использующие эту информацию, включаются независимо на разных уровнях оптимизации. -fdevirtualize- Попытка преобразовать вызовы виртуальных функций в прямые вызовы. Это делается как внутри процедуры, так и между процедурами в рамках косвенной инлайнизации (
-findirect-inlining) и межпроцедурной константной простановки (-fipa-cp). Включено на уровнях-O2,-O3,-Os. -fdevirtualize-speculatively- Попытка преобразовать вызовы виртуальных функций в условные прямые вызовы. Основываясь на анализе графа наследования типов, определить для данного вызова множество вероятных целей. Если множество невелико, предпочтительно одного элемента, преобразовать вызов в условный, определяющий прямой или косвенный вызов. Условные вызовы позволяют выполнять больше оптимизаций, таких как инлайнирование. Если они кажутся бесполезными после дальнейшей оптимизации, они преобразуются обратно в исходный вид.
-fexpensive-optimizations- Выполнение ряда незначительных оптимизаций, которые относительно дороги.
Включено на уровнях
-O2,-O3,-Os. -free- Попытка удалить избыточные расширяющие инструкции. Это особенно полезно для архитектуры x86-64, которая неявно расширяет до 64 бит регистры после записи в их нижнюю 32-битную половину.
Включено для Alpha, AArch64 и x86 на уровнях
-O2,-O3,-Os. -fno-lifetime-dse- В C++ значение объекта затрагивается только изменениями в течение его жизненного цикла: когда начинается конструктор, объект имеет неопределенное значение, а любые изменения во время жизненного цикла объекта становятся неиспользуемыми при уничтожении объекта. Обычно устранение избыточных хранений использует это; если ваш код полагается на то, что хранение объекта сохраняется после окончания жизненного цикла объекта, вы можете использовать этот флаг для отключения этой оптимизации.
-flive-range-shrinkage- Попытка уменьшить давление на регистры за счет уменьшения живых диапазонов регистров. Это полезно для быстрых процессоров с малым или умеренным числом регистров.
-
-fira-algorithm=algorithm - Использование указанного алгоритма раскраски для интегрированного планировщика регистров. Аргумент algorithm может быть ‘
priority’, что определяет приоритетную раскраску по методу Чау, или ‘CB’, что определяет раскраску по методу Чейтина-Бриггса. Раскраска по методу Чейтина-Бриггса не реализована для всех архитектур, но для тех целей, которые поддерживают её, она является по умолчанию, потому что она генерирует лучший код. -
-fira-region=region - Использование указанных областей для интегрированного планировщика регистров. Аргумент region должен быть одним из следующих:
- ‘
all’ - Использование всех циклов в качестве областей выделения регистров. Это может дать лучшие результаты для машин с малым и/или нерегулярным набором регистров.
- ‘
mixed’ - Использование всех циклов, за исключением циклов с низким давлением на регистры, как областей. Это значение обычно дает лучшие результаты в большинстве случаев и для большинства архитектур и включено по умолчанию при компиляции со скоростью оптимизации (
-O,-O2, ...). - ‘
one’ - Использование всех функций в качестве одной области. Это, как правило, приводит к наименьшему размеру кода и включено по умолчанию для
-Osили-O0.
- ‘
-fira-hoist-pressure
- Используйте IRA для оценки давления регистров в ходе прохода подъёма кода для принятия решений о подъёме выражений. Этот параметр обычно приводит к меньшему коду, но может замедлить компилятор.
Этот параметр включён на уровне
-Osдля всех целевых платформ. -fira-loop-pressure- Используйте IRA для оценки давления регистров в циклах для принятия решений о перемещении инвариантов цикла. Этот параметр обычно приводит к генерации более быстрого и компактного кода на машинах с большим числом регистров (>= 32 регистра), но может замедлить компилятор.
Этот параметр включён на уровне
-O3для некоторых целевых платформ. -fno-ira-share-save-slots-fno-ira-share-spill-slots-
-fira-verbose=n - Управляет объёмом вывода файла дампов для интегрированного распределятеля регистров. Значение по умолчанию равно 5. Если значение n больше или равно 10, вывод дампов отправляется в stderr в том же формате, что и для n минус 10.
-fdelayed-branch- Если для целевой машины это поддерживается, попытаться переупорядочить инструкции, чтобы использовать слоты инструкций, доступные после инструкций задержки ветвления.
Включено на уровнях
-O,-O2,-O3,-Os. -fschedule-insns- Если для целевой машины это поддерживается, попытаться переупорядочить инструкции, чтобы устранить задержки выполнения из-за отсутствия необходимых данных. Это помогает машинам, у которых медленные инструкции с плавающей точкой или загрузки из памяти, позволяя выполнять другие инструкции до тех пор, пока результат загрузки или инструкции с плавающей точкой не потребуется.
Включено на уровнях
-O2,-O3. -fschedule-insns2- Аналогично
-fschedule-insns, но запрашивает дополнительный проход планирования инструкций после распределения регистров. Это особенно полезно на машинах с относительно небольшим количеством регистров и где инструкции загрузки из памяти занимают более одного цикла.Включено на уровнях
-O2,-O3,-Os. -fno-sched-interblock- Не планировать инструкции между базовыми блоками. Это обычно включено по умолчанию при планировании перед распределением регистров, т.е. с
-fschedule-insnsили на уровне-O2или выше. -fno-sched-spec- Не допускать упреждающего перемещения инструкций, не являющихся инструкциями загрузки. Это обычно включено по умолчанию при планировании перед распределением регистров, т.е. с
-fschedule-insnsили на уровне-O2или выше. -fsched-pressure- Включить чувствительное к давлению регистров планирование инструкций перед распределением регистров. Это имеет смысл только при включённом планировании перед распределением регистров, т.е. с
-fschedule-insnsили на уровне-O2или выше. Использование этого параметра может улучшить сгенерированный код и уменьшить его размер, предотвращая увеличение давления регистров выше количества доступных регистров жесткого типа и последующие выбросы при распределении регистров. -fsched-spec-load- Разрешить упреждающее перемещение некоторых инструкций загрузки. Это имеет смысл только при планировании перед распределением регистров, т.е. с
-fschedule-insnsили на уровне-O2или выше. -fsched-spec-load-dangerous- Разрешить упреждающее перемещение большего количества инструкций загрузки. Это имеет смысл только при планировании перед распределением регистров, т.е. с
-fschedule-insnsили на уровне-O2или выше. -
-fsched-stalled-insns-fsched-stalled-insns=n - Определяет, сколько инструкций (если есть) можно предварительно перемещать из очереди приостановленных инструкций в список готовых инструкций во время второго прохода планирования.
-fno-sched-stalled-insnsозначает, что никакие инструкции не перемещаются предварительно,-fsched-stalled-insns=0означает, что нет ограничений на то, сколько приостановленных инструкций можно перемещать предварительно.-fsched-stalled-insnsбез значения эквивалентно-fsched-stalled-insns=1. -
-fsched-stalled-insns-dep-fsched-stalled-insns-dep=n - Определяет, сколько групп инструкций (циклов) проверяются на наличие зависимости от приостановленной инструкции, которая является кандидатом на предварительное удаление из очереди приостановленных инструкций. Это имеет влияние только во время второго прохода планирования и только если используется
-fsched-stalled-insns.-fno-sched-stalled-insns-depэквивалентно-fsched-stalled-insns-dep=0.-fsched-stalled-insns-depбез значения эквивалентно-fsched-stalled-insns-dep=1. -fsched2-use-superblocks- При планировании после распределения регистров использовать планирование суперблоков. Это позволяет перемещение через границы базовых блоков, что приводит к более быстрым расписаниям. Этот параметр является экспериментальным, так как не все описания машин, используемые GCC, достаточно точно моделируют процессор, чтобы избежать ненадёжных результатов от алгоритма.
Это имеет смысл только при планировании после распределения регистров, т.е. с
-fschedule-insns2или на уровне-O2или выше. -fsched-group-heuristic- Включить эвристику группы в планировщике. Эта эвристика отдаёт предпочтение инструкции, принадлежащей группе расписания. Включено по умолчанию, когда включено планирование, т.е. с
-fschedule-insnsили-fschedule-insns2или на уровне-O2или выше. -fsched-critical-path-heuristic- Включить эвристику критического пути в планировщике. Эта эвристика отдаёт предпочтение инструкциям на критическом пути. Включено по умолчанию, когда включено планирование, т.е. с
-fschedule-insnsили-fschedule-insns2или на уровне-O2или выше. -fsched-spec-insn-heuristic- Включить эвристику упреждающей инструкции в планировщике. Эта эвристика отдаёт предпочтение упреждающим инструкциям с большей слабостью зависимости. Включено по умолчанию, когда включено планирование, т.е. с
-fschedule-insnsили-fschedule-insns2или на уровне-O2или выше. -fsched-rank-heuristic- Включить эвристику ранга в планировщике. Эта эвристика отдаёт предпочтение инструкции, принадлежащей базовому блоку с большим размером или частотой. Включено по умолчанию, когда включено планирование, т.е. с
-fschedule-insnsили-fschedule-insns2или на уровне-O2или выше. -fsched-last-insn-heuristic- Включить эвристику последней инструкции в планировщике. Эта эвристика отдаёт предпочтение инструкции, которая менее зависит от последней запланированной инструкции. Включено по умолчанию, когда включено планирование, т.е. с
-fschedule-insnsили-fschedule-insns2или на уровне-O2или выше. -fsched-dep-count-heuristic- Включить эвристику счётчика зависимостей в планировщике. Эта эвристика отдаёт предпочтение инструкции, от которой зависят больше инструкций. Включено по умолчанию, когда включено планирование, т.е. с
-fschedule-insnsили-fschedule-insns2или на уровне-O2или выше. -freschedule-modulo-scheduled-loops- Модульное планирование выполняется до традиционного планирования. Если цикл модульно запланирован, последующие проходы планирования могут изменить его расписание. Этот параметр используется для управления этим поведением.
-fselective-scheduling- Планировать инструкции с помощью алгоритма селективного планирования. Селективное планирование выполняется вместо первого прохода планировщика.
-fselective-scheduling2- Планировать инструкции с помощью алгоритма селективного планирования. Селективное планирование выполняется вместо второго прохода планировщика.
-fsel-sched-pipelining- Включить программную конвейеризацию вложенных циклов во время селективного планирования. Этот параметр не оказывает влияния, если не включен ни один из
-fselective-schedulingили-fselective-scheduling2. -fsel-sched-pipelining-outer-loops- При конвейеризации циклов во время селективного планирования также конвейеризировать внешние циклы. Этот параметр не оказывает влияния, если не включен
-fsel-sched-pipelining. -fshrink-wrap- Выводить прологи функций только перед частями функции, которые в них нуждаются, а не в начале функции. Этот флаг включён по умолчанию на уровне
-Oи выше. -fcaller-saves- Включить выделение значений в регистры, которые разрушаются вызовами функций, выдав дополнительные инструкции для сохранения и восстановления регистров вокруг таких вызовов. Такое выделение выполняется только в тех случаях, когда это, кажется, приводит к лучшему коду.
Этот параметр всегда включён по умолчанию на некоторых машинах, обычно тех, у которых нет регистров сохраняемых при вызове для использования вместо этого.
Включено на уровнях
-O2,-O3,-Os. -fcombine-stack-adjustments- Отслеживает корректировки стека (записи и считывания) и ссылки на память стека, а затем пытается найти способы их комбинирования.
Включено по умолчанию на уровне
-O1и выше. -fconserve-stack- Попытаться минимизировать использование стека. Компилятор пытается использовать меньше места в стеке, даже если это замедляет программу. Этот параметр подразумевает установку параметра
large-stack-frameв 100 и параметраlarge-stack-frame-growthв 400. -ftree-reassoc- Выполнить перегруппировку в деревьях. Этот флаг включён по умолчанию на уровне
-Oи выше. -ftree-pre- Выполнить частичное устранение избыточности (PRE) в деревьях. Этот флаг включён по умолчанию на уровнях
-O2и-O3. -ftree-partial-pre- Сделать частичное устранение избыточности (PRE) более агрессивным. Этот флаг включён по умолчанию на уровне
-O3. -ftree-forwprop- Выполнить распространение вперёд в деревьях. Этот флаг включён по умолчанию на уровне
-Oи выше. -ftree-fre- Выполнить полное устранение избыточности (FRE) в деревьях. Разница между FRE и PRE состоит в том, что FRE рассматривает только выражения, которые вычисляются на всех путях, ведущих к избыточному вычислению. Этот анализ быстрее, чем PRE, хотя он обнаруживает меньше избыточностей. Этот флаг включён по умолчанию на уровне
-Oи выше. -ftree-phiprop- Выполнить подъём загрузки из условных указателей в деревьях. Этот проход включён по умолчанию на уровне
-Oи выше. -fhoist-adjacent-loads
- Умозрительно поднять данные с обеих ветвей условного оператора if-then-else, если данные загружаются из смежных расположений в одной структуре, и целевая архитектура имеет инструкцию условного перемещения. Этот флаг включён по умолчанию при
-O2и выше. -ftree-copy-prop- Выполнить распространение копирования по деревьям. Этот этап устраняет ненужные операции копирования. Этот флаг включён по умолчанию при
-Oи выше. -fipa-pure-const- Определить, какие функции являются чистыми или константными. Включено по умолчанию при
-Oи выше. -fipa-reference- Определить, какие статические переменные не выходят за пределы единицы компиляции. Включено по умолчанию при
-Oи выше. -fipa-pta- Выполнить межкадровый анализ указателей и межкадровый анализ модификаций и ссылок. Этот параметр может привести к чрезмерному использованию памяти и времени компиляции в больших единицах компиляции. Он не включен по умолчанию ни на одном уровне оптимизации.
-fipa-profile- Выполнить распространение межкадрового профиля. Функции, вызываемые только из холодных функций, помечаются как холодные. Также идентифицируются функции, выполняемые один раз (например,
cold,noreturn, статические конструкторы или деструкторы). Холодные функции и части функций, выполняемые один раз, не содержащие циклов, затем оптимизируются по размеру. Этот флаг включён по умолчанию при-Oи выше. -fipa-cp- Выполнить межкадровое распространение констант. Эта оптимизация анализирует программу, чтобы определить, когда значения, передаваемые функциям, являются константами, и затем оптимизирует соответствующим образом. Эта оптимизация может существенно повысить производительность, если приложение передает функции константы. Этот флаг включен по умолчанию при уровнях
-O2,-Osи-O3. -fipa-cp-clone- Выполнить клонирование функций, чтобы усилить межкадровое распространение констант. При включении, межкадровое распространение констант выполняет клонирование функций, когда внешне видимую функцию можно вызвать с константными аргументами. Поскольку эта оптимизация может создавать несколько копий функций, это может значительно увеличить размер кода (см. --param ipcp-unit-growth=value). Этот флаг включен по умолчанию при
-O3. -fisolate-erroneous-paths-dereference- Обнаружение путей, которые вызывают ошибочное или неопределённое поведение из-за разыменования указателя NULL. Изолировать эти пути от основного потока управления и преобразовать оператор с ошибочным или неопределённым поведением в ловушку.
-fisolate-erroneous-paths-attribute- Обнаружение путей, которые вызывают ошибочное или неопределённое поведение из-за использования значения NULL способом, запрещённым атрибутом
returns_nonnullилиnonnull. Изолировать эти пути от основного потока управления и преобразовать оператор с ошибочным или неопределённым поведением в ловушку. В настоящее время это не включено, но может быть включено-O2в будущем. -ftree-sink- Выполнить передвижение сохранения вперёд по деревьям. Этот флаг включён по умолчанию при
-Oи выше. -ftree-bit-ccp- Выполнить распространение разреженной условной константы по битам и распространить информацию о выравнивании указателя по деревьям. Этот этап работает только с локальными скалярными переменными и включен по умолчанию при
-Oи выше. Требуется, чтобы-ftree-ccpбыл включен. -ftree-ccp- Выполнить распространение разреженной условной константы (CCP) по деревьям. Этот этап работает только с локальными скалярными переменными и включен по умолчанию при
-Oи выше. -ftree-switch-conversion- Преобразовать простые инициализации в операторе switch в инициализации из скалярного массива. Этот флаг включён по умолчанию при
-O2и выше. -ftree-tail-merge- Искать идентичные последовательности кода. При обнаружении заменить одну переходом на другую. Эта оптимизация известна как слияние хвостов или межпрограммные переходы. Этот флаг включен по умолчанию при
-O2и выше. Время компиляции на этом этапе может быть ограничено параметромmax-tail-merge-comparisonsи параметромmax-tail-merge-iterations. -ftree-dce- Выполнить удаление мёртвого кода (DCE) по деревьям. Этот флаг включён по умолчанию при
-Oи выше. -ftree-builtin-call-dce- Выполнить удаление мёртвого условного кода (DCE) для вызовов встроенных функций, которые могут установить
errno, но при этом не имеют побочных эффектов. Этот флаг включён по умолчанию при-O2и выше, если также не указан-Os. -ftree-dominator-opts- Выполнить различные простые очистку скалярных значений (распространение констант/копий, устранение избыточности, распространение диапазонов и упрощение выражений) на основе обхода дерева доминаторов. Также выполняется провязывание переходов (для уменьшения переходов на переходы). Этот флаг включён по умолчанию при
-Oи выше. -ftree-dse- Выполнить удаление мёртвого сохранения (DSE) по деревьям. Мёртвое сохранение – это сохранение в ячейке памяти, которое позже перезаписывается другим сохранением без промежуточных загрузки. В этом случае более раннее сохранение может быть удалено. Этот флаг включён по умолчанию при
-Oи выше. -ftree-ch- Выполнить копирование заголовков циклов по деревьям. Это выгодно, так как увеличивает эффективность оптимизаций перемещения кода. Также экономится один переход. Этот флаг включён по умолчанию при
-Oи выше. Он не включён для-Os, так как обычно увеличивает размер кода. -ftree-loop-optimize- Выполнить оптимизацию циклов по деревьям. Этот флаг включён по умолчанию при
-Oи выше. -ftree-loop-linear- Выполнить преобразования перестановки циклов на дереве. То же, что и
-floop-interchange. Для использования этого преобразования кода GCC необходимо сконфигурировать с--with-pplи--with-cloog, чтобы включить инфраструктуру преобразования циклов Graphite. -floop-interchange- Выполнить преобразования перестановки циклов для циклов. Перестановка двух вложенных циклов меняет внутренний и внешний циклы. Например, для цикла:
DO J = 1, M DO I = 1, N A(J, I) = A(J, I) * C ENDDO ENDDOперестановка циклов преобразует цикл, как если бы он был написан:
DO I = 1, N DO J = 1, M A(J, I) = A(J, I) * C ENDDO ENDDOчто может быть полезно, когда
Nбольше, чем кэш, потому что в Fortran элементы массива хранятся в памяти непрерывно по столбцам, а исходный цикл итерируется по строкам, потенциально создавая промах кэша при каждом обращении. Эта оптимизация применяется ко всем языкам, поддерживаемым GCC, и не ограничивается Fortran. Для использования этого преобразования кода GCC необходимо сконфигурировать с--with-pplи--with-cloog, чтобы включить инфраструктуру преобразования циклов Graphite. -floop-strip-mine- Выполнить преобразования разбиения циклов на полосы для циклов. Разбиение на полосы делит цикл на два вложенных цикла. Внешний цикл имеет шаги, равные размеру полосы, а внутренний цикл имеет шаги исходного цикла в пределах полосы. Длину полосы можно изменить, используя параметр
loop-block-tile-size. Например, для цикла:DO I = 1, N A(I) = A(I) + C ENDDO
разбиение цикла на полосы преобразует цикл, как если бы он был написан:
DO II = 1, N, 51 DO I = II, min (II + 50, N) A(I) = A(I) + C ENDDO ENDDOЭта оптимизация применяется ко всем языкам, поддерживаемым GCC, и не ограничивается Fortran. Для использования этого преобразования кода GCC необходимо сконфигурировать с
--with-pplи--with-cloog, чтобы включить инфраструктуру преобразования циклов Graphite. -floop-block- Выполнить преобразования блочного разбиения для циклов. Блочное разбиение разбивает каждый цикл в цикловом вложении так, что обращения к памяти элементарных циклов помещаются в кэш. Длину полосы можно изменить, используя параметр
loop-block-tile-size. Например, для цикла:DO I = 1, N DO J = 1, M A(J, I) = B(I) + C(J) ENDDO ENDDOблочное разбиение преобразует цикл, как если бы он был написан:
DO II = 1, N, 51 DO JJ = 1, M, 51 DO I = II, min (II + 50, N) DO J = JJ, min (JJ + 50, M) A(J, I) = B(I) + C(J) ENDDO ENDDO ENDDO ENDDOчто может быть полезно, когда
Mбольше, чем кэш, потому что внутренний цикл итерируется по меньшему количеству данных, которые могут храниться в кэше. Эта оптимизация применяется ко всем языкам, поддерживаемым GCC, и не ограничивается Fortran. Для использования этого преобразования кода GCC необходимо сконфигурировать с--with-pplи--with-cloog, чтобы включить инфраструктуру преобразования циклов Graphite. -fgraphite-identity- Включить тождественное преобразование для graphite. Для каждого SCoP мы генерируем полигональное представление и преобразуем его обратно в gimple. С помощью
-fgraphite-identityмы можем проверить затраты или выгоды преобразования GIMPLE -> GRAPHITE -> GIMPLE. Некоторые минимальные оптимизации также выполняются генератором кода CLooG, такие как разделение индексов и удаление мёртвого кода в циклах. -floop-nest-optimize- Включить оптимизатор вложенных циклов на основе ISL. Это универсальный оптимизатор вложенных циклов, основанный на алгоритмах оптимизации Pluto. Он вычисляет структуру цикла, оптимизированную под локальность данных и параллелизм. Этот параметр экспериментальный.
-floop-parallelize-all- Использовать анализ зависимостей данных Graphite для определения циклов, которые можно распараллелить. Распараллелить все циклы, которые можно проанализировать, не содержащие внутрицикловых зависимостей, не проверяя, выгодно ли распараллеливать циклы.
-fcheck-data-deps- Сравнение результатов нескольких анализаторов зависимостей данных. Этот параметр используется для отладки анализаторов зависимостей данных.
-ftree-loop-if-convert- Попытка преобразовать условные переходы во вложенных циклах в их безусловные эквиваленты. Цель – удалить поток управления из вложенных циклов, чтобы улучшить возможность обработки этих циклов этапом векторизации. Включено по умолчанию, если векторизация включена.
-ftree-loop-if-convert-stores- Попытка также преобразовать условные переходы, содержащие записи в память. Это преобразование может быть небезопасным для многопоточных программ, так как оно преобразует условные записи в память в безусловные записи в память. Например,
for (i = 0; i < N; i++) if (cond) A[i] = expr;преобразуется в
for (i = 0; i < N; i++) A[i] = cond ? expr : A[i];
что может привести к гонкам данных.
-ftree-loop-distribution- Выполнить распределение циклов. Этот флаг может улучшить производительность кэша больших циклов и позволит выполнить дальнейшую оптимизацию циклов, например, распараллеливание или векторизацию. Например, цикл
DO I = 1, N A(I) = B(I) + C D(I) = E(I) * F ENDDO
преобразуется в
DO I = 1, N A(I) = B(I) + C ENDDO DO I = 1, N D(I) = E(I) * F ENDDO
-ftree-loop-distribute-patterns
- Выполнить распределение циклов шаблонов, которые могут быть сгенерированы кодом с вызовами библиотеки. Этот флаг включён по умолчанию в
-O3.Этот этап распределяет циклы инициализации и генерирует вызов memset zero. Например, цикл
DO I = 1, N A(I) = 0 B(I) = A(I) + I ENDDO
преобразуется в
DO I = 1, N A(I) = 0 ENDDO DO I = 1, N B(I) = A(I) + I ENDDO
и цикл инициализации преобразуется в вызов memset zero.
-ftree-loop-im- Выполнить перемещение инвариантов цикла по деревьям. Этот этап перемещает только инварианты, которые трудно обработать на уровне RTL (вызовы функций, операции, которые расширяются до нетривиальных последовательностей команд). С помощью
-funswitch-loopsон также перемещает операнды условий, которые являются инвариантами, из цикла, так что мы можем использовать только тривиальный анализ инвариантности в цикле unswitching. Этап также включает перемещение хранений. -ftree-loop-ivcanon- Создать канонический счётчик для числа итераций в циклах, для которых определение числа итераций требует сложного анализа. Позже оптимизации смогут легко определить это число. Особенно полезно в связи с развёртыванием циклов.
-fivopts- Выполнить оптимизации переменных индукции (уменьшение силы, слияние переменных индукции и удаление переменных индукции) по деревьям.
-ftree-parallelize-loops=n- Параллелизовать циклы, т.е. разделить их пространство итераций для выполнения в n потоках. Это возможно только для циклов, итерации которых независимы и могут быть произвольно переупорядочены. Оптимизация выгодна только на многопроцессорных машинах для циклов, которые являются ресурсоёмкими по ЦП, а не ограниченными, например, пропускной способностью памяти. Этот параметр подразумевает
-pthread, и поэтому поддерживается только на целевых платформах, которые поддерживают-pthread. -ftree-pta- Выполнить локальный по функциям анализ указания на деревья. Этот флаг включён по умолчанию на уровне
-Oи выше. -ftree-sra- Выполнить замену скаляров агрегатов. Этот этап заменяет ссылки на структуры скалярами, чтобы не сохранять структуры в памяти слишком рано. Этот флаг включён по умолчанию на уровне
-Oи выше. -ftree-copyrename- Выполнить переименование копий на деревьях. Этот этап пытается переименовать временные переменные компилятора на другие переменные в местах копирования, что обычно приводит к именам переменных, которые более точно отражают исходные переменные. Этот флаг включён по умолчанию на уровне
-Oи выше. -ftree-coalesce-inlined-vars- Указать этапу copyrename (см.
-ftree-copyrename), чтобы попытаться комбинировать и небольшие пользовательские переменные тоже, но только если они были вставлены из других функций. Это более ограниченная форма-ftree-coalesce-vars. Это может навредить информацией отладки таких вставленных переменных, но сохранит переменные из вставленной в функцию отдельно друг от друга, так что они с большей вероятностью будут содержать ожидаемые значения в сессии отладки. Это был по умолчанию в версиях GCC старше 4.7. -ftree-coalesce-vars- Указать этапу copyrename (см.
-ftree-copyrename), чтобы попытаться комбинировать и небольшие пользовательские переменные тоже, а не только временные переменные компилятора. Это может существенно ограничить возможность отладки оптимизированной программы, скомпилированной с-fno-var-tracking-assignments. В отрицательной форме этот флаг предотвращает слияние SSA пользовательских переменных, включая вставленные. Этот параметр включён по умолчанию. -ftree-ter- Выполнить замену временных выражений во время фазы SSA->нормальный. Временные переменные с единственным использованием/определением заменяются в месте использования своим определяющим выражением. Это приводит к коду, не являющемуся GIMPLE, но даёт расширителям гораздо более сложные деревья для работы, что приводит к лучшему генерированию RTL. Это включено по умолчанию на уровне
-Oи выше. -ftree-slsr- Выполнить линейное уменьшение силы по деревьям. Это распознаёт взаимосвязанные выражения, включающие умножения, и заменяет их менее дорогими вычислениями, когда это возможно. Это включено по умолчанию на уровне
-Oи выше. -ftree-vectorize- Выполнить векторизацию по деревьям. Этот флаг включает
-ftree-loop-vectorizeи-ftree-slp-vectorize, если не указано явно. -ftree-loop-vectorize- Выполнить векторизацию циклов по деревьям. Этот флаг включён по умолчанию на уровне
-O3и при включении-ftree-vectorize. -ftree-slp-vectorize- Выполнить векторизацию базовых блоков по деревьям. Этот флаг включён по умолчанию на уровне
-O3и при включении-ftree-vectorize. -
-fvect-cost-model=model - Изменить модель затрат, используемую для векторизации. Аргумент model должен быть одним из
unlimited,dynamicилиcheap. С модельюunlimitedпредполагается, что векторизованный путь кода будет выгодным, а с модельюdynamicпроверка во время выполнения будет защищать векторизованный путь кода, чтобы включить его только для числа итераций, которые, вероятно, будут выполняться быстрее, чем при выполнении исходного скалярного цикла. Модельcheapотключит векторизацию циклов, где это будет невыгодно, например, из-за необходимых проверок во время выполнения для зависимости данных или выравнивания, но в остальном она равна моделиdynamic. По умолчанию модель затрат зависит от других флагов оптимизации и равна либоdynamic, либоcheap. -
-fsimd-cost-model=model - Изменить модель затрат, используемую для векторизации циклов, помеченных директивой simd OpenMP или Cilk Plus. Аргумент model должен быть одним из
unlimited,dynamic,cheap. Все значения model имеют то же значение, что и описано в-fvect-cost-model, и по умолчанию используется модель затрат, определённая с помощью-fvect-cost-model. -ftree-vrp- Выполнить распространение диапазона значений на деревьях. Это похоже на этап распространения констант, но вместо значений распространяются диапазоны значений. Это позволяет оптимизаторам удалять ненужные проверки диапазонов, такие как проверки границ массивов и проверки на нулевой указатель. Этот параметр включен по умолчанию на уровне
-O2и выше. Удаление проверок на нулевой указатель выполняется только при включении-fdelete-null-pointer-checks. -ftracer- Выполнить дублирование хвоста для увеличения размера суперблока. Это преобразование упрощает поток управления функцией, что позволяет другим оптимизациям лучше справиться с задачей.
-funroll-loops- Разворачивать циклы, число итераций которых может быть определено во время компиляции или при входе в цикл.
-funroll-loopsподразумевает-frerun-cse-after-loop. Этот параметр увеличивает размер кода, и может, а может и не, ускорить его выполнение. -funroll-all-loops- Разворачивать все циклы, даже если их число итераций не определено при входе в цикл. Это, как правило, замедляет выполнение программ.
-fsplit-ivs-in-unroller- Включает выражение значений переменных индукции в последующих итерациях развёрнутого цикла с использованием значения в первой итерации. Это прерывает длинные цепочки зависимостей, улучшая эффективность этапов планирования.
Комбинация
-fwebи CSE часто достаточно для достижения того же эффекта. Однако это не надёжно в тех случаях, когда тело цикла сложнее одного базового блока. Это также вообще не работает на некоторых архитектурах из-за ограничений этапа CSE.Эта оптимизация включена по умолчанию.
-fvariable-expansion-in-unroller- С этим параметром компилятор создаёт несколько копий некоторых локальных переменных при разворачивании цикла, что может привести к более эффективному коду.
-fpartial-inlining- Встраивать части функций. Этот параметр оказывает влияние только при включении встраивания функций параметрами
-finline-functionsили-finline-small-functions.Включено на уровне
-O2. -fpredictive-commoning- Выполнить оптимизацию предсказательного общего вычисления, т.е. повторного использования вычислений (особенно загрузок и сохранений памяти), выполненных в предыдущих итерациях циклов.
Этот параметр включён на уровне
-O3. -fprefetch-loop-arrays- Если это поддерживается целевой машиной, генерировать инструкции для предварительной выборки памяти, чтобы улучшить производительность циклов, которые обращаются к большим массивам.
Этот параметр может сгенерировать лучший или худший код; результаты сильно зависят от структуры циклов в исходном коде.
Отключено на уровне
-Os. -
-fno-peephole-fno-peephole2 - Отключить любые оптимизации peephole, специфичные для машины. Разница между
-fno-peepholeи-fno-peephole2заключается в том, как они реализованы в компиляторе; некоторые целевые платформы используют одну, некоторые - другую, некоторые - обе.-fpeepholeвключено по умолчанию.-fpeephole2включено на уровнях-O2,-O3,-Os. -fno-guess-branch-probability- Не угадывать вероятности ветвлений с использованием эвристик.
GCC использует эвристики для угадывания вероятностей ветвлений, если они не предоставлены обратной связью профилирования (
-fprofile-arcs). Эти эвристики основаны на графе потока управления. Если некоторые вероятности ветвлений указаны с помощью ‘__builtin_expect’, то эвристики используются для угадывания вероятностей ветвлений для остальной части графа потока управления, учитывая информацию ‘__builtin_expect’. Взаимодействия между эвристиками и ‘__builtin_expect’ могут быть сложными, и в некоторых случаях может быть полезно отключить эвристики, чтобы эффекты ‘__builtin_expect’ были легче понятны.По умолчанию включено на уровнях
-O,-O2,-O3,-Os. -freorder-blocks- Переупорядочить базовые блоки в скомпилированной функции, чтобы уменьшить количество взятых ветвлений и улучшить локальность кода.
Включено на уровнях
-O2,-O3. -freorder-blocks-and-partition- Помимо переупорядочивания базовых блоков в скомпилированной функции для уменьшения количества взятых ветвлений, разделяет горячие и холодные базовые блоки на отдельные секции сборки и файлов .o, чтобы улучшить производительность кэширования и страничной замены.
Эта оптимизация автоматически отключается в присутствии обработки исключений, для секций linkonce, для функций с атрибутом пользовательской секции и на любой архитектуре, которая не поддерживает именованные секции.
Включено для x86 на уровнях
-O2,-O3. -freorder-functions
- Переупорядочить функции в объектном файле для улучшения локальности кода. Это реализовано с помощью специальных подсекций
.text.hotдля наиболее часто выполняемых функций и.text.unlikelyдля функций, которые выполняются редко. Переупорядочивание выполняется линковщиком, поэтому формат объектного файла должен поддерживать именованные секции, а линковщик должен размещать их разумным способом.Также необходима обратная связь по профилированию, чтобы эта опция была эффективной. Подробности см. в
-fprofile-arcs.Включено на уровнях
-O2,-O3,-Os. -fstrict-aliasing- Разрешить компилятору использовать самые строгие правила алиасирования, применимые к компилируемому языку. Для C (и C++) это активирует оптимизации, основанные на типе выражений. В частности, предполагается, что объект одного типа никогда не находится по одному адресу с объектом другого типа, если типы не почти одинаковы. Например,
unsigned intможет быть алиасом дляint, но не дляvoid*илиdouble. Тип символа может быть алиасом для любого другого типа.Обратите особое внимание на код такого типа:
union a_union { int i; double d; }; int f() { union a_union t; t.d = 3.0; return t.i; }Практика чтения из другого члена объединения, чем тот, в который последним записывали (называемая «aliasing типов») распространена. Даже с
-fstrict-aliasing, алиасинг типов разрешен, при условии, что к памяти обращаются через тип объединения. Таким образом, приведенный выше код работает как ожидается. См. Реализация структур, объединений, перечислений и битовых полей. Однако этот код может не работать:int f() { union a_union t; int* ip; t.d = 3.0; ip = &t.i; return *ip; }Аналогично, доступ с помощью взятия адреса, преобразования полученного указателя и разыменования результата имеет неопределенное поведение, даже если преобразование использует тип объединения, например:
int f() { double d = 3.0; return ((union a_union *) &d)->i; }Опция
-fstrict-aliasingвключена на уровнях-O2,-O3,-Os. -fstrict-overflow- Разрешить компилятору использовать строгие правила переполнения со знаком, в зависимости от компилируемого языка. Для C (и C++) это означает, что переполнение при арифметических операциях с целыми числами со знаком имеет неопределенное поведение, что означает, что компилятор может предположить, что это не происходит. Это позволяет различные оптимизации. Например, компилятор предполагает, что выражение
i + 10 > iвсегда истинно для целых чисел со знакомi. Это предположение верно только если переполнение со знаком имеет неопределенное поведение, так как выражение ложно, еслиi + 10переполняется при использовании арифметики со знаком с дополнением до 2. Когда эта опция активна, любая попытка определить, произойдет ли переполнение при операции с целыми числами со знаком, должна быть тщательно разработана, чтобы фактически не вызвать переполнение.Эта опция также позволяет компилятору использовать строгие семантики указателей: если добавление смещения к указателю на объект не приводит к указателю на тот же объект, то добавление имеет неопределенное поведение. Это позволяет компилятору заключить, что
p + u > pвсегда истинно для указателяpи беззнакового целогоu. Это предположение верно только потому, что переполнение указателя имеет неопределенное поведение, так как выражение ложно, еслиp + uпереполняется при использовании арифметики со знаком с дополнением до 2.См. также опцию
-fwrapv. Использование-fwrapvозначает, что переполнение целых чисел со знаком полностью определено: происходит переполнение. Когда используется-fwrapv, нет разницы между-fstrict-overflowи-fno-strict-overflowдля целых чисел. При использовании-fwrapvразрешены некоторые виды переполнения. Например, если компилятор получает переполнение при выполнении арифметических операций с константами, переполненное значение все еще может быть использовано с-fwrapv, но не иначе.Опция
-fstrict-overflowвключена на уровнях-O2,-O3,-Os. -
-falign-functions-falign-functions=n - Выровнять начало функций до ближайшей степени двойки, большей чем n, пропуская до n байтов. Например,
-falign-functions=32выравнивает функции до ближайшей 32-байтовой границы, но-falign-functions=24выравнивает до ближайшей 32-байтовой границы только если это можно сделать, пропустив 23 байта или меньше.-fno-align-functionsи-falign-functions=1эквивалентны и означают, что функции не выравниваются.Некоторые ассемблеры поддерживают этот флаг только когда n является степенью двойки; в этом случае он округляется вверх.
Если n не указан или равен нулю, используется машино-зависимое значение по умолчанию.
Включено на уровнях
-O2,-O3. -
-falign-labels-falign-labels=n - Выровнять все метки ветвлений до границы степени двойки, пропуская до n байтов, как в
-falign-functions. Эта опция может значительно замедлить код, поскольку она должна вставлять фиктивные операции на случай, если метка ветвления достигается в обычном потоке кода.-fno-align-labelsи-falign-labels=1эквивалентны и означают, что метки не выравниваются.Если значения
-falign-loopsили-falign-jumpsприменимы и больше этого значения, то используются их значения.Если n не указан или равен нулю, используется машино-зависимое значение по умолчанию, которое, скорее всего, будет ‘
1’, что означает отсутствие выравнивания.Включено на уровнях
-O2,-O3. -
-falign-loops-falign-loops=n - Выровнять циклы до границы степени двойки, пропуская до n байтов, как в
-falign-functions. Если циклы выполняются много раз, это компенсирует любые выполнения фиктивных операций.-fno-align-loopsи-falign-loops=1эквивалентны и означают, что циклы не выравниваются.Если n не указан или равен нулю, используется машино-зависимое значение по умолчанию.
Включено на уровнях
-O2,-O3. -
-falign-jumps-falign-jumps=n - Выровнять метки ветвления до границы степени двойки для меток ветвлений, которые могут достигаться только при переходе, пропуская до n байтов, как в
-falign-functions. В этом случае фиктивные операции выполнять не нужно.-fno-align-jumpsи-falign-jumps=1эквивалентны и означают, что циклы не выравниваются.Если n не указан или равен нулю, используется машино-зависимое значение по умолчанию.
Включено на уровнях
-O2,-O3. -funit-at-a-time- Эта опция сохранена по соображениям совместимости.
-funit-at-a-timeне оказывает никакого влияния, в то время как-fno-unit-at-a-timeподразумевает-fno-toplevel-reorderи-fno-section-anchors.Включено по умолчанию.
-fno-toplevel-reorder- Не переупорядочивать функции верхнего уровня, переменные и
asmоператоры. Выводить их в том же порядке, что и в входном файле. При использовании этой опции не удаляются неиспользуемые статические переменные. Эта опция предназначена для поддержки существующего кода, который полагается на определенный порядок. Для нового кода лучше использовать атрибуты, когда это возможно.Включено на уровне
-O0. При явном отключении также подразумевается-fno-section-anchors, которая в противном случае включена на-O0на некоторых целевых платформах. -fweb- Создает веб-страницы, как обычно используются для целей распределения регистров, и назначает каждому веб-странице отдельный псевдорегистр. Это позволяет проходить этап распределения регистров непосредственно по псевдорегистрам, а также усиливает несколько других этапов оптимизации, таких как CSE, оптимизатор циклов и удалитель тривиальных мертвых кодов. Однако это может сделать отладку невозможной, так как переменные больше не сохраняются в «домашнем регистре».
Включено по умолчанию с
-funroll-loops. -fwhole-program- Предположим, что текущая единица компиляции представляет собой весь компилируемый программный продукт. Все публичные функции и переменные, за исключением
mainи тех, которые объединены атрибутомexternally_visible, становятся статическими функциями и, следовательно, оптимизируются более агрессивно межпроцедурными оптимизаторами.Эта опция не должна использоваться в сочетании с
-flto. Вместо этого использование плагина линковщика должно предоставить более безопасную и точную информацию. -
-flto[=n]
- Этот параметр запускает стандартный оптимизатор на этапе компоновки. При вызове с исходным кодом он генерирует GIMPLE (одну из внутренних репрезентаций GCC) и записывает его в специальные ELF-секции в объектном файле. Когда объектные файлы объединяются, все тела функций считываются из этих ELF-секций и инстанцируются так, как будто они были частью одного трансляционного блока.
Для использования оптимизатора на этапе компоновки необходимо указать параметры
-fltoи оптимизации во время компиляции и финальной компоновки. Например:gcc -c -O2 -flto foo.c gcc -c -O2 -flto bar.c gcc -o myprog -flto -O2 foo.o bar.o
Первые два вызова GCC сохраняют представление байткода GIMPLE в специальные ELF-секции внутри
foo.oиbar.o. Окончательный вызов считывает байткод GIMPLE изfoo.oиbar.o, объединяет два файла в единый внутренний образ и компилирует результат как обычно. Поскольку обаfoo.oиbar.oобъединяются в один образ, это приводит к тому, что все межпроцедурные анализы и оптимизации в GCC работают с этими двумя файлами, как если бы они были одним. Это означает, например, что инлайнер может встраивать функции вbar.oв функции вfoo.oи наоборот.Другой (более простой) способ включить оптимизацию на этапе компоновки:
gcc -o myprog -flto -O2 foo.c bar.c
Выше указано, что генерирует байткод для
foo.cиbar.c, объединяет их в одно представление GIMPLE и оптимизирует их как обычно, чтобы получитьmyprog.Единственное важное, что нужно помнить, это то, что для включения оптимизации на этапе компоновки необходимо использовать драйвер GCC для выполнения шага компоновки. GCC автоматически выполняет оптимизацию на этапе компоновки, если какой-либо из участвующих объектов был скомпилирован с использованием
-flto. Как правило, вы должны указывать параметры оптимизации, которые должны использоваться для оптимизации на этапе компоновки, хотя GCC попытается угадать уровень оптимизации, используя параметры, использованные во время компиляции, если вы не укажете его на этапе компоновки. Вы всегда можете переопределить автоматическое решение по выполнению оптимизации на этапе компоновки, передав-fno-ltoкоманде компоновки.Для эффективной оптимизации всего программного обеспечения необходимо сделать определённые предположения о всей программе. Компилятор должен знать, к каким функциям и переменным могут получить доступ библиотеки и среда выполнения за пределами оптимизированной единицы на этапе компоновки. При поддержке компоновщиком, компоновщик-плагин (см.
-fuse-linker-plugin) передает компилятору информацию об используемых и внешне видимых символах. Если компоновщик-плагин недоступен,-fwhole-programдолжен использоваться, чтобы позволить компилятору сделать эти предположения, что приводит к более агрессивным решениям оптимизации.Когда
-fuse-linker-pluginне включено, когда файл компилируется с использованием-flto, сгенерированный объектный файл больше, чем обычный объектный файл, потому что он содержит байткоды GIMPLE и обычный конечный код (см.-ffat-lto-objects). Это означает, что объектные файлы с информацией LTO могут быть объединены как обычные объектные файлы; если-fno-ltoпередаётся компоновщику, никакие межпроцедурные оптимизации не применяются. Обратите внимание, что при включенном-fno-fat-lto-objectsэтап компиляции проходит быстрее, но вы не можете выполнить обычную, не-LTO компоновку над ними.Кроме того, флаги оптимизации, используемые для компиляции отдельных файлов, необязательно связаны с теми, которые используются на этапе компоновки. Например,
gcc -c -O0 -ffat-lto-objects -flto foo.c gcc -c -O0 -ffat-lto-objects -flto bar.c gcc -o myprog -O3 foo.o bar.o
Это генерирует отдельные объектные файлы с неоптимизированным кодом ассемблера, но результирующий двоичный файл
myprogоптимизируется на этапе-O3. Если же окончательный двоичный файл генерируется с использованием-fno-lto, тоmyprogне оптимизируется.При создании конечного двоичного файла GCC применяет оптимизацию на этапе компоновки только к тем файлам, которые содержат байткод. Поэтому вы можете смешивать объектные файлы и библиотеки с байткодами GIMPLE и окончательным кодом объекта. GCC автоматически выбирает, какие файлы оптимизировать в режиме LTO, и какие файлы объединять без дальнейшей обработки.
GCC сохраняет некоторые флаги генерации кода при генерации байткодов, так как они должны использоваться на этапе окончательной компоновки. Как правило, параметры, указанные на этапе компоновки, переопределяют параметры, указанные на этапе компиляции.
Если вы не укажете параметр уровня оптимизации
-Oна этапе компоновки, GCC вычислит его на основе уровней оптимизации, используемых при компиляции объектных файлов. Здесь победит наивысший уровень оптимизации.В настоящее время следующие параметры и их значения берутся из первого объектного файла, который их явно указал:
-fPIC,-fpic,-fpie,-fcommon,-fexceptions,-fnon-call-exceptions,-fgnu-tmи все-mфлаги для целевой платформы.Некоторые флаги, изменяющие ABI, необходимы для соответствия во всех блоках компиляции, и попытка переопределить их на этапе компоновки с конфликтующим значением игнорируется. Это включает в себя такие параметры, как
-freg-struct-returnи-fpcc-struct-return.Другие параметры, такие как
-ffp-contract,-fno-strict-overflow,-fwrapv,-fno-trapvили-fno-strict-aliasing, передаются на этап компоновки и объединяются консервативно для конфликтующих трансляционных блоков. В частности,-fno-strict-overflow,-fwrapvи-fno-trapvимеют приоритет, и, например,-ffp-contract=offимеет приоритет над-ffp-contract=fast. Вы можете переопределить их на этапе компоновки.Рекомендуется компилировать все файлы, участвующие в одной компоновке, с одними и теми же параметрами, а также указать эти параметры на этапе компоновки.
Если LTO обнаружит объекты с C-связыванием, объявленными с несовместимыми типами в отдельных трансляционных блоках, которые должны быть объединены (неопределённое поведение в соответствии с ISO C99 6.2.7), может быть выдано диагностическое сообщение, не относящееся к ошибке. Поведение по-прежнему неопределённо во время выполнения. Подобные диагностические сообщения могут быть подняты и для других языков.
Ещё одна особенность LTO заключается в том, что возможно применение межпроцедурных оптимизаций к файлам, написанным на разных языках:
gcc -c -flto foo.c g++ -c -flto bar.cc gfortran -c -flto baz.f90 g++ -o myprog -flto -O3 foo.o bar.o baz.o -lgfortran
Обратите внимание, что окончательная компоновка выполняется с использованием
g++для получения C++ библиотек времени выполнения и-lgfortranдобавляется для получения Fortran библиотек времени выполнения. В общем случае, при смешивании языков в режиме LTO, вы должны использовать те же параметры команд компоновки, что и при смешивании языков в обычной (не-LTO) компиляции.Если объектные файлы, содержащие байткод GIMPLE, хранятся в архиве библиотек, например
libfoo.a, их можно извлечь и использовать в LTO-компоновке, если вы используете компоновщик с поддержкой плагинов. Для создания статических библиотек, подходящих для LTO, используйтеgcc-arиgcc-ranlibвместоarиranlib; чтобы отобразить символы объектных файлов с байткодом GIMPLE, используйтеgcc-nm. Эти команды требуют, чтобыar,ranlibиnmбыли скомпилированы с поддержкой плагинов. На этапе компоновки используйте флаг-fuse-linker-plugin, чтобы убедиться, что библиотека участвует в процессе LTO-оптимизации:gcc -o myprog -O2 -flto -fuse-linker-plugin a.o b.o -lfoo
При включенном плагине компоновщика, компоновщик извлекает необходимые файлы GIMPLE из
libfoo.aи передаёт их запущенному GCC, чтобы сделать их частью агрегированного образа GIMPLE для оптимизации.Если вы не используете компоновщик с поддержкой плагинов и/или не включаете плагин компоновщика, то объекты внутри
libfoo.aизвлекаются и объединяются как обычно, но они не участвуют в процессе LTO-оптимизации. Чтобы сделать статическую библиотеку подходящей как для LTO-оптимизации, так и для обычной компоновки, скомпилируйте её объектные файлы с-flto-ffat-lto-objects.Оптимизация на этапе компоновки не требует наличия всей программы для работы. Если программа не требует экспорта никаких символов, можно объединить
-fltoи-fwhole-program, чтобы позволить межпроцедурным оптимизаторам использовать более агрессивные предположения, что может привести к улучшению возможностей оптимизации. Использование-fwhole-programне требуется, когда активен плагин компоновщика (см.-fuse-linker-plugin).Текущая реализация LTO не пытается генерировать байткод, который был бы переносимым между различными типами хостов. Файлы байткода имеют версионность, и есть строгая проверка версий, поэтому файлы байткода, сгенерированные в одной версии GCC, не будут работать с более старой или более новой версией GCC.
Оптимизация на этапе компоновки не работает хорошо с генерацией отладочной информации. Объединение
-fltoс-gв настоящее время является экспериментальным и, вероятно, приведёт к непредсказуемым результатам.Если вы укажете необязательный параметр n, оптимизация и генерация кода на этапе компоновки выполняются параллельно с использованием n параллельных задач при использовании установленной программы
make. Переменная средыMAKEможет быть использована для переопределения используемой программы. Значение по умолчанию для n равно 1.Вы также можете указать
-flto=jobserverдля использования режима сервера заданий GNU make для определения количества параллельных задач. Это полезно, когда Makefile, вызывающий GCC, уже выполняется параллельно. Вам необходимо добавить префикс ‘+’ к рецепту команды в родительском Makefile, чтобы это работало. Этот параметр, скорее всего, работает только еслиMAKEявляется GNU make. -
-flto-partition=alg - Указывает алгоритм разбиения, используемый оптимизатором на этапе компоновки. Значение равно либо
1to1для указания разбиения, отражающего исходные файлы, либоbalancedдля указания разбиения на одинаковые по размеру части (по возможности), либоmaxдля создания нового разбиения для каждого символа, где это возможно. Указаниеnoneкак алгоритма полностью отключает разбиение и потоковую передачу. Значение по умолчанию —balanced. Хотя1to1может использоваться как обходной путь для различных проблем с упорядочением кода, разбиениеmaxпредназначено только для внутренних тестов. -
-flto-compression-level=n - Этот параметр задаёт уровень сжатия, используемый для промежуточного языка, записанного в объектные файлы LTO, и имеет смысл только в сочетании с режимом LTO (
-flto). Допустимые значения — от 0 (без сжатия) до 9 (максимальное сжатие). Значения вне этого диапазона усекаются до 0 или 9. Если параметр не задан, используется значение сжатия по умолчанию. -flto-report- Выводит отчёт с внутренней информацией о работе оптимизатора на этапе компоновки. Содержимое этого отчёта может различаться в разных версиях. Он предназначен для использования разработчиками GCC при обработке объектных файлов в режиме LTO (через
-flto).Отключено по умолчанию.
-flto-report-wpa- Как
-flto-report, но выводит информацию только для фазы WPA оптимизации на этапе компоновки. -fuse-linker-plugin
- Включает использование плагина линковщика во время оптимизации на этапе линковки. Этот параметр полагается на поддержку плагинов в линковщике, которая доступна в gold или в GNU ld 2.21 или новее.
Этот параметр включает извлечение объектных файлов с байткодом GIMPLE из архивов библиотек. Это улучшает качество оптимизации, предоставляя оптимизатору на этапе линковки больше кода. Эта информация определяет, к каким символам можно получить внешний доступ (объектным файлами без LTO или во время динамической линковки). Результативное улучшение качества кода в бинарных файлах (и разделяемых библиотеках, использующих скрытую видимость) аналогично
-fwhole-program. Смотрите-fltoдля описания влияния этого флага и способов его использования.Этот параметр включён по умолчанию, когда поддержка LTO в GCC включена и GCC был сконфигурирован для использования с линковщиком, поддерживающим плагины (GNU ld 2.21 или новее или gold).
-ffat-lto-objects- Объектные файлы Fat LTO — это объектные файлы, содержащие как промежуточный язык, так и объектный код. Это делает их пригодными для линковки LTO и обычной линковки. Этот параметр эффективен только при компиляции с помощью
-fltoи игнорируется во время линковки.-fno-fat-lto-objectsулучшает время компиляции по сравнению с обычным LTO, но требует, чтобы вся цепочка инструментов понимала LTO. Это требует линковщика с поддержкой плагинов линковщика для базовой функциональности. Кроме того,nm,arиranlibдолжны поддерживать плагины линковщика, чтобы обеспечить полную функциональность среды сборки (способной собирать статические библиотеки и т. д.). GCC предоставляет оболочкиgcc-ar,gcc-nm,gcc-ranlibдля передачи правильных параметров этим инструментам. В случае с не-Fat LTO необходимо изменить makefile для их использования.По умолчанию значение —
-fno-fat-lto-objectsна целевых платформах с поддержкой плагинов линковщика. -fcompare-elim- После размещения регистров и разделения инструкций после размещения регистров определить арифметические инструкции, вычисляющие флаги процессора, аналогичные операциям сравнения, основанные на этой арифметике. Если возможно, устранить явную операцию сравнения.
Этот этап применим только к определённым целевым платформам, которые не могут явно представить операцию сравнения до завершения размещения регистров.
Включён на уровнях
-O,-O2,-O3,-Os. -fuse-ld=bfd- Использовать линковщик
bfdвместо стандартного линковщика. -fuse-ld=gold- Использовать линковщик
goldвместо стандартного линковщика. -fcprop-registers- После размещения регистров и разделения инструкций после размещения регистров выполнить проход копирования для попытки уменьшить зависимости планирования и иногда устранить копирование.
Включён на уровнях
-O,-O2,-O3,-Os. -fprofile-correction- Профили, собранные с помощью инструментированного бинарного файла для многопоточных программ, могут быть несогласованными из-за пропущенных обновлений счётчиков. При указании этого параметра GCC использует эвристические методы для исправления или сглаживания таких несоответствий. По умолчанию GCC выводит сообщение об ошибке при обнаружении несогласованного профиля.
-
-fprofile-dir=path - Установить каталог для поиска файлов данных профиля в path. Этот параметр влияет только на данные профиля, сгенерированные
-fprofile-generate,-ftest-coverage,-fprofile-arcsи используемые-fprofile-useи-fbranch-probabilitiesи их связанными параметрами. Можно использовать как абсолютные, так и относительные пути. По умолчанию GCC использует текущий каталог как path, поэтому файл данных профиля появляется в том же каталоге, что и объектный файл. -
-fprofile-generate-fprofile-generate=path - Включить параметры, обычно используемые для инструментирования приложения для создания профиля, полезного для последующей перекомпиляции с оптимизацией, основанной на обратной связи профиля. Вы должны использовать
-fprofile-generateкак при компиляции, так и при линковке вашей программы.Включаются следующие параметры:
-fprofile-arcs,-fprofile-values,-fvpt.Если path указан, GCC ищет файлы данных обратной связи профиля в path. См.
-fprofile-dir. -
-fprofile-use-fprofile-use=path - Включить оптимизации, направленные на обратную связь профиля, и оптимизации, обычно выгодные только с доступной обратной связью профиля.
Включаются следующие параметры:
-fbranch-probabilities,-fvpt,-funroll-loops,-fpeel-loops,-ftracer,-ftree-vectorize,ftree-loop-distribute-patternsПо умолчанию GCC выводит сообщение об ошибке, если профили обратной связи не соответствуют исходному коду. Эту ошибку можно преобразовать в предупреждение с помощью
-Wcoverage-mismatch. Обратите внимание, что это может привести к плохо оптимизированному коду.Если path указан, GCC ищет файлы данных обратной связи профиля в path. См.
-fprofile-dir.
Следующие параметры контролируют поведение компилятора по отношению к арифметике с плавающей точкой. Эти параметры компромисс между скоростью и корректностью. Все они должны быть включены явно.
-ffloat-store- Не хранить переменные с плавающей точкой в регистрах и запретить другие параметры, которые могут изменить, берется ли значение с плавающей точкой из регистра или памяти.
Этот параметр предотвращает нежелательное избыточное представление точности на машинах, таких как 68000, где плавающие регистры (68881) сохраняют большую точность, чем предполагается для
double. Аналогично для архитектуры x86. Для большинства программ избыточная точность приносит только пользу, но некоторые программы полагаются на точное определение IEEE чисел с плавающей точкой. Используйте-ffloat-storeдля таких программ после модификации, чтобы хранить все промежуточные вычисления в переменных. -
-fexcess-precision=style - Этот параметр позволяет дополнительно управлять избыточной точностью на машинах, где регистры чисел с плавающей точкой имеют большую точность, чем типы IEEE
floatиdouble, а процессор не поддерживает операции округления до этих типов. По умолчанию-fexcess-precision=fastвключен; это означает, что операции выполняются с точностью регистров, и непонятно, когда происходит округление до типов, указанных в исходном коде. При компиляции C, если указан-fexcess-precision=standard, то избыточная точность следует правилам, указанным в ISO C99; в частности, как приведения типов, так и присваивания вызывают округление значений до их семантических типов (в то время как-ffloat-storeвлияет только на присваивания). Этот параметр включён по умолчанию для C, если используется параметр строгого соответствия, такой как-std=c99.-fexcess-precision=standardне реализован для языков, кроме C, и не имеет эффекта, если указаны-funsafe-math-optimizationsили-ffast-math. На x86 он также не имеет эффекта, если указаны-mfpmath=sseили-mfpmath=sse+387; в первом случае применяются семантика IEEE без избыточной точности, а во втором округление непредсказуемо. -ffast-math- Устанавливает
-fno-math-errno,-funsafe-math-optimizations,-ffinite-math-only,-fno-rounding-math,-fno-signaling-nansи-fcx-limited-range.Этот параметр определяет макрос препроцессора
__FAST_MATH__.Этот параметр не включается ни одним параметром
-O, кроме-Ofast, так как это может привести к неверному результату для программ, зависящих от точного выполнения правил/спецификаций IEEE или ISO для математических функций. Однако это может привести к более быстрому коду для программ, которые не требуют гарантий этих спецификаций. -fno-math-errno- Не устанавливать
errnoпосле вызова математических функций, которые выполняются с одной инструкцией, например,sqrt. Программа, которая полагается на IEEE исключения для обработки ошибок математических функций, может использовать этот флаг для скорости, сохраняя совместимость с арифметикой IEEE.Этот параметр не включается ни одним параметром
-O, так как это может привести к неверному результату для программ, зависящих от точного выполнения правил/спецификаций IEEE или ISO для математических функций. Однако это может привести к более быстрому коду для программ, которые не требуют гарантий этих спецификаций.По умолчанию
-fmath-errno.В системах Darwin библиотека math никогда не устанавливает
errno. Поэтому нет причин для компилятора учитывать возможность этого, и-fno-math-errnoявляется значением по умолчанию. -funsafe-math-optimizations- Разрешить оптимизации для арифметики с плавающей точкой, которые (а) предполагают, что аргументы и результаты действительны и (б) могут нарушать стандарты IEEE или ANSI. При использовании во время линковки могут быть включены библиотеки или файлы запуска, которые изменяют слово управления FPU или другие подобные оптимизации.
Этот параметр не включается ни одним параметром
-O, так как это может привести к неверному результату для программ, зависящих от точного выполнения правил/спецификаций IEEE или ISO для математических функций. Однако это может привести к более быстрому коду для программ, которые не требуют гарантий этих спецификаций. Включает-fno-signed-zeros,-fno-trapping-math,-fassociative-mathи-freciprocal-math.По умолчанию
-fno-unsafe-math-optimizations. -fassociative-math- Разрешить повторную ассоциацию операндов в сериях операций с плавающей точкой. Это нарушает стандарт языка ISO C и C++, возможно, изменяя результат вычисления. ПРИМЕЧАНИЕ: переупорядочение может изменить знак нуля, а также игнорировать NaN и подавить или создать подпоток или переполнение (и поэтому не может использоваться в коде, который полагается на поведение округления, как
(x + 2**52) - 2**52). Также может переупорядочить сравнения с плавающей точкой, и, следовательно, не может использоваться, когда требуются упорядоченные сравнения. Этот параметр требует, чтобы оба-fno-signed-zerosи-fno-trapping-mathбыли активны. Более того, это не имеет большого смысла с-frounding-math. Для Fortran параметр автоматически включается, когда оба-fno-signed-zerosи-fno-trapping-mathвключены.По умолчанию
-fno-associative-math. -freciprocal-math- Разрешить использование обратной величины значения вместо деления на значение, если это позволяет оптимизации. Например,
x / yможет быть заменено наx * (1/y), что полезно, если(1/y)подвергается устранению общих подвыражений. Обратите внимание, что это приводит к потере точности и увеличению числа операций с плавающей точкой, выполняемых над значением.По умолчанию
-fno-reciprocal-math. -ffinite-math-only- Разрешить оптимизации для арифметики с плавающей точкой, предполагающие, что аргументы и результаты не являются NaN или +-Inf.
Этот параметр не включается ни одним параметром
-O, так как это может привести к неверному результату для программ, зависящих от точного выполнения правил/спецификаций IEEE или ISO для математических функций. Однако это может привести к более быстрому коду для программ, которые не требуют гарантий этих спецификаций.По умолчанию
-fno-finite-math-only. -fno-signed-zeros- Разрешить оптимизации для арифметики с плавающей точкой, игнорирующие знак нуля. Арифметика IEEE определяет поведение различных значений +0.0 и −0.0, что запрещает упрощение выражений, таких как x+0.0 или 0.0*x (даже с
-ffinite-math-only). Этот параметр подразумевает, что знак результата нуля не имеет значения.По умолчанию
-fsigned-zeros. -fno-trapping-math- Компилировать код, предполагая, что операции с плавающей точкой не могут генерировать видимые пользователю ловушки. Эти ловушки включают деление на ноль, переполнение, подпоток, неточное значение и недопустимую операцию. Этот параметр требует, чтобы
-fno-signaling-nansбыл активен. Установка этого параметра может позволить получить более быстрый код, если, например, используется «бесперебойная» арифметика IEEE.Этот параметр никогда не должен включаться ни одним параметром
-O, так как это может привести к неверному результату для программ, зависящих от точного выполнения правил/спецификаций IEEE или ISO для математических функций.По умолчанию
-ftrapping-math. -frounding-math- Отключить преобразования и оптимизации, предполагающие стандартное поведение округления чисел с плавающей точкой. Это округление к нулю для всех преобразований чисел с плавающей точкой в целые числа и округление к ближайшему для всех других арифметических усечений. Этот параметр должен быть указан для программ, которые динамически изменяют режим округления FP или которые могут выполняться с режимом округления, отличным от стандартного. Этот параметр отключает сворачивание констант выражений с плавающей точкой во время компиляции (на которое может влиять режим округления) и арифметические преобразования, небезопасные при наличии режимов округления, зависящих от знака.
По умолчанию
-fno-rounding-math.Этот параметр является экспериментальным и в настоящее время не гарантирует отключение всех оптимизаций GCC, которые зависят от режима округления. Будущие версии GCC могут обеспечить более тонкий контроль над этим параметром с помощью директивы C99
FENV_ACCESS. Этот параметр командной строки будет использоваться для задания состояния по умолчанию дляFENV_ACCESS. -fsignaling-nans- Компилировать код с предположением, что сигнальные NaN IEEE могут генерировать видимые пользователю ловушки во время операций с плавающей точкой. Установка этого параметра отключает оптимизации, которые могут изменить количество исключений, видимых с помощью сигнальных NaN. Этот параметр подразумевает
-ftrapping-math.Этот параметр определяет препроцессорный макрос
__SUPPORT_SNAN__.По умолчанию
-fno-signaling-nans.Этот параметр является экспериментальным и в настоящее время не гарантирует отключение всех оптимизаций GCC, влияющих на поведение сигнальных NaN.
-fsingle-precision-constant- Обрабатывать константы с плавающей точкой как одинарной точности вместо неявного преобразования их в константы двойной точности.
-fcx-limited-range- При включении этот параметр указывает, что шаг сокращения диапазона не нужен при выполнении комплексного деления. Кроме того, нет проверки, является ли результат комплексного умножения или деления
NaN + I*NaN, с попыткой исправить ситуацию в этом случае. По умолчанию-fno-cx-limited-range, но включается с помощью-ffast-math.Этот параметр управляет значением по умолчанию директивы ISO C99
CX_LIMITED_RANGE. Тем не менее, этот параметр применяется ко всем языкам. -fcx-fortran-rules- Комплексное умножение и деление следуют правилам Fortran. Сокращение диапазона выполняется как часть комплексного деления, но нет проверки, является ли результат комплексного умножения или деления
NaN + I*NaN, с попыткой исправить ситуацию в этом случае.По умолчанию
-fno-cx-fortran-rules.
Следующие параметры управляют оптимизациями, которые могут улучшить производительность, но не включаются ни одним из параметров -O. Этот раздел включает экспериментальные параметры, которые могут создавать неработоспособный код.
-fbranch-probabilities- После выполнения программы, скомпилированной с помощью
-fprofile-arcs(см. Параметры для отладки вашей программы илиgcc), вы можете скомпилировать её во второй раз, используя-fbranch-probabilities, чтобы улучшить оптимизации на основе количества проходов по каждой ветви. Когда программа, скомпилированная с помощью-fprofile-arcs, завершается, она сохраняет счётчики выполнения дуг в файл под названием sourcename.gcda для каждого исходного файла. Информация в этом файле сильно зависит от структуры сгенерированного кода, поэтому вы должны использовать тот же исходный код и те же параметры оптимизации для обеих компиляций.С помощью
-fbranch-probabilities, GCC добавляет заметку ‘REG_BR_PROB’ к каждой ‘JUMP_INSN’ и ‘CALL_INSN’. Эти заметки могут быть использованы для улучшения оптимизации. В настоящее время они используются только в одном месте: вreorg.c, вместо того, чтобы угадывать, по какой ветви вероятнее всего пойдёт ветвление, значения ‘REG_BR_PROB’ используются для точного определения, по какой ветви проходит больше проходов. -fprofile-values- Если используется совместно с
-fprofile-arcs, добавляет код для сбора данных о значениях выражений в программе.С помощью
-fbranch-probabilities, данные, собранные профилированием значений выражений, считываются для использования в оптимизациях.Включается с помощью
-fprofile-generateи-fprofile-use. -fprofile-reorder-functions- Переупорядочивание функций на основе профилирования инструментов отслеживания собирает первое время выполнения функции и упорядочивает эти функции в порядке возрастания.
Включается с помощью
-fprofile-use. -fvpt- Если используется совместно с
-fprofile-arcs, этот параметр указывает компилятору добавить код для сбора информации о значениях выражений.С помощью
-fbranch-probabilities, собранные данные считываются и на их основе выполняются оптимизации. В настоящее время оптимизации включают специализацию операций деления с использованием знаний о значении знаменателя. -frename-registers- Попытка избежать ложных зависимостей в запланированном коде путём использования регистров, оставшихся после распределения регистров. Эта оптимизация наиболее полезна для процессоров с большим количеством регистров. Однако, в зависимости от формата отладочной информации, принятой целевым процессором, это может сделать отладку невозможной, так как переменные больше не остаются в «домашнем регистре».
Включается по умолчанию с помощью
-funroll-loopsи-fpeel-loops. -ftracer- Выполнить дублирование хвоста для увеличения размера суперблока. Эта трансформация упрощает поток управления функцией, позволяя другим оптимизациям лучше справиться с задачей.
Включается с помощью
-fprofile-use. -funroll-loops- Развернуть циклы, число итераций которых может быть определено во время компиляции или при входе в цикл.
-funroll-loopsподразумевает-frerun-cse-after-loop,-fwebи-frename-registers. Также включает полное удаление циклов (т.е. полное удаление циклов с небольшим постоянным числом итераций). Этот параметр увеличивает размер кода, и может или не может ускорить его выполнение.Включается с помощью
-fprofile-use. -funroll-all-loops- Развернуть все циклы, даже если их число итераций не определено при входе в цикл. Обычно это замедляет выполнение программ.
-funroll-all-loopsподразумевает те же параметры, что и-funroll-loops. -fpeel-loops- Выполняет удаление циклов для тех циклов, о которых есть достаточно информации, что они не сильно закручиваются (из обратной связи профиля). Также включает полное удаление циклов (т.е. полное удаление циклов с небольшим постоянным числом итераций).
Включается с помощью
-fprofile-use. -fmove-loop-invariants- Включает проход перемещения инвариантов цикла в оптимизаторе циклов RTL. Включается на уровне
-O1 -funswitch-loops- Перемещает ветвления с условиями, инвариантными для цикла, из цикла, с дубликатами цикла на обеих ветвях (изменёнными в соответствии с результатом условия).
-
-ffunction-sections-fdata-sections - Размещает каждую функцию или элемент данных в свой раздел в выходном файле, если целевой формат поддерживает произвольные разделы. Имя функции или имя элемента данных определяет имя раздела в выходном файле.
Используйте эти параметры на системах, где компоновщик может выполнить оптимизации для улучшения близости данных в адресном пространстве. Большинство систем, использующих формат ELF и процессоры SPARC, работающие под Solaris 2, имеют компоновщики с такими оптимизациями. В будущем эти оптимизации могут появиться и в AIX.
Используйте эти параметры только в случае существенной выгоды. При указании этих параметров ассемблер и компоновщик создают более крупные файлы объектов и исполняемых файлов и работают медленнее. Вы не можете использовать
gprofна всех системах, если вы указали этот параметр, и у вас могут возникнуть проблемы с отладкой, если вы указали оба этих параметра и-g. -fbranch-target-load-optimize- Выполнить оптимизацию загрузки регистра целевого адреса ветвления перед обработкой пролога/эпилога. Использование целевых регистров, как правило, становится доступным только во время перезагрузки, поэтому для подъёма загрузок из циклов и межблочной планировки требуется отдельный этап оптимизации.
-fbranch-target-load-optimize2- Выполнить оптимизацию загрузки регистра целевого адреса ветвления после обработки пролога/эпилога.
-fbtr-bb-exclusive- При выполнении оптимизации загрузки регистра целевого адреса ветвления не повторно использовать регистры целевого адреса ветвления в любом базовом блоке.
-fstack-protector- Вывести дополнительный код для проверки переполнения буфера, например, атак через переполнение стека. Это делается путем добавления защитной переменной к функциям с уязвимыми объектами. Это включает функции, которые вызывают
alloca, и функции с буферами больше 8 байт. Защитные переменные инициализируются при входе в функцию и затем проверяются при выходе из функции. Если проверка защиты завершается неудачно, выводится сообщение об ошибке и программа завершается. -fstack-protector-all- Подобно
-fstack-protector, за исключением того, что все функции защищены. -fstack-protector-strong- Подобно
-fstack-protector, но включает дополнительные защищаемые функции — те, которые имеют локальные определения массивов или ссылки на локальные адреса фрейма. -fsection-anchors- Попытаться уменьшить количество вычислений символических адресов, используя общие «якорные» символы для адресации близлежащих объектов. Эта трансформация может помочь уменьшить количество записей и обращений к GOT на некоторых целевых системах.
Например, реализация следующей функции
foo:static int a, b, c; int foo (void) { return a + b + c; }обычно вычисляет адреса всех трёх переменных, но если вы скомпилируете её с помощью
-fsection-anchors, она обращается к переменным из одной общей точки якорной ссылки вместо этого. Эффект похож на следующий псевдокод (который не является корректным C):int foo (void) { register int *xr = &x; return xr[&a - &x] + xr[&b - &x] + xr[&c - &x]; }Не все целевые системы поддерживают этот параметр.
-
--paramname=value - В некоторых местах GCC использует различные константы для управления объёмом выполняемых оптимизаций. Например, GCC не выполняет встраивание функций, содержащих более определённого количества инструкций. Вы можете управлять некоторыми из этих констант в командной строке, используя параметр
--param.Имена конкретных параметров и смысл значений связаны с внутренним устройством компилятора и могут быть изменены без предварительного уведомления в будущих выпусках.
В каждом случае value является целым числом. Допустимые значения для name:
predictable-branch-outcome- Когда ветвь прогнозируется как взятая с вероятностью ниже этого порога (в процентах), она считается хорошо предсказуемой. По умолчанию значение 10.
max-crossjump-edges- Максимальное количество входящих рёбер, которые следует учитывать для перехода по пересечению. Алгоритм, используемый
-fcrossjumping, имеет сложность O(N^2) относительно числа рёбер, входящих в каждый блок. Увеличение значений означает более агрессивную оптимизацию, что приводит к увеличению времени компиляции, но, вероятно, с небольшим улучшением размера исполняемого файла. min-crossjump-insns- Минимальное количество инструкций, которые должны совпадать в конце двух блоков перед выполнением перехода по пересечению. Это значение игнорируется в случае, если все инструкции в блоке, из которого выполняется переход по пересечению, совпадают. Значение по умолчанию 5.
max-grow-copy-bb-insns- Максимальный коэффициент увеличения размера кода при копировании базовых блоков вместо перехода. Увеличение относительно инструкции перехода. Значение по умолчанию 8.
max-goto-duplication-insns- Максимальное количество инструкций для дублирования в блок, который переходит к вычисленному переходу goto. Для избежания поведения O(N^2) в ряде проходов, GCC раннее факторизует вычисленные goto в процессе компиляции и разфакторизует их как можно позже. Лишь вычисленные переходы в конце базового блока с не более чем max-goto-duplication-insns инструкций разфакторизуются. Значение по умолчанию 8.
max-delay-slot-insn-search- Максимальное количество инструкций, которые следует учитывать при поиске инструкции для заполнения слота отсрочки. Если ищется более чем это произвольное количество инструкций, экономия времени от заполнения слота отсрочки минимальна, поэтому поиск прекращается. Увеличение значений означает более агрессивную оптимизацию, что приводит к увеличению времени компиляции, но, вероятно, с небольшим улучшением времени выполнения.
max-delay-slot-live-search- При попытке заполнить слоты отсрочки максимальное количество инструкций, которые следует учитывать при поиске блока с действительной информацией о регистре. Увеличение этого произвольно выбранного значения означает более агрессивную оптимизацию, увеличивая время компиляции. Этот параметр следует удалить при переписывании кода слота отсрочки для поддержания графа потока управления.
max-gcse-memory- Приблизительный максимальный объём памяти, который можно выделить для выполнения оптимизации глобального удаления общих подвыражений. Если требуется больше памяти, чем указано, оптимизация не выполняется.
max-gcse-insertion-ratio- Если отношение вставки выражений к удалениям превышает это значение для любого выражения, то RTL PRE вставляет или удаляет выражение и, таким образом, оставляет частично избыточные вычисления в потоке инструкций. Значение по умолчанию 20.
max-pending-list-length- Максимальное количество ожидающих зависимостей, которое планирование допускает перед сбросом текущего состояния и началом заново. Большие функции с небольшим количеством ветвлений или вызовов могут создавать чрезмерно большие списки, которые излишне потребляют память и ресурсы.
max-modulo-backtrack-attempts- Максимальное количество попыток отката, которые планировщик должен предпринять при модульном планировании цикла. Большие значения могут экспоненциально увеличить время компиляции.
max-inline-insns-single- Несколько параметров контролируют инлайнер дерева, используемый в GCC. Это число устанавливает максимальное количество инструкций (подсчитанных в внутренней представлении GCC) в одной функции, которую инлайнер дерева рассматривает для инлайнинга. Это касается только функций, объявленных inline, и методов, реализованных в объявлении класса (C++). Значение по умолчанию 400.
max-inline-insns-auto- Когда вы используете
-finline-functions(включён в-O3), много функций, которые в противном случае не рассматривались бы компилятором для инлайнинга, исследуются. Для этих функций может быть применено другое (более ограниченное) ограничение по сравнению с функциями, объявленными inline. Значение по умолчанию 40. inline-min-speedup- Когда оценочное улучшение производительности времени выполнения вызывающей + вызываемой функции превышает этот порог (в процентах), функция может быть инлайнирована независимо от ограничений на
--param max-inline-insns-singleи--param max-inline-insns-auto. large-function-insns- Ограничение, определяющее действительно большие функции. Для функций, больше этих ограничений после инлайнинга, инлайнинг ограничен параметром
--param large-function-growth. Этот параметр полезен в первую очередь для предотвращения чрезмерного времени компиляции, вызванного нелинейными алгоритмами, используемыми бэкэндом. Значение по умолчанию 2700. large-function-growth- Указывает максимальный рост большой функции, вызванный инлайнингом, в процентах. Значение по умолчанию 100, что ограничивает рост большой функции до 2,0 раз от исходного размера.
large-unit-insns- Ограничение, определяющее большой трансляционный блок. Рост, вызванный инлайнингом блоков, больших, чем это ограничение, ограничен параметром
--param inline-unit-growth. Для небольших блоков это может быть слишком жёстко. Например, рассмотрите блок, состоящий из функции A, которая имеет inline, и B, которая просто трижды вызывает A. Если B мала по отношению к A, рост блока составляет 300%, и тем не менее такой инлайнинг очень разумный. Однако для очень больших блоков, состоящих из небольших инлайнируемых функций, необходимо ограничение общего роста блока, чтобы избежать экспоненциального взрыва размера кода. Таким образом, для меньших блоков размер увеличивается до--param large-unit-insnsперед применением--param inline-unit-growth. Значение по умолчанию 10000. inline-unit-growth- Указывает максимальный общий рост трансляционного блока, вызванный инлайнингом. Значение по умолчанию 30, что ограничивает рост блока до 1,3 раз от исходного размера.
ipcp-unit-growth- Указывает максимальный общий рост трансляционного блока, вызванный межпроцедурной константной передачей. Значение по умолчанию 10, что ограничивает рост блока до 1,1 раза от исходного размера.
large-stack-frame- Ограничение, определяющее большие стековые фреймы. При инлайнинге алгоритм пытается не выходить за это ограничение. Значение по умолчанию 256 байт.
large-stack-frame-growth- Указывает максимальный рост больших стековых фреймов, вызванный инлайнингом, в процентах. Значение по умолчанию 1000, что ограничивает рост больших стековых фреймов до 11 раз от исходного размера.
-
max-inline-insns-recursivemax-inline-insns-recursive-auto - Указывает максимальное количество инструкций, до которых может вырасти внестрочная копия рекурсивной inline-функции при рекурсивном инлайнинге.
Для функций, объявленных inline, учитывается
--param max-inline-insns-recursive. Для функций, не объявленных inline, рекурсивный инлайнинг происходит только при включенном-finline-functions(включенном в-O3) и использовании--param max-inline-insns-recursive-auto. Значение по умолчанию 450. -
max-inline-recursive-depthmax-inline-recursive-depth-auto - Указывает максимальную глубину рекурсии, используемую для рекурсивного инлайнинга.
Для функций, объявленных inline, учитывается
--param max-inline-recursive-depth. Для функций, не объявленных inline, рекурсивный инлайнинг происходит только при включенном-finline-functions(включенном в-O3) и использовании--param max-inline-recursive-depth-auto. Значение по умолчанию 8. min-inline-recursive-probability- Рекурсивный инлайнинг выгоден только для функций с глубокой рекурсией в среднем и может навредить для функций с небольшой глубиной рекурсии, увеличивая размер пролога или сложность тела функции для других оптимизаторов.
При наличии обратной связи профиля (см.
-fprofile-generate) фактическая глубина рекурсии может быть оценена по вероятности того, что функция рекурсивно вызывается через данное выражение вызова. Этот параметр ограничивает инлайнинг только выражениями вызова, вероятность которых превышает заданный порог (в процентах). Значение по умолчанию 10. early-inlining-insns- Указывает рост, который может сделать ранний инлайнер. По сути, он увеличивает объём инлайнинга для кода с большой стоимостью абстракции. Значение по умолчанию 10.
-
max-early-inliner-iterationsmax-early-inliner-iterations - Ограничение итераций раннего инлайнера. Это в основном ограничивает количество вложенных косвенных вызовов, которые ранний инлайнер может разрешить. Более глубокие цепочки всё же обрабатываются поздним инлайнингом.
-
comdat-sharing-probabilitycomdat-sharing-probability - Вероятность (в процентах) того, что функция C++ inline с видимостью comdat будет использоваться совместно несколькими блоками компиляции. Значение по умолчанию 20.
min-vect-loop-bound- Минимальное количество итераций, при которых циклы не векторизуются при использовании
-ftree-vectorize. Количество итераций после векторизации должно быть больше указанного значения, чтобы разрешить векторизацию. Значение по умолчанию 0. gcse-cost-distance-ratio- Коэффициент масштабирования при расчете максимального расстояния, на которое выражение может быть перемещено оптимизациями GCSE. В настоящее время это поддерживается только в проходе подъёма кода. Чем больше коэффициент, тем более агрессивный подъём кода с простыми выражениями, т.е. выражениями, которые имеют стоимость меньше, чем
gcse-unrestricted-cost. Указание 0 отключает подъём простых выражений. Значение по умолчанию 10. gcse-unrestricted-cost- Стоимость, приблизительно измеряемая как стоимость одной типичной машинной инструкции, при которой оптимизации GCSE не ограничивают расстояние, на которое может перемещаться выражение. В настоящее время это поддерживается только в проходе подъёма кода. Чем меньше стоимость, тем более агрессивный подъём кода. Указание 0 позволяет всем выражениям перемещаться на неограниченные расстояния. Значение по умолчанию 3.
max-hoist-depth- Глубина поиска в дереве доминантов для подъёма выражений. Это используется для предотвращения квадратичного поведения в алгоритме подъёма. Значение 0 не ограничивает поиск, но может замедлить компиляцию больших функций. Значение по умолчанию 30.
max-tail-merge-comparisons- Максимальное количество подобных блоков (bbs), с которыми сравнивается bb. Это используется для предотвращения квадратичного поведения в слиянии хвостовых частей дерева. Значение по умолчанию 10.
max-tail-merge-iterations- Максимальное количество итераций прохода по функции. Это используется для ограничения времени компиляции при слиянии хвостовых частей дерева. Значение по умолчанию 2.
max-unrolled-insns- Максимальное количество инструкций, которые может иметь цикл для его развёртывания. Если цикл развернут, этот параметр также определяет, сколько раз код цикла развернётся.
max-average-unrolled-insns- Максимальное количество инструкций, взвешенных вероятностью их выполнения, которые может иметь цикл для его развёртывания. Если цикл развернут, этот параметр также определяет, сколько раз код цикла развернётся.
max-unroll-times- Максимальное количество развёртываний одного цикла.
max-peeled-insns- Максимальное количество инструкций, которые может иметь цикл для его отрезания. Если цикл обрезан, этот параметр также определяет, сколько раз код цикла обрезан.
max-peel-times- Максимальное количество отрезаний одного цикла.
max-peel-branches- Максимальное количество ветвей на горячей трассе через обрезанную последовательность.
max-completely-peeled-insns- Максимальное количество инструкций полностью обрезанного цикла.
max-completely-peel-times- Максимальное количество итераций цикла, которое подходит для полного отрезания.
max-completely-peel-loop-nest-depth
- Максимальная глубина вложенности циклов, подходящая для полного вырезания.
max-unswitch-insns- Максимальное количество инструкций в непереключенном цикле.
max-unswitch-level- Максимальное количество ветвлений, непереключенных в одном цикле.
lim-expensive- Минимальная стоимость дорогостоящего выражения в оптимизации перемещения инвариантных выражений в цикле.
iv-consider-all-candidates-bound- Ограничение на количество кандидатов для индуктивных переменных, ниже которого все кандидаты рассматриваются для каждого использования в оптимизациях индуктивных переменных. Если кандидатов больше, чем это значение, рассматриваются только самые релевантные, чтобы избежать квадратичной временной сложности.
iv-max-considered-uses- Оптимизации индуктивных переменных отказываются от циклов, содержащих больше использований индуктивных переменных.
iv-always-prune-cand-set-bound- Если количество кандидатов в наборе меньше этого значения, всегда пытайтесь удалить ненужные индуктивные переменные из набора при добавлении нового.
scev-max-expr-size- Ограничение на размер выражений, используемых в анализаторе скалярных эволюций. Большие выражения замедляют анализатор.
scev-max-expr-complexity- Ограничение на сложность выражений в анализаторе скалярных эволюций. Сложные выражения замедляют анализатор.
omega-max-vars- Максимальное количество переменных в системе ограничений Омега. Значение по умолчанию — 128.
omega-max-geqs- Максимальное количество неравенств в системе ограничений Омега. Значение по умолчанию — 256.
omega-max-eqs- Максимальное количество равенств в системе ограничений Омега. Значение по умолчанию — 128.
omega-max-wild-cards- Максимальное количество символьных переменных, которые может вставить решатель Омега. Значение по умолчанию — 18.
omega-hash-table-size- Размер хеш-таблицы в решателе Омега. Значение по умолчанию — 550.
omega-max-keys- Максимальное количество ключей, используемых решателем Омега. Значение по умолчанию — 500.
omega-eliminate-redundant-constraints- При значении 1 используются дорогостоящие методы для устранения всех избыточных ограничений. Значение по умолчанию — 0.
vect-max-version-for-alignment-checks- Максимальное количество проверок во время выполнения, которые могут быть выполнены при создании версий циклов для выравнивания в векторизаторе.
vect-max-version-for-alias-checks- Максимальное количество проверок во время выполнения, которые могут быть выполнены при создании версий циклов для алиасов в векторизаторе.
vect-max-peeling-for-alignment- Максимальное количество циклов вырезания для улучшения выравнивания доступа для векторизатора. Значение -1 означает «нет ограничения».
max-iterations-to-track- Максимальное количество итераций цикла, которое алгоритм грубой силы для анализа количества итераций цикла пытается оценить.
hot-bb-count-ws-permille- Количество профилей базового блока считается горячим, если оно вносит вклад в заданный процент (т. е. 0...1000) от всего профилированного выполнения.
hot-bb-frequency-fraction- Выберите долю частоты входа в блок выполнения базового блока в функции, при которой базовый блок должен быть горячим.
max-predicted-iterations- Максимальное количество итераций цикла, которые мы предсказываем статически. Это полезно в случаях, когда функция содержит один цикл с известной границей и другой цикл с неизвестной границей. Известное количество итераций предсказывается правильно, а неизвестное количество итераций в среднем составляет примерно 10. Это означает, что цикл без границ искусственно кажется холодным по отношению к другому.
builtin-expect-probability- Управление вероятностью того, что выражение имеет заданное значение. Этот параметр принимает процент (т. е. 0...100) в качестве входных данных. Вероятность по умолчанию 90 получена эмпирически.
align-threshold- Выберите долю максимальной частоты выполнения базового блока в функции для выравнивания базового блока.
align-loop-iterations- Цикл, ожидаемый для итерации как минимум по выбранному количеству итераций, выравнивается.
-
tracer-dynamic-coveragetracer-dynamic-coverage-feedback - Это значение используется для ограничения формирования суперблоков после того, как будет покрыто заданный процент выполненных инструкций. Это ограничивает ненужное увеличение размера кода.
tracer-dynamic-coverage-feedbackиспользуется только при наличии отзывов о профилях. Реальные профили (в отличие от статически оцененных) намного менее сбалансированы, что позволяет установить порог большее значение. tracer-max-code-growth- Остановка дублирования хвоста после того, как рост кода достиг заданного процента. Это довольно искусственное ограничение, так как большинство дубликатов устраняются позже в переходе между разными участками кода, поэтому его можно задавать намного выше, чем желаемый рост кода.
tracer-min-branch-ratio- Остановка обратного роста, когда обратная вероятность лучшего ребра меньше этого порога (в процентах).
-
tracer-min-branch-ratiotracer-min-branch-ratio-feedback - Остановка прямого роста, если вероятность лучшего ребра ниже этого порога.
Аналогично
tracer-dynamic-coverage, есть два значения, одно для компиляции с обратной связью по профилю, а другое — без неё. Значение для компиляции с обратной связью по профилю должно быть более консервативным (большим), чтобы сделать трассировку эффективной. max-cse-path-length- Максимальное количество базовых блоков на пути, которые CSE рассматривает. По умолчанию 10.
max-cse-insns- Максимальное количество инструкций, обрабатываемых CSE перед сбросом. По умолчанию 1000.
ggc-min-expand- GCC использует сборщик мусора для управления собственным выделением памяти. Этот параметр указывает минимальный процент, на который сборщик мусора должен быть разрешено расширить свою кучу между сборками. Настройка этого может улучшить скорость компиляции; он не влияет на генерацию кода.
По умолчанию 30% + 70% * (ОЗУ/1 ГБ) с верхним пределом 100%, когда ОЗУ >= 1 ГБ. Если
getrlimitдоступен, понятие «ОЗУ» — это наименьшее из фактического ОЗУ иRLIMIT_DATAилиRLIMIT_AS. Если GCC не может вычислить ОЗУ на конкретной платформе, используется нижняя граница 30%. Установка этого параметра иggc-min-heapsizeв ноль вызывает полную сборку при каждой возможности. Это очень медленно, но может быть полезно для отладки. ggc-min-heapsize- Минимальный размер кучи сборщика мусора, прежде чем он начнёт утруждать себя сбором мусора. Первая сборка происходит после того, как куча увеличилась на
ggc-min-expand% сверхggc-min-heapsize. Снова, настройка этого может улучшить скорость компиляции, и не влияет на генерацию кода.По умолчанию это меньшее из ОЗУ/8, RLIMIT_RSS или предел, который пытается убедиться, что RLIMIT_DATA или RLIMIT_AS не превышены, но с нижним пределом 4096 (четыре мегабайта) и верхним пределом 131072 (128 мегабайт). Если GCC не может вычислить ОЗУ на конкретной платформе, используется нижняя граница. Установка этого параметра очень большой эффективно отключает сбор мусора. Установка этого параметра и
ggc-min-expandв ноль вызывает полную сборку при каждой возможности. max-reload-search-insns- Максимальное количество перезагрузки инструкций должно искать назад эквивалентные регистры. Увеличение значений означает более агрессивную оптимизацию, увеличивая время компиляции, вероятно, с немного лучшей производительностью. Значение по умолчанию — 100.
max-cselib-memory-locations- Максимальное количество ячеек памяти, которое cselib должен учитывать. Увеличение значений означает более агрессивную оптимизацию, увеличивая время компиляции, вероятно, с немного лучшей производительностью. Значение по умолчанию — 500.
-
reorder-blocks-duplicatereorder-blocks-duplicate-feedback - Используется этажом переупорядочения базовых блоков, чтобы определить, использовать ли безусловную ветвь или дублировать код в его конечном пункте. Код дублируется, когда его оценочный размер меньше этого значения, умноженного на оценочный размер безусловного перехода в горячих точках программы.
reorder-block-duplicate-feedbackиспользуется только при наличии отзывов о профилях. Его можно установить на более высокие значения, чемreorder-block-duplicate, поскольку информация о горячих точках более точная. max-sched-ready-insns- Максимальное количество инструкций, готовых к выпуску, которые планировщик должен учитывать в любой момент во время первого прохода планирования. Увеличение значений означает более тщательный поиск, что увеличивает время компиляции, вероятно, с небольшой пользой. Значение по умолчанию — 100.
max-sched-region-blocks- Максимальное количество блоков в области, которые должны быть рассмотрены для межблочного планирования. Значение по умолчанию — 10.
max-pipeline-region-blocks- Максимальное количество блоков в области, которые должны быть рассмотрены для конвейеризации в селективном планировщике. Значение по умолчанию — 15.
max-sched-region-insns- Максимальное количество инструкций в области, которые должны быть рассмотрены для межблочного планирования. Значение по умолчанию — 100.
max-pipeline-region-insns- Максимальное количество инструкций в области, которые должны быть рассмотрены для конвейеризации в селективном планировщике. Значение по умолчанию — 200.
min-spec-prob- Минимальная вероятность (в процентах) достижения исходного блока для межблочного упреждающего планирования. Значение по умолчанию — 40.
max-sched-extend-regions-iters- Максимальное количество итераций по CFG для расширения областей. Значение 0 (по умолчанию) отключает расширение областей.
max-sched-insn-conflict-delay- Максимальная задержка конфликта для инструкции, чтобы ее можно было рассматривать для упреждающего перемещения. Значение по умолчанию — 3.
sched-spec-prob-cutoff- Минимальная вероятность успеха упреждения (в процентах), так что упреждающие инструкции планируются. Значение по умолчанию — 40.
sched-spec-state-edge-prob-cutoff- Минимальная вероятность, которую должно иметь ребро, чтобы планировщик сохранил свое состояние через него. Значение по умолчанию — 10.
sched-mem-true-dep-cost- Минимальное расстояние (в тактах процессора) между записью и чтением, обращающимися к тем же ячейкам памяти. Значение по умолчанию — 1.
selsched-max-lookahead- Максимальный размер окна предвидения селективного планирования. Это глубина поиска доступных инструкций. Значение по умолчанию — 50.
selsched-max-sched-times- Максимальное количество раз, которое инструкция планируется во время селективного планирования. Это ограничение на количество итераций, через которые инструкция может быть конвейеризована. Значение по умолчанию — 2.
selsched-max-insns-to-rename- Максимальное количество лучших инструкций в очереди готовности, которые рассматриваются для переименования в селективном планировщике. Значение по умолчанию — 2.
sms-min-sc- Минимальное значение счётчика этапов, которое генерирует планировщик с модулем колебаний. Значение по умолчанию — 2.
max-last-value-rtl- Максимальный размер, измеренный как количество RTL, которые могут быть записаны в выражении в комбинаторе для псевдорегистра как последнее известное значение этого регистра. По умолчанию 10000.
integer-share-limit
- Малые целочисленные константы могут использовать общую структуру данных, что снижает использование памяти компилятором и увеличивает его скорость. Это устанавливает максимальное значение общей целочисленной константы. Значение по умолчанию равно 256.
ssp-buffer-size- Минимальный размер буферов (т.е. массивов), которые получают защиту от переполнения стека, когда используется
-fstack-protection. min-size-for-stack-sharing- Минимальный размер переменных, участвующих в совместном использовании слотов стека, при отсутствии оптимизации. Значение по умолчанию равно 32.
max-jump-thread-duplication-stmts- Максимальное количество операторов, разрешенных в блоке, который необходимо дублировать при потоковых переходах.
max-fields-for-field-sensitive- Максимальное количество полей в структуре, обрабатываемой чувствительным к полям способом во время анализа указателей. Значение по умолчанию равно нулю для
-O0и-O1, и 100 для-Os,-O2и-O3. prefetch-latency- Оценки среднего количества инструкций, выполняемых до завершения предварительной выборки. Расстояние предварительной выборки пропорционально этой константе. Увеличение этого числа может также привести к меньшему количеству потоков, которые предварительно выбираются (см.
simultaneous-prefetches). simultaneous-prefetches- Максимальное количество предварительных выборок, которые могут выполняться одновременно.
l1-cache-line-size- Размер строки кэша в кэше L1 в байтах.
l1-cache-size- Размер кэша L1 в килобайтах.
l2-cache-size- Размер кэша L2 в килобайтах.
min-insn-to-prefetch-ratio- Минимальное отношение между количеством инструкций и количеством предварительных выборок для включения предварительной выборки в цикле.
prefetch-min-insn-to-mem-ratio- Минимальное отношение между количеством инструкций и количеством обращений к памяти для включения предварительной выборки в цикле.
use-canonical-types- Нужно ли компилятору использовать «каноническую» систему типов. По умолчанию это всегда должно быть 1, что использует более эффективный внутренний механизм для сравнения типов в C++ и Objective-C++. Однако, если ошибки в канонической системе типов вызывают сбои компиляции, установите это значение в 0, чтобы отключить канонические типы.
switch-conversion-max-branch-ratio- Переключение инициализации преобразования отказывается создавать массивы, которые больше, чем
switch-conversion-max-branch-ratioраз, чем количество ветвей в switch. max-partial-antic-length- Максимальная длина частичного антимножества, вычисленного во время оптимизации частичной избыточности дерева (
-ftree-pre) при оптимизации на уровне-O3и выше. Для некоторых типов исходного кода улучшенная оптимизация частичной избыточности может уйти в бесконечный цикл, используя всю доступную память на хост-машине. Этот параметр устанавливает ограничение на длину вычисляемых множеств, что предотвращает такое поведение. Установка значения 0 для этого параметра разрешает неограниченную длину множества. sccvn-max-scc-size- Максимальный размер сильно связной компоненты (ССК) во время обработки SCCVN. Если это ограничение достигнуто, обработка SCCVN для всей функции не выполняется, и зависящие от нее оптимизации отключаются. По умолчанию максимальный размер ССК составляет 10000.
sccvn-max-alias-queries-per-access- Максимальное количество запросов алиаса-оркула, которые мы выполняем при поиске избыточных операций загрузки и сохранения. Если это ограничение достигнуто, поиск прерывается, и операция загрузки или сохранения не считается избыточной. Количество запросов алгоритмически ограничено количеством операций сохранения на всех путях от операции загрузки до входа в функцию. По умолчанию максимальное количество запросов составляет 1000.
ira-max-loops-num- IRA по умолчанию использует региональное распределение регистров. Если функция содержит больше циклов, чем число, заданное этим параметром, только не более заданного числа наиболее часто выполняемых циклов формируют области для регионального распределения регистров. Значение параметра по умолчанию равно 100.
ira-max-conflict-table-size- Хотя IRA использует сложный алгоритм для сжатия таблицы конфликтов, таблица все еще может требовать чрезмерного количества памяти для огромных функций. Если таблица конфликтов для функции может превышать размер в МБ, заданный этим параметром, распределитель регистров вместо этого использует более быстрый, более простой и менее качественный алгоритм, который не требует построения псевдотаблицы конфликтов регистров. Значение параметра по умолчанию равно 2000.
ira-loop-reserved-regs- IRA может использоваться для оценки более точного давления на регистры в циклах для принятия решений о перемещении инвариантов цикла (см.
-O3). Количество доступных регистров, зарезервированных для других целей, задается этим параметром. Значение параметра по умолчанию равно 2, что является минимальным количеством регистров, необходимым для типичных инструкций. Это значение является лучшим, найденным в результате многочисленных экспериментов. loop-invariant-max-bbs-in-loop- Перемещение инвариантов циклов может быть очень дорогим, как во времени компиляции, так и в количестве требуемой памяти во время компиляции, при очень больших циклах. Циклы с большим количеством базовых блоков, чем этот параметр, не будут подвергаться оптимизации перемещения инвариантов циклов. Значение параметра по умолчанию равно 1000 для
-O1и 10000 для-O2и выше. loop-max-datarefs-for-datadeps- Построение зависимостей данных дорого для очень больших циклов. Этот параметр ограничивает количество ссылок на данные в циклах, которые рассматриваются для анализа зависимостей данных. Эти большие циклы не обрабатываются оптимизациями, использующими зависимости данных цикла. Значение по умолчанию равно 1000.
max-vartrack-size- Устанавливает максимальное количество слотов таблицы хеширования для использования во время анализа потока данных отслеживания переменных любой функции. Если это ограничение превышено с включенным отслеживанием переменных при присваиваниях, анализ для этой функции повторяется без него после удаления всех отладочных инструкций из функции. Если ограничение превышено даже без отладочных инструкций, анализ отслеживания переменных полностью отключается для функции. Установка параметра в ноль делает его неограниченным.
max-vartrack-expr-depth- Устанавливает максимальное количество уровней рекурсии при попытке сопоставить имена переменных или временные отладочные переменные с выражениями значений. Это обменивает время компиляции на более полную отладочную информацию. Если это значение установлено слишком низко, доступные выражения значений, которые могли бы быть представлены в отладочной информации, могут в конечном итоге не использоваться; установка этого значения выше может позволить компилятору найти более сложные отладочные выражения, но время компиляции и использование памяти могут увеличиться. Значение по умолчанию равно 12.
min-nondebug-insn-uid- Использовать uid, начиная с этого параметра, для необладочных инструкций. Диапазон ниже параметра зарезервирован исключительно для отладочных инструкций, созданных
-fvar-tracking-assignments, но отладочные инструкции могут получить (неперекрывающиеся) uid выше него, если зарезервированный диапазон исчерпан. ipa-sra-ptr-growth-factor- IPA-SRA заменяет указатель на агрегат одним или несколькими новыми параметрами только тогда, когда их совокупный размер меньше или равен
ipa-sra-ptr-growth-factorраз размеру исходного параметра указателя. tm-max-aggregate-size- При создании копий потоково-локальных переменных в транзакции этот параметр задает размер в байтах, после которого переменные сохраняются с функциями регистрации вместо пар сохранения/восстановления кода. Этот параметр применим только при использовании
-fgnu-tm. graphite-max-nb-scop-params- Для избежания экспоненциальных эффектов в преобразованиях цикла Graphite, количество параметров в статической управляющей части (SCoP) ограничено. Значение по умолчанию равно 10 параметрам. Переменная, значение которой неизвестно во время компиляции и определена вне SCoP, является параметром SCoP.
graphite-max-bbs-per-function- Для избежания экспоненциальных эффектов в обнаружении SCoP, размер функций, анализируемых Graphite, ограничен. Значение по умолчанию равно 100 базовым блокам.
loop-block-tile-size- Преобразования разбиения циклов или разбиения на полосы, включенные с помощью
-floop-blockили-floop-strip-mine, разделяют каждый цикл в цикловом вложенном цикле на заданное количество итераций. Длина полосы может быть изменена с помощью параметраloop-block-tile-size. Значение по умолчанию равно 51 итерации. ipa-cp-value-list-size- IPA-CP пытается отследить все возможные значения и типы, передаваемые параметру функции, чтобы распространять их и выполнять девиртуализацию.
ipa-cp-value-list-size— максимальное количество значений и типов, которые он хранит для каждого формального параметра функции. ipa-cp-eval-threshold- IPA-CP вычисляет собственный рейтинг эвристики рентабельности клонирования и выполняет эти возможности клонирования с оценками, которые превышают
ipa-cp-eval-threshold. ipa-max-agg-items- IPA-CP также может распространять количество скалярных значений, передаваемых в агрегате.
ipa-max-agg-itemsконтролирует максимальное количество таких значений для каждого параметра. ipa-cp-loop-hint-bonus- Когда IPA-CP определяет, что кандидат на клонирование сделает количество итераций цикла известным, он добавляет бонус в размере
ipa-cp-loop-hint-bonusк баллу рентабельности кандидата. ipa-cp-array-index-hint-bonus- Когда IPA-CP определяет, что кандидат на клонирование сделает индекс доступа к массиву известным, он добавляет бонус в размере
ipa-cp-array-index-hint-bonusк баллу рентабельности кандидата. lto-partitions- Укажите желаемое количество разделов, созданных во время компиляции WHOPR. Количество разделов должно превышать количество ЦП, используемых для компиляции. Значение по умолчанию равно 32.
lto-minpartition- Размер минимального раздела для WHOPR (в оценке инструкций). Это предотвращает затраты на разделение очень маленьких программ на слишком много разделов.
cxx-max-namespaces-for-diagnostic-help- Максимальное количество пространств имен для консультации по предложениям, когда поиск имени C++ для идентификатора терпит неудачу. По умолчанию равно 1000.
sink-frequency-threshold- Максимальная относительная частота выполнения (в процентах) целевого блока относительно исходного блока оператора для разрешения опускания оператора. Более высокие числа приводят к более агрессивному опусканию оператора. Значение по умолчанию равно 75. Для операторов с операндами памяти применяется небольшая положительная корректировка, так как они еще более выгодны для опускания.
max-stores-to-sink- Максимальное количество пар условных сохранений, которые можно опустить. Установлено в 0, если либо векторизация (
-ftree-vectorize), либо преобразование if (-ftree-loop-if-convert) отключены. Значение по умолчанию равно 2. allow-load-data-races- Разрешить оптимизаторам вводить новые гонки данных при загрузках. Установите в 1 для разрешения, в противном случае в 0. Этот параметр включен по умолчанию, если явно не задан параметром
-fmemory-model=. allow-store-data-races- Разрешить оптимизаторам вводить новые гонки данных при сохранениях. Установите в 1 для разрешения, в противном случае в 0. Этот параметр включен по умолчанию, если явно не задан параметром
-fmemory-model=. allow-packed-load-data-races- Разрешить оптимизаторам вводить новые гонки данных при загрузке упакованных данных. Установите в 1 для разрешения, в противном случае в 0. Этот параметр включен по умолчанию, если явно не задан параметром
-fmemory-model=. allow-packed-store-data-races
- Разрешить оптимизаторам вносить новые гонки данных в упакованные хранилища данных. Установите в 1, чтобы разрешить, иначе в 0. Этот параметр включен по умолчанию, если не установлен явно параметром
-fmemory-model=. case-values-threshold- Наименьшее количество различных значений, для которых лучше использовать таблицу переходов вместо дерева условных ветвлений. Если значение равно 0, используется значение по умолчанию для машины. Значение по умолчанию равно 0.
tree-reassoc-width- Установите максимальное количество инструкций, выполняемых параллельно в пересоединённом дереве. Этот параметр переопределяет зависящие от целевой архитектуры эвристики, используемые по умолчанию, если имеет ненулевое значение.
sched-pressure-algorithm- Выберите между двумя доступными реализациями
-fsched-pressure. Алгоритм 1 — оригинальная реализация, которая с большей вероятностью предотвращает переупорядочение инструкций. Алгоритм 2 был разработан как компромисс между относительно консервативным подходом, принятым алгоритмом 1, и довольно агрессивным подходом, принятым по умолчанию планировщиком. Он в большей степени опирается на наличие регулярного файла регистров и точных классов давления регистров. Подробнее см.haifa-sched.cв исходном коде GCC.Выбор по умолчанию зависит от целевой архитектуры.
max-slsr-cand-scan- Установите максимальное количество существующих кандидатов, которые будут рассмотрены при поиске основы для нового кандидата прямолинейного упрощения.
asan-globals- Включить обнаружение переполнения буфера для глобальных объектов. Этот вид защиты включён по умолчанию, если используется параметр
-fsanitize=address. Для отключения защиты глобальных объектов используйте параметр--param asan-globals=0. asan-stack- Включить обнаружение переполнения буфера для стековых объектов. Этот вид защиты включён по умолчанию при использовании
-fsanitize=address. Для отключения защиты стека используйте параметр--param asan-stack=0. asan-instrument-reads- Включить обнаружение переполнения буфера для операций чтения памяти. Этот вид защиты включён по умолчанию при использовании
-fsanitize=address. Для отключения защиты операций чтения памяти используйте параметр--param asan-instrument-reads=0. asan-instrument-writes- Включить обнаружение переполнения буфера для операций записи в память. Этот вид защиты включён по умолчанию при использовании
-fsanitize=address. Для отключения защиты операций записи в память используйте параметр--param asan-instrument-writes=0. asan-memintrin- Включить обнаружение встроенных функций. Этот вид защиты включён по умолчанию при использовании
-fsanitize=address. Для отключения защиты встроенных функций используйте параметр--param asan-memintrin=0. asan-use-after-return- Включить обнаружение использования памяти после возврата. Этот вид защиты включён по умолчанию при использовании параметра
-fsanitize=address. Для отключения обнаружения использования памяти после возврата используйте параметр--param asan-use-after-return=0. asan-instrumentation-with-call-threshold- Если количество обращений к памяти в инструментируемой функции больше или равно этому числу, используйте обратные вызовы вместо встроенных проверок. Например, чтобы отключить встроенный код, используйте
--param asan-instrumentation-with-call-threshold=0.
- Разрешить оптимизаторам вносить новые гонки данных в упакованные хранилища данных. Установите в 1, чтобы разрешить, иначе в 0. Этот параметр включен по умолчанию, если не установлен явно параметром
© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-4.9.4/gcc/Optimize-Options.html