3.11 Параметры, управляющие оптимизацией
Эти параметры управляют различными видами оптимизаций.
Без параметров оптимизации цель компилятора — сократить время компиляции и обеспечить, чтобы отладка давала ожидаемые результаты. Операторы независимы: если вы остановите программу с точкой останова между операторами, вы сможете присвоить новое значение любой переменной или изменить указатель программы на любой другой оператор в функции и получить точно такие результаты, которые ожидаются от исходного кода.
Включение флагов оптимизации заставляет компилятор пытаться улучшить производительность и/или размер кода за счёт времени компиляции и, возможно, способности отлаживать программу.
Компилятор выполняет оптимизацию, основываясь на знаниях о программе. Режим компиляции нескольких файлов в один выходной файл позволяет компилятору использовать информацию, полученную из всех файлов, при компиляции каждого из них.
Не все оптимизации управляются напрямую флагом. В этом разделе перечислены только оптимизации, для которых есть флаг.
Большинство оптимизаций полностью отключены при -O0 или если уровень -O не задан в командной строке, даже если отдельные флаги оптимизации указаны. Аналогично, -Og подавляет многие этапы оптимизации.
В зависимости от целевой платформы и того, как был сконфигурирован GCC, набор оптимизаций, включённых на каждом уровне -O, может незначительно отличаться от перечисленного здесь. Вы можете вызвать GCC с -Q --help=optimizers, чтобы узнать точный набор оптимизаций, включённых на каждом уровне. См. Параметры, управляющие видом выходных данных, для примеров.
-
-O -O1-
Оптимизация. Оптимизированная компиляция занимает немного больше времени и много больше памяти для большой функции.
С -O компилятор пытается уменьшить размер кода и время выполнения, не выполняя никаких оптимизаций, которые занимают большое время компиляции.
-O включает следующие флаги оптимизации:
-fauto-inc-dec -fbranch-count-reg -fcombine-stack-adjustments -fcompare-elim -fcprop-registers -fdce -fdefer-pop -fdelayed-branch -fdse -fforward-propagate -fguess-branch-probability -fif-conversion -fif-conversion2 -finline-functions-called-once -fipa-modref -fipa-profile -fipa-pure-const -fipa-reference -fipa-reference-addressable -fmerge-constants -fmove-loop-invariants -fmove-loop-stores -fomit-frame-pointer -freorder-blocks -fshrink-wrap -fshrink-wrap-separate -fsplit-wide-types -fssa-backprop -fssa-phiopt -ftree-bit-ccp -ftree-ccp -ftree-ch -ftree-coalesce-vars -ftree-copy-prop -ftree-dce -ftree-dominator-opts -ftree-dse -ftree-forwprop -ftree-fre -ftree-phiprop -ftree-pta -ftree-scev-cprop -ftree-sink -ftree-slsr -ftree-sra -ftree-ter -funit-at-a-time
-
-O2 -
Более сильная оптимизация. GCC выполняет практически все поддерживаемые оптимизации, которые не предполагают компромисса между размером и скоростью. По сравнению с -O, этот параметр увеличивает как время компиляции, так и производительность сгенерированного кода.
-O2 включает все флаги оптимизации, указанные в -O1. Он также включает следующие флаги оптимизации:
-falign-functions -falign-jumps -falign-labels -falign-loops -fcaller-saves -fcode-hoisting -fcrossjumping -fcse-follow-jumps -fcse-skip-blocks -fdelete-null-pointer-checks -fdevirtualize -fdevirtualize-speculatively -fexpensive-optimizations -ffinite-loops -fgcse -fgcse-lm -fhoist-adjacent-loads -finline-functions -finline-small-functions -findirect-inlining -fipa-bit-cp -fipa-cp -fipa-icf -fipa-ra -fipa-sra -fipa-vrp -fisolate-erroneous-paths-dereference -flra-remat -foptimize-sibling-calls -foptimize-strlen -fpartial-inlining -fpeephole2 -freorder-blocks-algorithm=stc -freorder-blocks-and-partition -freorder-functions -frerun-cse-after-loop -fschedule-insns -fschedule-insns2 -fsched-interblock -fsched-spec -fstore-merging -fstrict-aliasing -fthread-jumps -ftree-builtin-call-dce -ftree-loop-vectorize -ftree-pre -ftree-slp-vectorize -ftree-switch-conversion -ftree-tail-merge -ftree-vrp -fvect-cost-model=very-cheap
Обратите внимание на предупреждение под -fgcse о вызове -O2 для программ, использующих вычисленные переходы.
-
-O3 -
Ещё более сильная оптимизация. -O3 включает все оптимизации, указанные в -O2, а также включает следующие флаги оптимизации:
-fgcse-after-reload -fipa-cp-clone -floop-interchange -floop-unroll-and-jam -fpeel-loops -fpredictive-commoning -fsplit-loops -fsplit-paths -ftree-loop-distribution -ftree-partial-pre -funswitch-loops -fvect-cost-model=dynamic -fversion-loops-for-strides
-
-O0 -
Сократить время компиляции и обеспечить, что отладка даёт ожидаемые результаты. Это значение по умолчанию.
-
-Os -
Оптимизация по размеру. -Os включает все оптимизации -O2, за исключением тех, которые часто увеличивают размер кода:
-falign-functions -falign-jumps -falign-labels -falign-loops -fprefetch-loop-arrays -freorder-blocks-algorithm=stc
Он также включает -finline-functions, настраивает компилятор на оптимизацию размера кода, а не скорости выполнения, и выполняет дополнительные оптимизации, направленные на уменьшение размера кода.
-
-Ofast -
Игнорирование строгого соблюдения стандартов. -Ofast включает все оптимизации -O3. Он также включает оптимизации, которые не являются допустимыми для всех программ, соответствующих стандартам. Он включает -ffast-math, -fallow-store-data-races и специфичную для Fortran -fstack-arrays, если не указан -fmax-stack-var-size, и -fno-protect-parens. Он отключает -fsemantic-interposition.
-
-Og -
Оптимизация опыта отладки. -Og должен быть уровнем оптимизации по умолчанию для стандартного цикла редактирования-компиляции-отладки, предлагая разумный уровень оптимизации при сохранении быстроты компиляции и хорошего опыта отладки. Это лучший выбор, чем -O0 для создания отлаживаемого кода, потому что некоторые этапы компилятора, которые собирают информацию об отладке, отключены при -O0.
Как и -O0, -Og полностью отключает ряд этапов оптимизации, так что отдельные параметры, которые их контролируют, не имеют эффекта. В противном случае -Og включает все флаги оптимизации -O1, за исключением тех, которые могут препятствовать отладке:
-fbranch-count-reg -fdelayed-branch -fdse -fif-conversion -fif-conversion2 -finline-functions-called-once -fmove-loop-invariants -fmove-loop-stores -fssa-phiopt -ftree-bit-ccp -ftree-dse -ftree-pta -ftree-sra
-
-Oz -
Агрессивная оптимизация по размеру вместо скорости. Это может увеличить количество выполняемых инструкций, если эти инструкции требуют кодирования в меньшем количестве байтов. -Oz ведёт себя аналогично -Os, включая включение большинства оптимизаций -O2.
Если вы используете несколько параметров -O с номерами уровней или без них, эффективен последний такой параметр.
Параметры вида -fflag указывают независимые от машины флаги. Большинство флагов имеют положительные и отрицательные формы; отрицательная форма -ffoo — -fno-foo. В таблице ниже приведён только один из вариантов — тот, который вы обычно используете. Вы можете определить другой вариант, либо удалив «no-», либо добавив его.
Следующие параметры управляют конкретными оптимизациями. Они либо активируются параметрами -O, либо связаны с ними. Вы можете использовать следующие флаги в тех редких случаях, когда требуется «тонкая настройка» выполняемых оптимизаций.
-
-fno-defer-pop -
Для машин, которые должны извлекать аргументы после вызова функции, всегда извлекайте аргументы сразу после каждого возвращения из функции. На уровнях -O1 и выше, -fdefer-pop является значением по умолчанию; это позволяет компилятору позволить аргументам накапливаться в стеке для нескольких вызовов функций и извлечь их все сразу.
-
-fforward-propagate -
Выполните проход по передаче вперед на RTL. Проход пытается объединить две инструкции и проверяет, может ли результат быть упрощен. Если включено развертывание циклов, выполняются два прохода, и второй планируется после развертывания циклов.
Этот параметр включен по умолчанию на уровнях оптимизации -O1, -O2, -O3, -Os.
-
-ffp-contract=style -
-ffp-contract=off отключает сокращение выражений с плавающей точкой. -ffp-contract=fast включает сокращение выражений с плавающей точкой, например, формирование операций умножения-сложения слияния, если целевая платформа имеет для них собственную поддержку. -ffp-contract=on включает сокращение выражений с плавающей точкой, если это разрешено стандартом языка. Это реализовано для C и C++, где оно включает сокращение в рамках одного выражения, но не через разные операторы.
По умолчанию используется -ffp-contract=off для C в режиме соответствия стандартам (-std=c11 или аналогичном), -ffp-contract=fast в противном случае.
-
-fomit-frame-pointer -
Опускайте указатель на фрейм в функциях, которым он не нужен. Это позволяет избежать инструкций для сохранения, настройки и восстановления указателя на фрейм; на многих платформах это также делает доступным дополнительный регистр.
На некоторых платформах этот флаг не имеет эффекта, потому что стандартная последовательность вызова всегда использует указатель на фрейм, поэтому его нельзя опустить.
Обратите внимание, что -fno-omit-frame-pointer не гарантирует, что указатель на фрейм используется во всех функциях. Некоторые платформы всегда опускают указатель на фрейм в функциях-листьях.
Включено по умолчанию на -O1 и выше.
-
-foptimize-sibling-calls -
Оптимизируйте вызовы функций-сиблингов и хвостовой рекурсии.
Включено на уровнях -O2, -O3, -Os.
-
-foptimize-strlen -
Оптимизируйте различные стандартные функции C для работы со строками (например,
strlen,strchrилиstrcpy) и их_FORTIFY_SOURCEаналогичные варианты на более быстрые альтернативы.Включено на уровнях -O2, -O3.
-
-finline-stringops[=fn] -
Встраивайте операции с памятью и строками (на данный момент только
memset) встраиваемо, даже когда длина переменная или достаточно большая, чтобы потребовалось циклическое выполнение. Это наиболее полезно вместе с -ffreestanding и -fno-builtin.В некоторых ситуациях это позволяет компилятору генерировать код, который использует известное выравнивание и множители длины, но даже тогда он может быть менее эффективным, чем оптимизированные реализации времени выполнения, и так сильно увеличивать размер кода, что даже менее производительная, но общая реализация работает быстрее из-за лучшего использования кэшей кода. Этот параметр отключен по умолчанию.
-
-fno-inline -
Не встраивайте функции, за исключением тех, которые помечены атрибутом
always_inline. Это значение по умолчанию, когда оптимизация не включена.Отдельные функции могут быть исключены из встраивания, пометив их атрибутом
noinline. -
-finline-small-functions -
Интегрируйте функции в их вызывающие функции, когда их тело меньше, чем ожидаемый код вызова функции (чтобы общий размер программы стал меньше). Компилятор эвристически определяет, достаточно ли просты функции, чтобы их стоило интегрировать таким образом. Это встраивание применяется ко всем функциям, даже к тем, которые не объявлены как inline.
Включено на уровнях -O2, -O3, -Os.
-
-findirect-inlining -
Встраивайте также косвенные вызовы, которые обнаруживаются как известные во время компиляции благодаря предыдущему встраиванию. Этот параметр имеет какой-либо эффект только при включении самого встраивания с помощью параметров -finline-functions или -finline-small-functions.
Включено на уровнях -O2, -O3, -Os.
-
-finline-functions -
Рассмотрите все функции для встраивания, даже если они не объявлены как inline. Компилятор эвристически определяет, стоит ли интегрировать функции таким образом.
Если все вызовы данной функции интегрированы, и функция объявлена
static, то функция обычно не выводится как код ассемблера в собственном праве.Включено на уровнях -O2, -O3, -Os. Также включено с помощью -fprofile-use и -fauto-profile.
-
-finline-functions-called-once -
Рассмотрите все
staticфункции, вызываемые один раз для встраивания в вызывающую их функцию, даже если они не помеченыinline. Если вызов данной функции интегрирован, то функция не выводится как код ассемблера в собственном праве.Включено на уровнях -O1, -O2, -O3 и -Os, но не -Og.
-
-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. См. Объявление атрибутов функций. -
-fkeep-inline-functions -
В C, выводите
staticфункции, которые объявленыinlineв объектный файл, даже если функция была встроена во все вызывающие ее функции. Этот переключатель не влияет на функции, использующие расширениеextern inlineв GNU C90. В C++, выводите все встраиваемые функции в объектный файл. -
-fkeep-static-functions -
Выводите
staticфункции в объектный файл, даже если функция никогда не используется. -
-fkeep-static-consts -
Выводите переменные, объявленные
static const, когда оптимизация не включена, даже если переменные не ссылаются.GCC включает этот параметр по умолчанию. Если вы хотите заставить компилятор проверить, ссылается ли переменная, независимо от того, включена ли оптимизация, используйте параметр -fno-keep-static-consts.
-
-fmerge-constants -
Попытка объединить идентичные константы (строковые константы и константы с плавающей точкой) в разных единицах трансляции.
Этот параметр используется по умолчанию для оптимизированной компиляции, если ассемблер и компоновщик поддерживают его. Используйте -fno-merge-constants для отключения этого поведения.
Включено на уровнях -O1, -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. Обратите внимание, что параметр -fno-branch-count-reg не удаляет инструкции декремент и переход из генерируемого потока инструкций, введённых другими оптимизационными модулями.
По умолчанию используется -fbranch-count-reg при -O1 и выше, за исключением -Og.
-
-fno-function-cse -
Не помещать адреса функций в регистры; каждая инструкция, которая вызывает постоянную функцию, должна явно содержать адрес этой функции.
Этот параметр приводит к менее эффективному коду, но некоторые странные хаки, которые изменяют вывод ассемблера, могут быть спутаны с оптимизациями, когда этот параметр не используется.
По умолчанию используется -ffunction-cse.
-
-fno-zero-initialized-in-bss -
Если целевая платформа поддерживает секцию BSS, GCC по умолчанию помещает переменные, инициализированные нулём, в BSS. Это может сэкономить место в результирующем коде.
Этот параметр отключает это поведение, так как некоторые программы явно полагаются на то, что переменные попадают в секцию данных, например, чтобы результирующий исполняемый файл мог найти начало этой секции и/или делать предположения на её основе.
По умолчанию используется -fzero-initialized-in-bss.
-
-fthread-jumps -
Производить оптимизации, проверяющие, переходит ли прыжок к месту, где найдена другая сравнивающая подстановка, подчинённая первой. В этом случае первый прыжок перенаправляется либо на место назначения второго прыжка, либо на точку, непосредственно следующую за ней, в зависимости от того, известно ли, что условие истинно или ложно.
Включено на уровнях -O1, -O2, -O3, -Os.
-
-fsplit-wide-types -
При использовании типа, занимающего несколько регистров, например,
long longна 32-битной системе, разделить регистры и выделить их независимо. Это обычно генерирует лучший код для этих типов, но может затруднить отладку.Включено на уровнях -O1, -O2, -O3, -Os.
-
-fsplit-wide-types-early -
Полностью разделить широкие типы на ранней стадии, а не очень поздно. Этот параметр не имеет эффекта, если не включён -fsplit-wide-types.
По умолчанию включено на некоторых целевых платформах.
-
-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 после загрузки выполняется этап устранения избыточных загрузок. Цель этого этапа — очистка избыточного выплескивания.
Включено с -O3, -fprofile-use и -fauto-profile.
-
-faggressive-loop-optimizations -
Этот параметр сообщает оптимизатору циклов использовать языковые ограничения для вывода границ для числа итераций цикла. Предполагается, что код цикла не вызывает неопределённого поведения, например, вызывая переполнение целых чисел со знаком или обращения к массивам за пределами границ. Границы числа итераций цикла используются для управления оптимизациями разворачивания и обрезки циклов и проверкой выхода из цикла.
Этот параметр включен по умолчанию.
-
-funconstrained-commons -
Этот параметр сообщает компилятору, что переменные, объявленные в общих блоках (например, Fortran), могут быть позже переопределены с более длинными хвостовыми массивами. Это предотвращает определённые оптимизации, которые зависят от знания границ массивов.
-
-fcrossjumping -
Произвести преобразование межпрыжков. Это преобразование унифицирует эквивалентный код и экономит размер кода. Результирующий код может работать лучше или хуже, чем без преобразования межпрыжков.
Включено на уровнях -O2, -O3, -Os.
-
-fauto-inc-dec -
Объединить инкременты или декременты адресов с обращениями к памяти. Этот этап всегда пропускается на архитектурах, которые не имеют инструкций для поддержки этого. Включено по умолчанию при -O1 и выше на архитектурах, которые поддерживают это.
-
-fdce -
Выполнить устранение мёртвого кода (DCE) на RTL. Включено по умолчанию при -O1 и выше.
-
-fdse -
Выполнить устранение мёртвых хранилищ (DSE) на RTL. Включено по умолчанию при -O1 и выше.
-
-fif-conversion -
Попытка преобразовать условные переходы в эквиваленты без ветвлений. Это включает использование условных перемещений, min, max, установки флагов и инструкций abs, а также некоторые уловки, выполнимые стандартной арифметикой. Использование условного выполнения на чипах, где оно доступно, контролируется параметром -fif-conversion2.
Включено на уровнях -O1, -O2, -O3, -Os, но не с -Og.
-
-fif-conversion2 -
Использовать условное выполнение (где доступно) для преобразования условных переходов в эквиваленты без ветвлений.
Включено на уровнях -O1, -O2, -O3, -Os, но не с -Og.
-
-fdeclone-ctor-dtor -
C++ ABI требует нескольких точек входа для конструкторов и деструкторов: одну для базового подобъекта, одну для полного объекта и одну для виртуального деструктора, который вызывает operator delete впоследствии. Для иерархии с виртуальными базовыми классами базовые и полные варианты являются клонами, что означает две копии функции. С этим параметром базовые и полные варианты изменяются на тонкие указатели, которые вызывают общее реализацию.
Включено с -Os.
-
-fdelete-null-pointer-checks -
Предполагается, что программы не могут безопасно разыменовывать указатели на null и что ни один элемент кода или данных не находится по адресу ноль. Этот параметр включает простые оптимизации константного сворачивания на всех уровнях оптимизации. Кроме того, другие оптимизационные модули в GCC используют этот флаг для управления глобальными анализами потока данных, которые устраняют бесполезные проверки указателей на null; они предполагают, что доступ к памяти по адресу ноль всегда приводит к ошибке, так что если указатель проверяется после того, как он уже был разыменован, он не может быть null.
Однако обратите внимание, что в некоторых средах это предположение неверно. Используйте -fno-delete-null-pointer-checks, чтобы отключить эту оптимизацию для программ, которые зависят от этого поведения.
Этот параметр включён по умолчанию на большинстве целевых платформ. В Nios II ELF по умолчанию выключен. В AVR и MSP430 этот параметр полностью отключён.
Этапы, использующие информацию о потоке данных, включены независимо на разных уровнях оптимизации.
-
-fdevirtualize -
Попытаться преобразовать вызовы виртуальных функций в прямые вызовы. Это делается как внутри процедуры, так и межпроцедурно в рамках косвенного встраивания (-findirect-inlining) и межпроцедурного распространения констант (-fipa-cp). Включено на уровнях -O2, -O3, -Os.
-
-fdevirtualize-speculatively
-
Попытаться преобразовать вызовы виртуальных функций в умозрительные прямые вызовы. На основе анализа графа наследования типов определить для данного вызова множество вероятных целей. Если множество невелико, предпочтительно размера 1, изменить вызов на условный, решающий между прямым и косвенным вызовами. Умозрительные вызовы позволяют проводить больше оптимизаций, например, встраивание. Когда они кажутся бесполезными после дальнейшей оптимизации, они преобразуются обратно в исходную форму.
-
-fdevirtualize-at-ltrans -
Поток дополнительной информации, необходимой для агрессивной девиртуализации при запуске оптимизатора времени компоновки в режиме локальной трансформации. Этот параметр позволяет выполнять больше девиртуализации, но существенно увеличивает размер передаваемых данных. По этой причине он отключён по умолчанию.
-
-fexpensive-optimizations -
Выполнение ряда небольших оптимизаций, которые относительно дороги.
Включён на уровнях -O2, -O3, -Os.
-
-free -
Попытка удалить избыточные инструкции расширения. Это особенно полезно для архитектуры x86-64, которая неявно расширяет до 64 бит регистры после записи в их нижнюю 32-битную половину.
Включён для Alpha, AArch64, LoongArch, PowerPC, RISC-V, SPARC, h83000 и x86 на уровнях -O2, -O3, -Os.
-
-fno-lifetime-dse -
В C++ значение объекта изменяется только при изменениях в течение его жизненного цикла: когда конструктор начинает работу, объект имеет неопределённое значение, и любые изменения в течение жизненного цикла объекта становятся неактуальными при уничтожении объекта. Обычно устранение неактуальных присваиваний использует это свойство; если ваш код полагается на сохранение значения хранилища объекта после окончания жизненного цикла объекта, вы можете использовать этот флаг для отключения этой оптимизации. Чтобы сохранить сохранения до начала конструктора (например, потому что ваш оператор new очищает хранилище объекта), но всё ещё рассматривать объект как неактуальный после деструктора, вы можете использовать -flifetime-dse=1. По умолчанию это поведение можно выбрать явно с помощью -flifetime-dse=2. -flifetime-dse=0 эквивалентно -fno-lifetime-dse.
-
-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 -
Отключение совместного использования слотов стека, выделенных для псевдорегистров. Каждый псевдорегистр, не получивший жёсткий регистр, получает отдельный слот стека, в результате чего кадровые фреймы функций становятся больше.
-
-flra-remat -
Включение CFG-зависимой рематериализации в LRA. Вместо загрузки значений разливаемых псевдо, LRA пытается рематериализовать (пересчитать) значения, если это выгодно.
Включено на уровнях -O2, -O3, -Os.
-
-fdelayed-branch -
Если поддерживается для целевой машины, попытаться переупорядочить инструкции для использования слотов инструкций, доступных после инструкций ветвления с задержкой.
Включено на уровнях -O1, -O2, -O3, -Os, но не на -Og.
-
-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.
-
-fsemantic-interposition -
Некоторые форматы объектов, такие как ELF, позволяют динамической библиотеке подключать символы. Это означает, что для символов, экспортированных из DSO, компилятор не может выполнять межпроцедурную прокладку, встраивание и другие оптимизации в ожидании, что функция или переменная могут измениться. Хотя эта функция полезна, например, для переписывания функций выделения памяти реализацией отладки, она дорогостоящая с точки зрения качества кода. С помощью -fno-semantic-interposition компилятор предполагает, что если происходит подстановка функций, функция замены будет иметь точно такую же семантику (и побочные эффекты). Аналогично, если происходит подстановка переменных, конструктор переменной будет таким же. Флаг не влияет на функции, явно объявленные как inline (где никогда не допускается изменение семантики при подстановке) и на символы, явно объявленные как weak.
-
-fshrink-wrap -
Генерировать прологи функций только перед частями функции, которые их требуют, а не в начале функции. Этот флаг включен по умолчанию при -O и выше.
-
-fshrink-wrap-separate -
Сжимать отдельные части пролога и эпилога отдельно, так что эти части выполняются только при необходимости. Этот параметр включен по умолчанию, но не имеет эффекта, если не включен -fshrink-wrap и целевая платформа поддерживает это.
-
-fcaller-saves -
Включить выделение значений для регистров, которые нарушаются вызовами функций, путем генерации дополнительных инструкций для сохранения и восстановления регистров вокруг таких вызовов. Такое выделение выполняется только в том случае, если это приводит к лучшему коду.
Этот параметр всегда включен по умолчанию на определенных машинах, обычно на тех, у которых нет регистров, сохраняемых при вызове.
Включен на уровнях -O2, -O3, -Os.
-
-fcombine-stack-adjustments -
Отслеживает корректировки стека (сдвиги и возвраты) и обращения к памяти стека, а затем пытается найти способы их объединения.
Включен по умолчанию при -O1 и выше.
-
-fipa-ra -
Использовать регистры сохранения вызывающей стороны для выделения, если эти регистры не используются ни одной вызываемой функцией. В этом случае не нужно сохранять и восстанавливать их вокруг вызовов. Это возможно только если вызываемые функции являются частью того же модуля компиляции, что и текущая функция, и они скомпилированы перед ней.
Включен на уровнях -O2, -O3, -Os, однако параметр отключен, если сгенерированный код будет снабжен инструментацией для профилирования (-p или -pg), или если использование регистров вызываемой стороной не может быть точно определено (это происходит на платформах, которые не предоставляют прологи и эпилоги в RTL).
-
-fconserve-stack -
Попытка минимизировать использование стека. Компилятор пытается использовать меньше места в стеке, даже если это замедляет программу. Этот параметр подразумевает установку параметра large-stack-frame в 100 и параметра large-stack-frame-growth в 400.
-
-ftree-reassoc -
Выполнять перегруппировку в деревьях. Этот флаг включен по умолчанию при -O1 и выше.
-
-fcode-hoisting -
Выполнять подъем кода. Подъем кода пытается переместить вычисления выражений, выполняемых на всех путях, к выходу функции как можно раньше. Это особенно полезно для оптимизации размера кода, но часто помогает и для повышения скорости кода. Этот флаг включен по умолчанию при -O2 и выше.
-
-ftree-pre -
Выполнять частичное устранение избыточности (PRE) в деревьях. Этот флаг включен по умолчанию при -O2 и -O3.
-
-ftree-partial-pre -
Сделать частичное устранение избыточности (PRE) более агрессивным. Этот флаг включен по умолчанию при -O3.
-
-ftree-forwprop -
Выполнять распространение вперед в деревьях. Этот флаг включен по умолчанию при -O1 и выше.
-
-ftree-fre -
Выполнять полное устранение избыточности (FRE) в деревьях. Разница между FRE и PRE заключается в том, что FRE учитывает только выражения, которые вычисляются на всех путях, ведущих к избыточному вычислению. Этот анализ быстрее, чем PRE, хотя и обнаруживает меньше избыточностей. Этот флаг включен по умолчанию при -O1 и выше.
-
-ftree-phiprop -
Выполнять подъем загрузок из условных указателей в деревьях. Этот этап включен по умолчанию при -O1 и выше.
-
-fhoist-adjacent-loads -
Упреждающее поднять загрузки из обоих ветвей if-then-else, если загрузки из смежных позиций в одной структуре, и целевая архитектура имеет инструкцию условного перемещения. Этот флаг включен по умолчанию при -O2 и выше.
-
-ftree-copy-prop -
Выполнять распространение копий в деревьях. Этот этап устраняет ненужные операции копирования. Этот флаг включен по умолчанию при -O1 и выше.
-
-fipa-pure-const -
Определять, какие функции являются чистыми или константными. Включено по умолчанию при -O1 и выше.
-
-fipa-reference -
Определять, какие статические переменные не выходят за пределы модуля компиляции. Включено по умолчанию при -O1 и выше.
-
-fipa-reference-addressable -
Определять статические переменные только для чтения, только для записи и недоступные для адресации. Включено по умолчанию при -O1 и выше.
-
-fipa-stack-alignment -
Если возможно, уменьшить выравнивание стека в местах вызовов. Включено по умолчанию.
-
-fipa-pta -
Выполнять межпроцедурный анализ указателей и межпроцедурный анализ модификаций и ссылок. Этот параметр может привести к чрезмерному использованию памяти и времени компиляции в больших модулях компиляции. По умолчанию не включен ни на одном уровне оптимизации.
-
-fipa-profile -
Выполнять межпроцедурную прокладку профиля. Функции, вызываемые только из холодных функций, помечаются как холодные. Также идентифицируются функции, выполняемые один раз (такие как
cold,noreturn, статические конструкторы или деструкторы). Холодные функции и части функций, выполняемых один раз, без циклов, затем оптимизируются для размера. Включено по умолчанию при -O1 и выше. -
-fipa-modref -
Выполнять межпроцедурный анализ mod/ref. Эта оптимизация анализирует побочные эффекты функций (места памяти, которые модифицируются или к которым обращаются) и позволяет лучше оптимизировать через границу вызова функции. Этот флаг включен по умолчанию при -O1 и выше.
-
-fipa-cp -
Выполнять межпроцедурную прокладку констант. Эта оптимизация анализирует программу, чтобы определить, когда значения, передаваемые в функции, являются константами, а затем оптимизирует соответственно. Эта оптимизация может существенно повысить производительность, если приложение передает константы в функции. Этот флаг включен по умолчанию при -O2, -Os и -O3. Он также включен при -fprofile-use и -fauto-profile.
-
-fipa-cp-clone
-
Выполнить клонирование функций, чтобы усилить межпроцедурную константную прокладку. При включении межпроцедурная константная прокладка выполняет клонирование функций, когда внешне видимая функция может вызываться с константными аргументами. Поскольку эта оптимизация может создавать несколько копий функций, она может значительно увеличить размер кода (см. --param ipa-cp-unit-growth=значение). Этот флаг включен по умолчанию в -O3. Он также включен -fprofile-use и -fauto-profile.
-
-fipa-bit-cp -
При включении выполняется межпроцедурная константная прокладка поразрядных операций. Этот флаг включен по умолчанию в -O2 и -fprofile-use и -fauto-profile. Требуется включение -fipa-cp.
-
-fipa-vrp -
При включении выполняется межпроцедурная прокладка диапазонов значений. Этот флаг включен по умолчанию в -O2. Требуется включение -fipa-cp.
-
-fipa-icf -
Выполнить сжатие идентичного кода для функций и только для чтения переменных. Оптимизация уменьшает размер кода и может нарушить стеки разворачивания, заменяя функцию эквивалентной с другим именем. Оптимизация работает более эффективно при включенной оптимизации на этапе компоновки.
Хотя поведение похоже на оптимизацию ICF Gold Linker, GCC ICF работает на разных уровнях, и поэтому оптимизации не одинаковы — есть эквивалентности, найденные только GCC и эквивалентности, найденные только Gold.
Этот флаг включен по умолчанию в -O2 и -Os.
-
-flive-patching=level -
Управление оптимизациями GCC для создания выходных данных, подходящих для динамической подгрузки.
Если оптимизация компилятора использует тело функции или информацию, извлеченную из ее тела, для оптимизации/изменения другой функции, последняя называется зависимой функцией первой. Если функция подгружается, ее зависимые функции также должны быть подгружены.
Зависимые функции определяются межпроцедурными оптимизациями компилятора. Например, вызывающая функция зависит, когда функция встраивается в вызывающую функцию, функция клонируется, и вызывающая функция изменяется для вызова этого нового клона, или информация о чистоте/постоянстве функции извлекается для оптимизации ее прямых или косвенных вызывающих функций и т. д.
Обычно, чем больше включено оптимизаций IPA, тем больше зависимых функций для каждой функции. Для управления количеством зависимых функций и более легкого вычисления списка зависимых функций оптимизации IPA могут быть частично включены на двух разных уровнях.
Аргумент уровень должен быть одним из следующих:
- ‘inline-clone’
Включает только оптимизации встраивания и клонирования, в том числе встраивание, клонирование, межпроцедурную скалярную замену агрегатов и частичное встраивание. В результате при подгрузке функции все ее вызывающие функции и вызывающие функции ее клонов зависят и поэтому также должны быть подгружены.
-flive-patching=inline-clone отключает следующие флаги оптимизации:
-fwhole-program -fipa-pta -fipa-reference -fipa-ra -fipa-icf -fipa-icf-functions -fipa-icf-variables -fipa-bit-cp -fipa-vrp -fipa-pure-const -fipa-reference-addressable -fipa-stack-alignment -fipa-modref
- ‘inline-only-static’
Включает только встраивание статических функций. В результате при подгрузке статической функции все ее вызывающие функции зависят и поэтому также должны быть подгружены.
В дополнение ко всем флагам, которые -flive-patching=inline-clone отключает, -flive-patching=inline-only-static отключает следующие дополнительные флаги оптимизации:
-fipa-cp-clone -fipa-sra -fpartial-inlining -fipa-cp
Если -flive-patching указан без значения, значение по умолчанию равно inline-clone.
Этот флаг отключен по умолчанию.
Обратите внимание, что -flive-patching не поддерживается с оптимизацией на этапе компоновки (-flto).
-
-fisolate-erroneous-paths-dereference -
Обнаружить пути, которые вызывают ошибочное или неопределенное поведение из-за обращения к нулевому указателю. Изолировать эти пути от основного потока управления и преобразовать оператор с ошибочным или неопределенным поведением в ловушку. Этот флаг включен по умолчанию в -O2 и выше и зависит от того, что также включен -fdelete-null-pointer-checks.
-
-fisolate-erroneous-paths-attribute -
Обнаружить пути, которые вызывают ошибочное или неопределенное поведение из-за использования нулевого значения способом, запрещенным
returns_nonnullилиnonnullатрибутом. Изолировать эти пути от основного потока управления и преобразовать оператор с ошибочным или неопределенным поведением в ловушку. В настоящее время это не включено, но может быть включено в -O2 в будущем. -
-ftree-sink -
Выполнить передвижение сохранения вперед по деревьям. Этот флаг включен по умолчанию в -O1 и выше.
-
-ftree-bit-ccp -
Выполнить прокладку разреженных условных битовых констант по деревьям и распространить информацию о выравнивании указателей. Этот этап обработки выполняется только для локальных скалярных переменных и включен по умолчанию в -O1 и выше, за исключением -Og. Требуется включение -ftree-ccp.
-
-ftree-ccp -
Выполнить прокладку разреженных условных констант (CCP) по деревьям. Этот этап обработки выполняется только для локальных скалярных переменных и включен по умолчанию в -O1 и выше.
-
-fssa-backprop -
Распространить информацию об использовании значения по цепочке определения, чтобы упростить определения. Например, этот этап обработки удаляет операции со знаком, если знак значения никогда не имеет значения. Флаг включен по умолчанию в -O1 и выше.
-
-fssa-phiopt -
Выполнить сопоставление шаблонов с узлами SSA PHI для оптимизации условного кода. Этот этап обработки включен по умолчанию в -O1 и выше, за исключением -Og.
-
-ftree-switch-conversion -
Выполнить преобразование простых начальных значений в операторе switch в начальные значения из скалярного массива. Этот флаг включен по умолчанию в -O2 и выше.
-
-ftree-tail-merge -
Поиск идентичных последовательностей кода. При обнаружении заменить одну переходом на другую. Эта оптимизация известна как слияние хвостов или переходы через код. Этот флаг включен по умолчанию в -O2 и выше. Время компиляции на этом этапе можно ограничить, используя параметр max-tail-merge-comparisons и параметр max-tail-merge-iterations.
-
-ftree-dce -
Выполнить удаление мертвого кода (DCE) по деревьям. Этот флаг включен по умолчанию в -O1 и выше.
-
-ftree-builtin-call-dce -
Выполнить удаление условного мертвого кода (DCE) для вызовов встроенных функций, которые могут установить
errno, но в остальном не имеют побочных эффектов. Этот флаг включен по умолчанию в -O2 и выше, если также не указан -Os. -
-ffinite-loops -
Предполагать, что цикл с выходом в конечном итоге выполнит выход, а не будет циклиться бесконечно. Это позволяет компилятору удалять циклы, которые в противном случае не имеют побочных эффектов, не рассматривая возможность бесконечного цикла как такового.
Этот параметр включен по умолчанию в -O2 для C++ со стандартной библиотекой -std=c++11 или выше.
-
-ftree-dominator-opts -
Выполнить различные простые скалярные очистки (прокладка констант/копий, устранение избыточности, прокладка диапазонов и упрощение выражений) на основе обхода дерева доминаторов. Также выполняется сквозное связывание прыжков (для уменьшения прыжков в прыжки). Этот флаг включен по умолчанию в -O1 и выше.
-
-ftree-dse -
Выполнить удаление мертвых сохранений (DSE) по деревьям. Мертвое сохранение — это сохранение в местоположение памяти, которое позже перезаписывается другим сохранением без промежуточных загрузок. В этом случае более раннее сохранение может быть удалено. Этот флаг включен по умолчанию в -O1 и выше.
-
-ftree-ch -
Выполнить копирование заголовка цикла по деревьям. Это выгодно, поскольку увеличивает эффективность оптимизаций перемещения кода. Это также экономит один переход. Этот флаг включен по умолчанию в -O1 и выше. Он не включен для -Os, так как обычно увеличивает размер кода.
-
-ftree-loop-optimize -
Выполнить оптимизации циклов по деревьям. Этот флаг включен по умолчанию в -O1 и выше.
-
-ftree-loop-linear -floop-strip-mine-floop-block-
Выполнить оптимизации вложенных циклов. То же, что -floop-nest-optimize. Для использования этого преобразования кода GCC необходимо сконфигурировать с --with-isl для включения инфраструктуры преобразования циклов Graphite.
-
-fgraphite-identity -
Включить тождественное преобразование для графита. Для каждого SCoP мы генерируем полиэдральное представление и преобразуем его обратно в gimple. Используя -fgraphite-identity, мы можем проверить затраты или выгоды преобразования GIMPLE -> GRAPHITE -> GIMPLE. Некоторые минимальные оптимизации также выполняются генератором кода isl, такие как разделение индексов и удаление мертвого кода в циклах.
-
-floop-nest-optimize -
Включить оптимизатор вложенных циклов на основе isl. Это универсальный оптимизатор вложенных циклов, основанный на алгоритмах оптимизации Pluto. Он рассчитывает структуру цикла, оптимизированную для локальности данных и параллелизма. Этот параметр экспериментальный.
-
-floop-parallelize-all -
Использовать анализ зависимостей данных Graphite для определения циклов, которые можно распараллелить. Распараллелить все циклы, которые можно проанализировать, не содержащие циклических зависимостей, не проверяя, выгодно ли распараллеливать циклы.
-
-ftree-coalesce-vars
-
При преобразовании программы из представления SSA, постарайтесь уменьшить копирование, объединяя версии различных пользовательских переменных, а не только временных переменных компилятора. Это может сильно ограничить возможность отладки оптимизированной программы, скомпилированной с помощью -fno-var-tracking-assignments. В отрицательной форме этот флаг предотвращает объединение SSA пользовательских переменных. Этот параметр включен по умолчанию, если включена оптимизация, и в противном случае он практически никак не влияет.
-
-ftree-loop-if-convert -
Попытайтесь преобразовать условные переходы во внутренних циклах в эквиваленты без ветвлений. Цель заключается в удалении потока управления из внутренних циклов, чтобы улучшить способность этапа векторизации обрабатывать эти циклы. Это включено по умолчанию, если включена векторизация.
-
-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
Этот флаг включён по умолчанию при -O3. Он также включён при -fprofile-use и -fauto-profile.
-
-ftree-loop-distribute-patterns -
Выполнить распределение циклов для шаблонов, которые могут быть сгенерированы кодом с вызовами библиотеки. Этот флаг включён по умолчанию при -O2 и выше, а также при -fprofile-use и -fauto-profile.
Этот этап распределяет циклы инициализации и генерирует вызов 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.
-
-floop-interchange -
Выполнить перестановку циклов за пределами графики. Этот флаг может улучшить производительность кэша для вложенных циклов и позволит дальнейшие оптимизации циклов, такие как векторизация. Например, цикл
for (int i = 0; i < N; i++) for (int j = 0; j < N; j++) for (int k = 0; k < N; k++) c[i][j] = c[i][j] + a[i][k]*b[k][j];преобразуется в
for (int i = 0; i < N; i++) for (int k = 0; k < N; k++) for (int j = 0; j < N; j++) c[i][j] = c[i][j] + a[i][k]*b[k][j];Этот флаг включен по умолчанию при -O3. Он также включён при -fprofile-use и -fauto-profile.
-
-floop-unroll-and-jam -
Применить преобразования развертывания и сжатия для подходящих циклов. В вложенном цикле это развертывает внешний цикл на некоторый множитель и объединяет полученные несколько внутренних циклов. Этот флаг включён по умолчанию при -O3. Он также включён при -fprofile-use и -fauto-profile.
-
-ftree-loop-im -
Выполнить перемещение инвариантных частей циклов по деревьям. Этот этап перемещает только инварианты, которые сложно обработать на уровне RTL (вызовы функций, операции, которые расширяются до нетривиальных последовательностей insns). С -funswitch-loops он также перемещает операнды условных выражений, которые инвариантны, из цикла, так что мы можем использовать только тривиальный анализ инвариантности при разбиении циклов.
-
-ftree-loop-ivcanon -
Создать стандартный счётчик для числа итераций в циклах, для определения числа итераций которых требуется сложный анализ. Более поздние оптимизации могут легко определить это число. Особенно полезно в сочетании с развертыванием.
-
-ftree-scev-cprop -
Выполнить замену конечных значений. Если переменная изменяется в цикле таким образом, что её значение при выходе из цикла может быть определено только с использованием её начального значения и числа итераций цикла, заменить использование конечного значения таким вычислением, если оно достаточно дешёвое. Это уменьшает зависимости данных и может позволить дальнейшие упрощения. Включен по умолчанию при -O1 и выше.
-
-fivopts -
Выполнить оптимизации переменных индукции (снижение силы, слияние переменных индукции и удаление переменных индукции) по деревьям.
-
-ftree-parallelize-loops=n -
Распараллелить циклы, т.е. разделить их пространство итераций для выполнения в n потоках. Это возможно только для циклов, итерации которых независимы и могут быть произвольно переупорядочены. Оптимизация выгодна только на многопроцессорных машинах, для циклов, которые являются CPU-ёмкими, а не ограниченными, например, пропускной способностью памяти. Этот параметр подразумевает -pthread и, следовательно, поддерживается только на целевых платформах, которые поддерживают -pthread.
-
-ftree-pta -
Выполнить локальный анализ указателей функций по деревьям. Этот параметр включён по умолчанию при -O1 и выше, за исключением -Og.
-
-ftree-sra -
Выполнить скалярную замену агрегатов. Этот этап заменяет ссылки на структуры скалярами, чтобы предотвратить слишком раннее размещение структур в памяти. Этот параметр включён по умолчанию при -O1 и выше, за исключением -Og.
-
-fstore-merging -
Выполнить слияние узких хранилищ по последовательным адресам памяти. Этот этап объединяет смежные хранилища немедленных значений, более узких, чем слово, в несколько более широких хранилищ, чтобы уменьшить количество инструкций. Это включено по умолчанию при -O2 и выше, а также при -Os.
-
-ftree-ter -
Выполнить замену временных выражений во время фазы SSA->нормальная. Временные переменные с одним использованием/определением заменяются в месте использования их определяющим выражением. Это приводит к коду, не являющемуся GIMPLE, но даёт расширителям гораздо более сложные деревья для работы, что приводит к лучшему генерированию RTL. Включено по умолчанию при -O1 и выше.
-
-ftree-slsr -
Выполнить прямую силу снижения по деревьям. Это распознаёт связанные выражения, включающие умножения, и заменяет их менее затратными вычислениями, когда это возможно. Включено по умолчанию при -O1 и выше.
-
-ftree-vectorize -
Выполнить векторизацию по деревьям. Этот флаг включает -ftree-loop-vectorize и -ftree-slp-vectorize, если они не указаны явно.
-
-ftree-loop-vectorize -
Выполнить векторизацию циклов по деревьям. Этот флаг включен по умолчанию при -O2 и при -ftree-vectorize, -fprofile-use и -fauto-profile.
-
-ftree-slp-vectorize -
Выполнить векторизацию основных блоков по деревьям. Этот флаг включен по умолчанию при -O2 и при -ftree-vectorize, -fprofile-use и -fauto-profile.
-
-ftrivial-auto-var-init=choice -
Инициализировать автоматические переменные либо шаблоном, либо нулями, чтобы повысить безопасность и предсказуемость программы, предотвращая раскрытие и использование неинициализированной памяти. GCC всё ещё считает автоматическую переменную, у которой нет явной инициализации, неинициализированной, -Wuninitialized и -Wanalyzer-use-of-uninitialized-value всё ещё будут сообщать предупреждающие сообщения об таких автоматических переменных, и компилятор выполнит оптимизацию так, как если бы переменная была неинициализированной. С этим параметром GCC также будет инициализировать любой отступ автоматических переменных, которые имеют типы структуры или объединения, нулями. Однако текущая реализация не может инициализировать автоматические переменные, которые объявлены между управляющим выражением и первой ветвью оператора
switch. Используя -Wtrivial-auto-var-init, чтобы сообщить обо всех таких случаях.Три значения choice:
- ‘uninitialized’ не инициализирует автоматические переменные. Это по умолчанию для C и C++.
- ‘pattern’ Инициализировать автоматические переменные значениями, которые, скорее всего, превратят логические ошибки в сбои, легко распознаются в дампе сбоя и не являются значениями, на которых программисты могут полагаться для полезной семантики программы. Текущее значение - это повторяющийся по байтам шаблон с байтом "0xFE". Значения, используемые для инициализации шаблона, могут быть изменены в будущем.
- ‘zero’ Инициализировать автоматические переменные нулями.
По умолчанию «uninitialized».
Обратите внимание, что значения инициализатора, будь то ‘zero’ или ‘pattern’, относятся к представлению данных (в памяти или машинных регистрах), а не к их интерпретации как числовых значений. Это различие может быть важным в языках, которые поддерживают типы с смещениями или неявными множителями, и с такими расширениями, как ‘hardbool» (см. Указание атрибутов типов). Например, переменная, которая использует 8 бит для представления (смещённых) величин в
range 160..400, будет инициализирована битовыми шаблонами0x00или0xFE, в зависимости от choice, независимо от того, представляют ли эти представления значения в этом диапазоне, и даже если они это делают, интерпретация значения, хранимого в переменной, будет зависеть от смещения. Переменная «hardbool», которая использует, скажем,0X5Aи0xA5дляfalseиtrue, соответственно, будет сообщать об ошибке с любым «choice» тривиальной инициализации, т.е. инициализация «zero» не преобразуется в представление дляfalse, даже если бы это было для переменнойstaticтого же типа. Это означает, что шаблон инициализатора в общем случае не зависит от типа инициализируемой переменной. Одно важное исключение заключается в том, что (неусиленные) булевы переменные, которые помещаются в регистры, инициализируются сfalse(нуль), даже когда запрашивается ‘pattern’.Вы можете контролировать это поведение для определённой переменной, используя атрибут переменной
uninitialized(см. Указание атрибутов переменных). -
-fvect-cost-model=model
-
Изменить модель затрат, используемую для векторизации. Аргумент model должен быть одним из: ‘unlimited’, ‘dynamic’, ‘cheap’ или ‘very-cheap’. С моделью ‘unlimited’ предполагается, что векторизированный код-путь будет выгодным, в то время как с моделью ‘dynamic’ в момент выполнения выполняется проверка, которая активирует векторизированный код-путь только для количества итераций, которые, скорее всего, будут выполняться быстрее, чем исходный скалярный цикл. Модель ‘cheap’ отключает векторизацию циклов, где это будет невыгодно, например, из-за необходимых проверок в момент выполнения для зависимости данных или выравнивания, но в остальном эквивалентна модели ‘dynamic’. Модель ‘very-cheap’ позволяет векторизацию только в том случае, если векторизированный код полностью заменит скалярный код, который векторизуется. Например, если каждая итерация векторизованного цикла может обработать ровно четыре итерации скалярного цикла, модель ‘very-cheap’ позволит векторизацию только в том случае, если количество итераций скалярного цикла известно как кратное четырём.
По умолчанию модель затрат зависит от других флагов оптимизации и может быть ‘dynamic’ или ‘cheap’.
-
-fsimd-cost-model=model -
Изменить модель затрат, используемую для векторизации циклов, помеченных директивой OpenMP simd. Аргумент model должен быть одним из ‘unlimited’, ‘dynamic’, ‘cheap’. Все значения model имеют то же значение, что и описано в -fvect-cost-model, и по умолчанию используется модель затрат, определённая с помощью -fvect-cost-model.
-
-ftree-vrp -
Выполнить распространение диапазона значений для деревьев. Это аналогично проходу распространения констант, но вместо значений распространяются диапазоны значений. Это позволяет оптимизаторам удалять ненужные проверки диапазона, такие как проверки границ массива и проверки на нулевой указатель. Это включено по умолчанию при -O2 и выше. Удаление проверок на нулевой указатель выполняется только при включении -fdelete-null-pointer-checks.
-
-fsplit-paths -
Разделить пути, ведущие к обратным ветвям цикла. Это может улучшить удаление мёртвого кода и удаление общих подвыражений. Это включено по умолчанию при -O3 и выше.
-
-fsplit-ivs-in-unroller -
Включает выражение значений индексных переменных в последующих итерациях развернутого цикла с использованием значения в первой итерации. Это разрывает длинные цепочки зависимостей, тем самым повышая эффективность проходов планирования.
Сочетание -fweb и CSE часто достаточно для получения того же эффекта. Однако это не надёжно в случаях, когда тело цикла сложнее одного базового блока. Также это вообще не работает на некоторых архитектурах из-за ограничений в проходе CSE.
Эта оптимизация включена по умолчанию.
-
-fvariable-expansion-in-unroller -
С этим параметром компилятор создаёт несколько копий некоторых локальных переменных при развёртывании цикла, что может привести к более эффективному коду.
Эта оптимизация включена по умолчанию для целей PowerPC, но отключена по умолчанию в противном случае.
-
-fpartial-inlining -
Встроить части функций. Этот параметр имеет эффект только тогда, когда само встраивание включено параметрами -finline-functions или -finline-small-functions.
Включено на уровнях -O2, -O3, -Os.
-
-fpredictive-commoning -
Выполнить оптимизацию предсказательного общего вычисления, то есть повторного использования вычислений (особенно загрузки и сохранения памяти), выполненных в предыдущих итерациях циклов.
Этот параметр включен на уровне -O3. Он также включен параметрами -fprofile-use и -fauto-profile.
-
-fprefetch-loop-arrays -
Если поддерживается целевой машиной, генерировать инструкции для предварительной выборки памяти для повышения производительности циклов, которые обращаются к большим массивам.
Этот параметр может сгенерировать более эффективный или менее эффективный код; результаты сильно зависят от структуры циклов в исходном коде.
Отключено на уровне -Os.
-
-fno-printf-return-value -
Не подставлять константы для известных значений возврата функций форматированного вывода, таких как
sprintf,snprintf,vsprintf, иvsnprintf(но неprintfотfprintf). Эта трансформация позволяет GCC оптимизировать или даже устранить ветви, основанные на известном значении возврата этих функций, вызываемых с аргументами, которые являются либо константами, либо значения которых известны в диапазоне, что делает возможным определение точного значения возврата. Например, когда -fprintf-return-value активен, как ветвь, так и тело оператораif(но не вызовsnprint) могут быть оптимизированы, когдаiявляется 32-разрядным или меньшим целым числом, так как значение возврата гарантированно не превышает 8.char buf[9]; if (snprintf (buf, "%08x", i) >= sizeof buf) …
Параметр -fprintf-return-value полагается на другие оптимизации и даёт лучшие результаты при -O2 и выше. Он работает совместно с параметрами -Wformat-overflow и -Wformat-truncation. Параметр -fprintf-return-value включён по умолчанию.
-
-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были легче понятны.Также можно задать ожидаемую вероятность выражения с помощью встроенной функции
__builtin_expect_with_probability.По умолчанию включено -fguess-branch-probability на уровнях -O, -O2, -O3, -Os.
-
-freorder-blocks -
Переупорядочить базовые блоки в скомпилированной функции, чтобы уменьшить количество взятых ветвей и улучшить локальность кода.
Включено на уровнях -O1, -O2, -O3, -Os.
-
-freorder-blocks-algorithm=algorithm -
Использовать указанный алгоритм для переупорядочивания базовых блоков. Аргумент algorithm может быть ‘simple’, что не увеличивает размер кода (за исключением случаев, когда это иногда происходит из-за вторичных эффектов, таких как выравнивание), или ‘stc’, алгоритм «кеш трассы программного обеспечения», который пытается поместить весь часто выполняемый код вместе, минимизируя количество выполняемых ветвлений, создавая дополнительные копии кода.
По умолчанию используется ‘simple’ на уровнях -O1, -Os, и ‘stc’ на уровнях -O2, -O3.
-
-freorder-blocks-and-partition -
В дополнение к переупорядочиванию базовых блоков в скомпилированной функции для уменьшения количества взятых ветвей, разделяет горячие и холодные базовые блоки на отдельные секции в ассемблерных и .o файлах для улучшения производительности кэширования и страничной загрузки.
Эта оптимизация автоматически отключается при наличии обработки исключений или таблиц разматывания (на целях, использующих setjump/longjump или целевой схеме), для секций linkonce, для функций с атрибутом пользовательской секции и на любой архитектуре, которая не поддерживает именованные секции. Когда используется -fsplit-stack, этот параметр по умолчанию отключён (чтобы избежать ошибок линковщика), но может быть включён явно (если используется совместимый линковщик).
Включено для x86 на уровнях -O2, -O3, -Os.
-
-freorder-functions -
Переупорядочить функции в объектном файле для улучшения локализации кода. Это реализовано с помощью специальных подсекций
.text.hotдля наиболее часто выполняемых функций и.text.unlikelyдля функций, которые выполняются редко. Переупорядочивание выполняется линковщиком, поэтому формат объектного файла должен поддерживать именованные секции, и линковщик должен поместить их разумным образом.Этот параметр неэффективен, если вы не предоставите обратную связь по профилю (см. -fprofile-arcs для получения подробностей) или не аннотируете функции вручную с помощью атрибутов
hotилиcold(см. Общие атрибуты функций).Включено на уровнях -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; }Практика чтения из другого члена объединения, отличного от того, который был последним записанным (называемая «type-punning»), является распространённой. Даже с -fstrict-aliasing, type-punning разрешена, при условии, что к памяти обращаются через тип объединения. Таким образом, приведенный выше код работает как ожидается. См. Структуры, объединения, перечисления и битовые поля. Однако, этот код может не работать:
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.
-
-fipa-strict-aliasing -
Управляет применением правил -fstrict-aliasing через границы функций. Обратите внимание, что если несколько функций встраиваются в одну функцию, обращения к памяти больше не считаются пересекающими границу функции.
Опция -fipa-strict-aliasing включена по умолчанию и эффективна только в сочетании с -fstrict-aliasing.
-
-falign-functions -falign-functions=n-falign-functions=n:m-falign-functions=n:m:n2-falign-functions=n:m:n2:m2-
Выравнивает начало функций по следующей степени двойки, большей или равной n, пропуская до m-1 байт. Это гарантирует, что по крайней мере первые m байт функции могут быть получены процессором без пересечения границы выравнивания на n байт. Это оптимизация производительности кода, и выравнивание игнорируется для функций, считающихся «холодными». Если выравнивание требуется для всех функций, используйте -fmin-function-alignment.
Если m не указан, он по умолчанию равен n.
Примеры: -falign-functions=32 выравнивает функции по следующей 32-байтовой границе, -falign-functions=24 выравнивает по следующей 32-байтовой границе только если это можно сделать, пропустив 23 байта или меньше, -falign-functions=32:7 выравнивает по следующей 32-байтовой границе только если это можно сделать, пропустив 6 байт или меньше.
Вторая пара значений n2:m2 позволяет указать вторичное выравнивание: -falign-functions=64:7:32:3 выравнивает по следующей 64-байтовой границе, если это можно сделать, пропустив 6 байт или меньше, иначе выравнивает по следующей 32-байтовой границе, если это можно сделать, пропустив 2 байта или меньше. Если m2 не указан, он по умолчанию равен n2.
Некоторые ассемблеры поддерживают этот флаг только когда n является степенью двойки; в этом случае он округляется вверх.
-fno-align-functions и -falign-functions=1 эквивалентны и означают, что функции не выравниваются.
Если n не указан или равен нулю, используется зависящая от машины по умолчанию. Максимальное допустимое значение опции n равно 65536.
Включено на уровнях -O2, -O3.
-flimit-function-alignment-
Если эта опция включена, компилятор пытается избежать излишнего выравнивания функций. Он пытается указать ассемблеру выровнять по указанному -falign-functions значению, но не пропустить больше байт, чем размер функции.
-
-falign-labels -falign-labels=n-falign-labels=n:m-falign-labels=n:m:n2-falign-labels=n:m:n2:m2-
Выравнивает все цели ветвлений по границе, являющейся степенью двойки.
Параметры этой опции аналогичны параметрам опции -falign-functions. -fno-align-labels и -falign-labels=1 эквивалентны и означают, что метки не выравниваются.
Если -falign-loops или -falign-jumps применимы и больше этого значения, то используется их значение.
Если n не указан или равен нулю, используется зависящая от машины по умолчанию, которая, скорее всего, будет ‘1’, что означает отсутствие выравнивания. Максимальное допустимое значение опции n равно 65536.
Включено на уровнях -O2, -O3.
-
-falign-loops -falign-loops=n-falign-loops=n:m-falign-loops=n:m:n2-falign-loops=n:m:n2:m2-
Выравнивает циклы по границе, являющейся степенью двойки. Если циклы выполняются многократно, это компенсирует любые выполнение фиктивных инструкций заполнения. Это оптимизация производительности кода, и выравнивание игнорируется для циклов, считающихся «холодными».
Если -falign-labels больше этого значения, то используется его значение.
Параметры этой опции аналогичны параметрам опции -falign-functions. -fno-align-loops и -falign-loops=1 эквивалентны и означают, что циклы не выравниваются. Максимальное допустимое значение опции n равно 65536.
Если n не указан или равен нулю, используется зависящая от машины по умолчанию.
Включено на уровнях -O2, -O3.
-
-falign-jumps -falign-jumps=n-falign-jumps=n:m-falign-jumps=n:m:n2-falign-jumps=n:m:n2:m2-
Выравнивает цели ветвлений по границе, являющейся степенью двойки, для целей ветвлений, которые могут быть достигнуты только с помощью переходов. В этом случае не нужно выполнять какие-либо фиктивные операции. Это оптимизация производительности кода, и выравнивание игнорируется для переходов, считающихся «холодными».
Если -falign-labels больше этого значения, то используется его значение.
Параметры этой опции аналогичны параметрам опции -falign-functions. -fno-align-jumps и -falign-jumps=1 эквивалентны и означают, что циклы не выравниваются.
Если n не указан или равен нулю, используется зависящая от машины по умолчанию. Максимальное допустимое значение опции n равно 65536.
Включено на уровнях -O2, -O3.
-
-fmin-function-alignment -
Указывает минимальное выравнивание функций по следующей степени двойки, большей или равной n. В отличие от -falign-functions, это выравнивание применяется ко всем функциям (даже тем, которые считаются «холодными»). Выравнивание также не зависит от -flimit-function-alignment.
-
-fno-allocation-dce -
Не удалять неиспользуемые выделения памяти C++ в оптимизации удаления неиспользуемого кода.
-
-fallow-store-data-races -
Разрешить компилятору выполнять оптимизации, которые могут вводить новые гонки данных при сохранении, не доказывая, что переменная не может быть одновременно обращена к ней другими потоками. Не влияет на оптимизацию локальных данных. Можно безопасно использовать эту опцию, если известно, что к глобальным данным не будет обращаться несколько потоков.
Примеры оптимизаций, включённых -fallow-store-data-races, включают поднятие вверх или преобразование if-выражений, которые могут привести к тому, что значение, которое уже находилось в памяти, будет перезаписано этим же значением. Такая перезапись безопасна в однопоточном контексте, но может быть небезопасной в многопоточном контексте. Обратите внимание, что на некоторых процессорах преобразование if-выражений может быть необходимо для включения векторизации.
Включено на уровне -Ofast.
-
-funit-at-a-time -
Эта опция сохранена по соображениям совместимости. -funit-at-a-time не имеет эффекта, в то время как -fno-unit-at-a-time подразумевает -fno-toplevel-reorder и -fno-section-anchors.
Включено по умолчанию.
-
-fno-toplevel-reorder -
Не переупорядочивать функции верхнего уровня, переменные и
asmоператоры. Выводить их в том же порядке, что и в исходном файле. При использовании этой опции не удаляются неиспользуемые статические переменные. Эта опция предназначена для поддержки существующего кода, который полагается на определённый порядок. Для нового кода лучше использовать атрибуты, когда это возможно.-ftoplevel-reorder является значением по умолчанию для -O1 и выше, а также для -O0, если -fsection-anchors явно запрошено. Кроме того, -fno-toplevel-reorder подразумевает -fno-section-anchors.
-
-funreachable-traps -
С этой опцией компилятор преобразует вызовы
__builtin_unreachableв ловушки вместо их использования для оптимизации. Это также влияет на любые такие вызовы, неявно сгенерированные компилятором.Эта опция имеет тот же эффект, что и -fsanitize=unreachable -fsanitize-trap=unreachable, но не влияет на значения этих опций. Если -fsanitize=unreachable включена, эта опция игнорируется.
Эта опция включена по умолчанию для -O0 и -Og.
-
-fweb -
Строит веб-страницы, как обычно используются для целей распределения регистров, и назначает каждому веб-сайту индивидуальный псевдорегистр. Это позволяет проходу распределения регистров работать непосредственно с псевдонимами, но также укрепляет несколько других проходов оптимизации, таких как CSE, оптимизатор циклов и удалитель тривиальных «мертвых» кодов. Однако это может сделать отладку невозможной, так как переменные больше не остаются в «домашнем регистре».
Включено по умолчанию с -funroll-loops.
-
-fwhole-program
-
Предполагается, что текущий компиляционный блок представляет собой весь компилируемый программу. Все общедоступные функции и переменные за исключением
mainи тех, которые объединены атрибутомexternally_visible, становятся статическими функциями и, по сути, оптимизируются более агрессивно межпроцедурными оптимизаторами.С -flto эта опция имеет ограниченное применение. В большинстве случаев точный список символов, используемых или экспортируемых из двоичного файла, известен, информация о разрешении, переданная оптимизатору времени компоновки плагином компоновщика. Она всё ещё полезна, если плагин компоновщика не используется или во время инкрементного шага компоновки, когда генерируется окончательный код (с -flto -flinker-output=nolto-rel).
-
-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. Вы всегда можете переопределить автоматическое решение выполнить оптимизацию на этапе компоновки, передав -fno-lto команде компоновки.
Для повышения эффективности оптимизации всего программы необходимо сделать определённые предположения. Компилятор должен знать, к каким функциям и переменным могут получить доступ библиотеки и среда выполнения за пределами оптимизируемого блока на этапе компоновки. При поддержке компоновщиком, плагин компоновщика (см. -fuse-linker-plugin) передаёт информацию о используемых и внешне видимых символах в компилятор. В случае отсутствия плагина компоновщика, -fwhole-program следует использовать для того, чтобы позволить компилятору сделать эти предположения, что приводит к более агрессивным решениям оптимизации.
Когда файл компилируется с -flto без -fuse-linker-plugin, сгенерированный объектный файл больше, чем обычный объектный файл, потому что он содержит байткоды GIMPLE и обычный конечный код (см. -ffat-lto-objects). Это означает, что объектные файлы с информацией LTO могут быть скомпонованы как обычные объектные файлы; если -fno-lto передаётся компоновщику, никакие межпроцедурные оптимизации не применяются. Обратите внимание, что при включённом -fno-fat-lto-objects этап компиляции быстрее, но вы не можете выполнить обычную, не LTO, компоновку на них.
При создании конечного двоичного файла GCC применяет оптимизацию на этапе компоновки только к тем файлам, которые содержат байткод. Таким образом, вы можете смешивать и сопоставлять объектные файлы и библиотеки с байткодами GIMPLE и конечным объектным кодом. GCC автоматически выбирает, какие файлы оптимизировать в режиме LTO, а какие скомпоновать без дополнительной обработки.
В общем случае, параметры, указанные на этапе компоновки, переопределяют те, которые указаны на этапе компиляции, хотя в некоторых случаях GCC пытается вывести параметры компоновки из настроек, используемых для компиляции входных файлов.
Если вы не указываете параметр уровня оптимизации -O на этапе компоновки, то GCC использует наивысший уровень оптимизации, использованный при компиляции объектных файлов. Обратите внимание, что в целом неэффективно указывать параметр уровня оптимизации только на этапе компоновки, а не на этапе компиляции, по двум причинам. Во-первых, компиляция без оптимизации подавляет этапы компилятора, которые собирают информацию, необходимую для эффективной оптимизации на этапе компоновки. Во-вторых, некоторые ранние этапы оптимизации могут выполняться только на этапе компиляции, а не на этапе компоновки.
Существуют некоторые флаги генерации кода, сохраняемые GCC при генерации байткодов, поскольку они должны использоваться во время окончательной компоновки. В настоящее время следующие параметры и их значения берутся из первого объектного файла, который их явно указывает: -fcommon, -fexceptions, -fnon-call-exceptions, -fgnu-tm и все целевые флаги -m.
Следующие параметры -fPIC, -fpic, -fpie и -fPIE объединяются в соответствии со следующей схемой:
-fPIC + -fpic = -fpic -fPIC + -fno-pic = -fno-pic -fpic/-fPIC + (no option) = (no option) -fPIC + -fPIE = -fPIE -fpic + -fPIE = -fpie -fPIC/-fpic + -fpie = -fpie
Некоторые флаги, изменяющие 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. Вы можете переопределить их на этапе компоновки.
Параметры диагностики, такие как -Wstringop-overflow, передаются на этап компоновки, и их значение соответствует значению на этапе компиляции на уровне функций. Обратите внимание, что это имеет значение только для диагностических сообщений, выводимых во время оптимизации. Обратите внимание, что преобразования кода, такие как встраивание, могут привести к включению или отключению предупреждений для областей, если код не соответствует значению на этапе компиляции.
Когда вам нужно передать параметры ассемблеру через -Wa или -Xassembler, убедитесь, что вы либо скомпилировали такие трансляционные единицы с -fno-lto, либо последовательно использовали те же параметры ассемблера во всех трансляционных единицах. Вы также можете указать параметры ассемблера на этапе компоновки LTO.
Для включения генерации отладочной информации необходимо предоставить -g на этапе компиляции. Если любой из входных файлов на этапе компоновки был скомпилирован с включённой генерацией отладочной информации, то компоновка также включит генерацию отладочной информации. Любые сложные настройки отладочной информации, такие как уровень DWARF -gdwarf-5, необходимо явно повторять в командной строке компоновщика, и смешивание различных настроек в различных трансляционных единицах не рекомендуется.
Если 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.
Оптимизация на этапе компоновки работает некорректно с генерацией отладочной информации на системах, отличных от тех, которые используют комбинацию ELF и DWARF.
Если вы укажете необязательный n, оптимизация и генерация кода на этапе компоновки выполняются параллельно с использованием n параллельных задач с помощью установленной
makeпрограммы. Переменная средыMAKEможет использоваться для переопределения программы.
Вы также можете указать -flto=jobserver, чтобы использовать режим сервера задач GNU make для определения количества параллельных задач. Это полезно, когда Makefile, вызывающий GCC, уже выполняется параллельно. Для этого необходимо добавить префикс ‘+’ к рецепту команды в родительском Makefile. Эта опция, вероятно, будет работать только если
MAKEявляется GNU make. Даже без значения опции GCC пытается автоматически обнаружить сервер задач работающего GNU make.Используйте -flto=auto, чтобы использовать сервер задач GNU make, если он доступен, или в противном случае вернуться к автоматическому определению количества потоков процессора, присутствующих в вашей системе.
-
-flto-partition=alg -
Укажите алгоритм разбиения, используемый оптимизатором на этапе линковки. Значение может быть ‘1to1’ для указания разбиения, отражающего исходные файлы, или ‘balanced’ для указания разбиения на чанки одинакового размера (по возможности) или ‘max’ для создания нового раздела для каждого символа, где это возможно. Указание ‘none’ в качестве алгоритма полностью отключает разбиение и потоковую передачу. Значение по умолчанию — ‘balanced’. Хотя ‘1to1’ может быть использовано как обходной путь для различных проблем с упорядочиванием кода, разбиение ‘max’ предназначено только для внутреннего тестирования. Значение ‘one’ указывает, что должно использоваться ровно один раздел, а значение ‘none’ обходит разбиение и выполняет шаг оптимизации на этапе линковки непосредственно из фазы WPA.
-
-flto-compression-level=n -
Эта опция задаёт уровень сжатия, используемый для промежуточного языка, записанного в файлы объектов LTO, и имеет смысл только в сочетании с режимом LTO (-flto). GCC в настоящее время поддерживает два алгоритма сжатия LTO. Для zstd допустимые значения — от 0 (без сжатия) до 19 (максимальное сжатие), а zlib поддерживает значения от 0 до 9. Значения вне этого диапазона обрезаются до минимального или максимального из поддерживаемых значений. Если опция не задана, используется значение сжатия по умолчанию с балансировкой.
-
-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оболочки для передачи правильных опций этим инструментам. С нежирными файлами LTO makefiles нужно изменить, чтобы использовать их.Обратите внимание, что современные инструменты binutils предоставляют механизм автоматической загрузки плагинов. Установка плагина линковщика в $libdir/bfd-plugins имеет тот же эффект, что и использование оболочек команд (
gcc-ar,gcc-nmиgcc-ranlib).По умолчанию используется -fno-fat-lto-objects на целевых системах с поддержкой плагинов линковщика.
-
-fcompare-elim -
После выделения регистров и разделения инструкций после выделения регистров, идентифицировать арифметические инструкции, вычисляющие флаги процессора, аналогичные операциям сравнения, основанные на этой арифметике. Если это возможно, устраните явную операцию сравнения.
Этот этап применим только к определённым целевым системам, которые не могут явно представить операцию сравнения до завершения выделения регистров.
Включено на уровнях -O1, -O2, -O3, -Os.
-
-ffold-mem-offsets -fno-fold-mem-offsets-
Попытаться устранить инструкции add путём их сворачивания в загрузках/сохранениях в памяти.
Включено на уровнях -O2, -O3.
-
-fcprop-registers -
После выделения регистров и разделения инструкций после выделения регистров выполните проход по копированию, чтобы попытаться уменьшить зависимости планирования и иногда устранить копирование.
Включено на уровнях -O1, -O2, -O3, -Os.
-
-fprofile-correction -
Профили, собранные с использованием инструментированного двоичного файла для многопоточных программ, могут быть несовместимы из-за пропущенных обновлений счётчиков. При указании этой опции GCC использует эвристику для исправления или сглаживания таких несоответствий. По умолчанию GCC выводит сообщение об ошибке при обнаружении несовместимого профиля.
Эта опция включена с -fauto-profile.
-
-fprofile-partial-training -
С
-fprofile-useвсе части программ, не выполненные во время тренировки, агрессивно оптимизируются по размеру, а не по скорости. В некоторых случаях непрактично тренировать все возможные горячие пути в программе. (Например, программа может содержать функции, специфичные для данного оборудования, и обучение может не охватить все конфигурации оборудования, на которых запускается программа.) С-fprofile-partial-trainingобратная связь профиля будет проигнорирована для всех функций, не выполненных во время тренировки, что приведёт к оптимизации так, как если бы они были скомпилированы без обратной связи профиля. Это приводит к лучшему быстродействию, когда тренировка не является репрезентативной, но также приводит к значительно большему коду. -
-fprofile-use -fprofile-use=path-
Включить оптимизации с обратной связью профиля, а также следующие оптимизации, многие из которых обычно выгодны только с доступной обратной связью профиля:
-fbranch-probabilities -fprofile-values -funroll-loops -fpeel-loops -ftracer -fvpt -finline-functions -fipa-cp -fipa-cp-clone -fipa-bit-cp -fpredictive-commoning -fsplit-loops -funswitch-loops -fgcse-after-reload -ftree-loop-vectorize -ftree-slp-vectorize -fvect-cost-model=dynamic -ftree-loop-distribute-patterns -fprofile-reorder-functions
Прежде чем использовать эту опцию, необходимо сначала сгенерировать информацию о профилировании. См. Параметры инструментации программ для получения информации об опции -fprofile-generate.
По умолчанию GCC выводит сообщение об ошибке, если профили обратной связи не соответствуют исходному коду. Эту ошибку можно преобразовать в предупреждение, используя -Wno-error=coverage-mismatch. Обратите внимание, что это может привести к плохо оптимизированному коду. Кроме того, по умолчанию GCC также выводит предупреждение, если профили обратной связи отсутствуют (см. -Wmissing-profile).
Если указан путь, GCC ищет файлы данных профиля обратной связи по пути. См. -fprofile-dir.
-
-fauto-profile -fauto-profile=path-
Включить оптимизации с обратной связью, основанные на выборке, а также следующие оптимизации, многие из которых обычно выгодны только с доступной обратной связью профиля:
-fbranch-probabilities -fprofile-values -funroll-loops -fpeel-loops -ftracer -fvpt -finline-functions -fipa-cp -fipa-cp-clone -fipa-bit-cp -fpredictive-commoning -fsplit-loops -funswitch-loops -fgcse-after-reload -ftree-loop-vectorize -ftree-slp-vectorize -fvect-cost-model=dynamic -ftree-loop-distribute-patterns -fprofile-correction
путь — имя файла, содержащего информацию о профиле AutoFDO. Если он опущен, по умолчанию используется fbdata.afdo в текущем каталоге.
Для создания файла данных профиля AutoFDO необходимо запустить вашу программу с помощью утилиты
perfна поддерживаемой системе GNU/Linux. Более подробную информацию см. на https://perf.wiki.kernel.org/.Например:
perf record -e br_inst_retired:near_taken -b -o perf.data \ -- your_programЗатем используйте инструмент
create_gcovдля преобразования исходных данных профиля в формат, который можно использовать в GCC. Вы также должны предоставить неснятую двоичную программу для вашей программы этому инструменту. См. https://github.com/google/autofdo.Например:
create_gcov --binary=your_program.unstripped --profile=perf.data \ --gcov=profile.afdo
Следующие параметры контролируют поведение компилятора относительно арифметики с плавающей запятой. Эти параметры меняют скорость и точность. Все они должны быть специально включены.
-
-ffloat-store -
Не хранить переменные с плавающей запятой в регистрах и запретить другие параметры, которые могут изменить способ получения значения с плавающей запятой из регистра или памяти.
Этот параметр предотвращает нежелательное избыточное представление точности на машинах, таких как 68000, где плавающие регистры (68881) сохраняют большую точность, чем предполагается для
double. Аналогично для архитектуры x86. Для большинства программ избыточная точность приносит только пользу, но некоторые программы полагаются на точное определение IEEE-плавающей запятой. Используйте -ffloat-store для таких программ после изменения их для сохранения всех значимых промежуточных вычислений в переменные. -
-fexcess-precision=style -
Этот параметр позволяет более точно управлять избыточной точностью на машинах, где операции с плавающей запятой выполняются в формате с большей точностью или диапазоном, чем стандарт IEEE, и обмена типами с плавающей запятой. По умолчанию используется -fexcess-precision=fast; это означает, что операции могут выполняться с большей точностью, чем указанные типы в исходном коде, если это приведет к более быстрому коду, и трудно предсказать, когда выполняется округление до типов, указанных в исходном коде. При компиляции C или C++, если указано -fexcess-precision=standard, то избыточная точность соответствует правилам, указанным в ISO C99 или C++; в частности, как приведения типов, так и присваивания вызывают округление значений до их семантических типов (в то время как -ffloat-store влияет только на присваивания). Этот параметр включён по умолчанию для C или C++ при использовании строгого параметра соответствия, такого как -std=c99 или -std=c++17. -ffast-math включает -fexcess-precision=fast по умолчанию независимо от того, используется ли параметр строгого соответствия. Если указано -fexcess-precision=16, константы и результаты выражений с типами
_Float16и__bf16вычисляются без избыточной точности.-fexcess-precision=standard не реализован для языков, отличных от C или C++. На 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 и -fexcess-precision=fast.
Этот параметр определяет макрос препроцессора
__FAST_MATH__.Этот параметр не включается никаким параметром -O, кроме -Ofast, так как он может привести к неправильному выводу для программ, зависящих от точного реализации IEEE или ISO правил/спецификаций для математических функций. Однако для программ, не требующих гарантий этих спецификаций, это может дать более быстрый код.
-
-fno-math-errno -
Не устанавливать
errnoпосле вызова математических функций, которые выполняются с помощью одной инструкции, например,sqrt. Программа, которая полагается на IEEE-исключения для обработки ошибок математики, может использовать этот флаг для ускорения при сохранении совместимости с арифметикой IEEE.Этот параметр не включается никаким параметром -O, так как он может привести к неправильному выводу для программ, зависящих от точного реализации IEEE или ISO правил/спецификаций для математических функций. Однако для программ, не требующих гарантий этих спецификаций, это может дать более быстрый код.
По умолчанию стоит -fmath-errno.
В системах Darwin математическая библиотека никогда не устанавливает
errno. Поэтому нет причин для компилятора учитывать возможность этого, и -fno-math-errno является значением по умолчанию. -
-funsafe-math-optimizations -
Разрешить оптимизации для арифметики с плавающей запятой, которые (a) предполагают, что аргументы и результаты действительны, и (b) могут нарушать стандарты 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.
Будущие версии GCC могут предоставить более точный контроль над этой настройкой с помощью директивы C99
FENV_ACCESS. Этот параметр командной строки будет использоваться вместе с -frounding-math для задания начального состоянияFENV_ACCESS. -
-frounding-math -
Отключить преобразования и оптимизации, которые предполагают стандартное поведение округления с плавающей запятой. Это округление до нуля для всех преобразований чисел с плавающей запятой в целые числа и округление до ближайшего для всех других арифметических усечений. Этот параметр должен быть указан для программ, которые динамически изменяют режим округления FP или которые могут выполняться с режимом округления, отличным от стандартного. Этот параметр отключает свёртку констант выражений с плавающей запятой во время компиляции (которая может зависеть от режима округления) и арифметические преобразования, которые небезопасны при наличии режимов округления, зависящих от знака.
По умолчанию стоит -fno-rounding-math.
Этот параметр экспериментальный и в настоящее время не гарантирует отключение всех оптимизаций GCC, которые зависят от режима округления. Будущие версии GCC могут предоставить более точный контроль над этой настройкой с помощью директивы C99
FENV_ACCESS. Этот параметр командной строки будет использоваться вместе с -ftrapping-math для задания начального состоянияFENV_ACCESS. -
-fsignaling-nans -
Компилировать код, предполагая, что IEEE сигнализирующие NaN могут генерировать видимые пользователю ловушки во время операций с плавающей запятой. Установка этого параметра отключает оптимизации, которые могут изменить количество исключений, видимых с сигнализирующими NaN. Этот параметр подразумевает -ftrapping-math.
Этот параметр определяет макрос препроцессора
__SUPPORT_SNAN__.По умолчанию стоит -fno-signaling-nans.
Этот параметр экспериментальный и в настоящее время не гарантирует отключение всех оптимизаций GCC, которые влияют на поведение сигнализирующих NaN.
-
-fno-fp-int-builtin-inexact
-
Не разрешать встроенным функциям
ceil,floor,roundиtrunc, а также их вариантамfloatиlong double, генерировать код, который вызывает исключение «неточно» для аргументов, не являющихся целыми числами. ISO C99 и C11 разрешают этим функциям вызывать исключение «неточно», но ISO/IEC TS 18661-1:2014, интерфейсы C для IEEE 754-2008, интегрированные в ISO C23, не позволяют этим функциям это делать.По умолчанию используется -ffp-int-builtin-inexact, что разрешает вызывать исключение, если не выбран стандарт C23 или более поздний. Этот параметр ни на что не влияет, если не включен -ftrapping-math.
Даже если используется -fno-fp-int-builtin-inexact, если функции генерируют вызов библиотечной функции, исключение «неточно» может быть вызвано, если реализация библиотеки не соответствует TS 18661.
-
-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 (см. Параметры инструментации программы), её можно повторно скомпилировать с помощью -fbranch-probabilities, чтобы улучшить оптимизацию, учитывая количество проходов по каждому ответвлению. Когда программа, скомпилированная с -fprofile-arcs, завершается, она сохраняет счётчики выполнения дуг в файл, называемый sourcename.gcda для каждого исходного файла. Информация в этом файле сильно зависит от структуры сгенерированного кода, поэтому для обеих компиляций необходимо использовать один и тот же исходный код и те же параметры оптимизации. Подробнее о наименовании файлов см. в -fprofile-arcs.
С помощью -fbranch-probabilities, GCC помещает заметку ‘REG_BR_PROB’ на каждом ‘JUMP_INSN’ и ‘CALL_INSN’. Это можно использовать для улучшения оптимизации. В настоящее время они используются только в одном месте: в reorg.cc, вместо того, чтобы угадывать, по какой ветви ответвления вероятнее всего пройдёт выполнение, значения ‘REG_BR_PROB’ используются для точного определения того, по какой ветви выполнение происходит чаще.
Включается с помощью -fprofile-use и -fauto-profile.
-
-fprofile-values -
Если комбинировать с -fprofile-arcs, добавляет код для сбора данных о значениях выражений в программе.
С помощью -fbranch-probabilities считывает собранные данные о профилировании значений выражений для использования в оптимизациях.
Включается с помощью -fprofile-generate, -fprofile-use и -fauto-profile.
-
-fprofile-reorder-functions -
Переупорядочивание функций на основе профилирования инструментации собирает первое время выполнения функции и упорядочивает эти функции в порядке возрастания.
Включается с помощью -fprofile-use.
-
-fvpt -
Если используется вместе с -fprofile-arcs, этот параметр сообщает компилятору добавить код для сбора информации о значениях выражений.
При использовании с -fbranch-probabilities, он считывает собранные данные и фактически выполняет оптимизацию на их основе. В настоящее время оптимизации включают специализацию операций деления с использованием знаний о значении знаменателя.
Включается с помощью -fprofile-use и -fauto-profile.
-
-frename-registers -
Попытка избежать ложных зависимостей в запланированном коде, используя освободившиеся регистры после распределения регистров. Эта оптимизация наиболее полезна для процессоров с большим количеством регистров. Однако в зависимости от формата отладочной информации, принятой целевым процессором, она может сделать отладку невозможной, так как переменные больше не хранятся в «домашнем регистре».
Включается по умолчанию с -funroll-loops.
-
-fschedule-fusion -
Выполняет целезависимую обработку потока команд для планирования инструкций одного типа вместе, потому что целевой процессор может выполнять их более эффективно, если они расположены рядом друг с другом в потоке инструкций.
Включается на уровнях -O2, -O3, -Os.
-
-ftracer -
Выполняет дублирование хвоста для увеличения размера суперблока. Эта трансформация упрощает поток управления функцией, позволяя другим оптимизациям работать лучше.
Включается с помощью -fprofile-use и -fauto-profile.
-
-funroll-loops -
Развертывание циклов, количество итераций которых может быть определено во время компиляции или при входе в цикл. -funroll-loops подразумевает -frerun-cse-after-loop, -fweb и -frename-registers. Также включает полное удаление циклов (то есть полное удаление циклов с малым постоянным числом итераций). Этот параметр увеличивает размер кода и может или не может ускорить его выполнение.
Включается с помощью -fprofile-use и -fauto-profile.
-
-funroll-all-loops -
Развертывает все циклы, даже если их количество итераций неопределённо при входе в цикл. Обычно это замедляет работу программ. -funroll-all-loops подразумевает те же параметры, что и -funroll-loops.
-
-fpeel-loops -
Удаляет циклы, для которых есть достаточно информации, что они не многократно прокручиваются (из обратной связи профилирования или статического анализа). Также включает полное удаление циклов (то есть полное удаление циклов с малым постоянным числом итераций).
Включается с помощью -O3, -fprofile-use и -fauto-profile.
-
-fmove-loop-invariants -
Включает проход движения инвариантных циклов в оптимизаторе циклов RTL. Включается на уровне -O1 и выше, за исключением -Og.
-
-fmove-loop-stores -
Включает проход движения сохранений инвариантных данных в оптимизаторе циклов GIMPLE. Это перемещает инвариантные сохранения после конца цикла в обмен на хранение сохранённого значения в регистре на протяжении итерации. Для того, чтобы этот параметр имел эффект, необходимо также включить -ftree-loop-im. Включается на уровне -O1 и выше, за исключением -Og.
-
-fsplit-loops -
Разбивает цикл на два, если он содержит условие, которое всегда истинно для одной стороны области итераций и ложно для другой.
Включается с помощью -fprofile-use и -fauto-profile.
-
-funswitch-loops -
Перемещает ветвления с условиями инвариантными для цикла за пределы цикла с дубликатами цикла на обеих ветвях (изменённых в соответствии с результатом условия).
Включается с помощью -fprofile-use и -fauto-profile.
-
-fversion-loops-for-strides -
Если цикл итерируется по массиву с переменным шагом, создайте другую версию цикла, которая предполагает, что шаг всегда равен единице. Например:
for (int i = 0; i < n; ++i) x[i * stride] = …;
становится:
if (stride == 1) for (int i = 0; i < n; ++i) x[i] = …; else for (int i = 0; i < n; ++i) x[i * stride] = …;Это особенно полезно для массивов с предполагаемой формой в Fortran, где (например) это позволяет улучшить векторизацию, предполагая непрерывный доступ. Этот флаг включён по умолчанию при -O3. Он также включён с помощью -fprofile-use и -fauto-profile.
-
-ffunction-sections -fdata-sections-
Если целевой формат поддерживает произвольные секции, помещает каждую функцию или элемент данных в свою собственную секцию в выходном файле. Имя функции или имя элемента данных определяет имя секции в выходном файле.
Используйте эти параметры на системах, где компоновщик может выполнять оптимизации для улучшения локализации в адресном пространстве инструкций. Большинство систем, использующих формат объектов ELF, имеют компоновщики с такими оптимизациями. В AIX компоновщик переупорядочивает секции (CSECTs) на основе графа вызовов. Влияние на производительность различно.
Вместе с сборкой мусора компоновщика (параметр компоновщика --gc-sections) эти параметры могут привести к уменьшению размера статически связанных исполняемых файлов (после удаления ненужных данных).
В системах ELF/DWARF эти параметры не ухудшают качество отладочной информации. Могут быть проблемы с другими форматами файлов объектов/отладочной информации.
Используйте эти параметры только тогда, когда есть значительные преимущества. При использовании этих параметров ассемблер и компоновщик создают более крупные файлы объектов и исполняемых файлов, а также работают медленнее. Эти параметры влияют на генерацию кода. Они препятствуют оптимизации компилятором и ассемблером, использующими относительные позиции внутри единицы трансляции, поскольку позиции неизвестны до времени компоновки. Примером такой оптимизации является смягчение вызовов короткими вызовами.
-
-fstdarg-opt -
Оптимизирует пролог функций с переменным числом аргументов относительно использования этих аргументов.
-
-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]; }Не все целевые платформы поддерживают этот параметр.
-
-fzero-call-used-regs=choice -
Обнуление регистров, используемых при вызове функций, при возвращении из функции для повышения безопасности программы путём смягчения атак Return-Oriented Programming (ROP) или предотвращения утечки информации через регистры.
Возможные значения choice такие же, как и для атрибута
zero_call_used_regs(см. Определение атрибутов функций). По умолчанию — ‘skip’.Вы можете управлять этим поведением для определённой функции, используя атрибут функции
zero_call_used_regs(см. Определение атрибутов функций). -
--param name=value -
В некоторых местах GCC использует различные константы для управления объёмом выполняемой оптимизации. Например, GCC не встраивает функции, содержащие более определённого количества инструкций. Вы можете контролировать некоторые из этих констант в командной строке с помощью параметра --param.
Названия конкретных параметров и значения их значений связаны с внутренним устройством компилятора и могут быть изменены без предварительного уведомления в будущих версиях.
Для получения минимальных, максимальных и значений по умолчанию параметра используйте параметры --help=param -Q.
В каждом случае value — это целое число. Для всех целевых платформ распознаются следующие варианты name:
predictable-branch-outcome-
Если ветвь прогнозируется как взятая с вероятностью ниже этого порога (в процентах), то она считается хорошо предсказуемой.
max-rtl-if-conversion-insns-
Преобразование if-команд RTL пытается удалить условные ветвления вокруг блока и заменить их условно выполняемыми инструкциями. Этот параметр задаёт максимальное количество инструкций в блоке, которые следует рассматривать для преобразования if. Компилятор также будет использовать другие эвристики для определения того, вероятно ли, что преобразование if будет выгодным.
max-rtl-if-conversion-predictable-cost-
Преобразование if-команд RTL попытается удалить условные ветвления вокруг блока и заменить их условно выполняемыми инструкциями. Эти параметры задают максимальную допустимую стоимость последовательности, которая будет сгенерирована преобразованием if, в зависимости от того, статически ли ветвление определяется как предсказуемое или нет. Единицы для этого параметра такие же, как и для метрики seq_cost в GCC. Компилятор попытается предоставить разумное значение по умолчанию для этого параметра, используя макрос BRANCH_COST целевой системы.
max-crossjump-edges-
Максимальное количество входящих рёбер, которые следует учитывать для межблочных переходов. Алгоритм, используемый с параметром -fcrossjumping, имеет сложность O(N^2) относительно числа входящих рёбер в каждый блок. Большие значения означают более агрессивную оптимизацию, что приводит к увеличению времени компиляции, вероятно, с небольшим улучшением размера исполняемого файла.
min-crossjump-insns-
Минимальное количество инструкций, которое должно совпадать в конце двух блоков перед выполнением межблочного перехода. Это значение игнорируется в случае, если все инструкции в блоке, из которого выполняется межблочный переход, совпадают.
max-grow-copy-bb-insns-
Максимальный коэффициент увеличения размера кода при копировании базовых блоков вместо выполнения перехода. Увеличение относительно инструкции перехода.
max-goto-duplication-insns-
Максимальное количество инструкций для дублирования в блок, который выполняет переход к вычисленному переходу. Чтобы избежать поведения O(N^2) в ряде проходов, GCC вычисляет переходы на ранней стадии компиляции и отменяет их на максимально поздней стадии. Только вычисленные переходы в конце базовых блоков с не более чем max-goto-duplication-insns инструкциями отменяются.
max-delay-slot-insn-search-
Максимальное количество инструкций для рассмотрения при поиске инструкции для заполнения слота отложенного выполнения. Если выполняется поиск более этого условного количества инструкций, экономия времени от заполнения слота отложенного выполнения минимальна, поэтому поиск прекращается. Большие значения означают более агрессивную оптимизацию, что приводит к увеличению времени компиляции, вероятно, с небольшим улучшением времени выполнения.
max-delay-slot-live-search-
При попытке заполнения слотов отложенного выполнения максимальное количество инструкций для рассмотрения при поиске блока с действительной информацией о регистре с данными. Увеличение этого условно выбранного значения означает более агрессивную оптимизацию, увеличивающую время компиляции. Этот параметр следует удалить при переписывании кода слота отложенного выполнения для сохранения графа потока управления.
max-gcse-memory-
Приблизительный максимальный объём памяти в
kB, который может быть выделен для выполнения оптимизации глобального удаления общих подвыражений. Если требуется больше памяти, чем указано, оптимизация не выполняется. max-gcse-insertion-ratio-
Если отношение вставленных выражений к удалённым выражениям для любого выражения больше этого значения, то RTL PRE вставляет или удаляет выражение, оставляя частично избыточные вычисления в потоке инструкций.
max-pending-list-length-
Максимальное количество ожидающих зависимостей, которые планировщик разрешает, прежде чем очистить текущее состояние и начать заново. Крупные функции с небольшим количеством ветвлений или вызовов могут создавать чрезмерно большие списки, бесполезно потребляющие память и ресурсы.
max-modulo-backtrack-attempts-
Максимальное количество попыток отката, которые планировщик должен выполнить при модульном планировании цикла. Большие значения могут экспоненциально увеличить время компиляции.
max-inline-functions-called-once-loop-depth-
Максимальная глубина цикла вызова, рассматриваемая эвристикой встраивания, которая пытается встроить все функции, вызываемые один раз.
max-inline-functions-called-once-insns-
Максимальный оценочный размер функций, созданных при встраивании функций, вызываемых один раз.
max-inline-insns-single-
Несколько параметров контролируют используемый в GCC инлайнер дерева. Это число устанавливает максимальное количество инструкций (подсчитанных во внутренней форме представления GCC) в одной функции, которую инлайнер дерева рассматривает для встраивания. Это касается только функций, объявленных inline, и методов, реализованных в объявлении класса (C++).
max-inline-insns-auto-
Когда используется параметр -finline-functions (включён в -O3), много функций, которые в противном случае не рассматривались бы компилятором для встраивания, исследуются. Для этих функций может применяться другой (более жёсткий) предел по сравнению с функциями, объявленными inline (--param max-inline-insns-auto).
max-inline-insns-small-
Это ограничение применяется к вызовам, которые считаются релевантными с параметром -finline-small-functions.
max-inline-insns-size-
Это ограничение применяется к вызовам, которые оптимизируются для размера. Небольшое увеличение может быть желательно для прогнозирования возможностей оптимизации, открываемых встраиванием.
uninlined-function-insns-
Количество инструкций, учтённых инлайнером для накладных расходов функции, таких как пролог и эпилог функции.
uninlined-function-time-
Дополнительное время, учтённое инлайнером для накладных расходов функции, такое как время, необходимое для выполнения пролога и эпилога функции.
inline-heuristics-hint-percent-
Масштаб (в процентах), применяемый к inline-insns-single, inline-insns-single-O2, inline-insns-auto, когда эвристика инлайна указывает на то, что встраивание очень выгодно (это позволит включить последующие оптимизации).
uninlined-thunk-insnsuninlined-thunk-time-
То же, что --param uninlined-function-insns и --param uninlined-function-time, но применяется к функциям-заглушкам.
inline-min-speedup-
Если оценочное улучшение производительности времени выполнения вызывающей + вызываемой функции превышает этот порог (в процентах), функция может быть встроена независимо от предела --param max-inline-insns-single и --param max-inline-insns-auto.
large-function-insns-
Предел, определяющий очень большие функции. Для функций, больших чем этот предел после встраивания, встраивание ограничено параметром --param large-function-growth. Этот параметр полезен в основном для предотвращения чрезмерного времени компиляции, вызванного нелинейными алгоритмами, используемыми в бэкэнде.
large-function-growth-
Указывает максимальное увеличение размера большой функции из-за встраивания в процентах. Например, значение параметра 100 ограничивает увеличение большой функции до 2,0 раз первоначального размера.
large-unit-insns-
Предел, определяющий большой трансляционный блок. Увеличение, вызванное встраиванием блоков, больших чем этот предел, ограничено параметром --param inline-unit-growth. Для небольших блоков это может быть слишком жёстко. Например, рассмотрите блок, состоящий из функции A, которая встраивается, и B, которая просто трижды вызывает A. Если B мала по сравнению с A, увеличение блока составляет 300 %, но такое встраивание вполне разумно. Однако для очень больших блоков, состоящих из малых встраиваемых функций, необходим общий предел увеличения размера блока, чтобы избежать экспоненциального взрыва размера кода. Таким образом, для меньших блоков размер увеличивается до --param large-unit-insns перед применением --param inline-unit-growth.
lazy-modules-
Максимальное количество одновременно открытых файлов модулей C++ при ленивой загрузке.
inline-unit-growth-
Указывает максимальное общее увеличение трансляционного блока из-за встраивания. Например, значение параметра 20 ограничивает увеличение блока до 1,2 раза первоначального размера. Холодные функции (отмеченные как холодные через атрибут или по результатам профилирования) не учитываются в размере блока.
ipa-cp-unit-growth-
Указывает максимальное общее увеличение трансляционного блока из-за межпроцедурной константной пропаганды. Например, значение параметра 10 ограничивает увеличение блока до 1,1 раза первоначального размера.
ipa-cp-large-unit-insns-
Размер трансляционного блока, который проход IPA-CP считает большим.
large-stack-frame-
Предел, определяющий большие стековые фреймы. При встраивании алгоритм старается не слишком увеличивать этот предел.
large-stack-frame-growth-
Указывает максимальное увеличение больших стековых фреймов из-за встраивания в процентах. Например, значение параметра 1000 ограничивает увеличение больших стековых фреймов до 11 раз первоначального размера.
max-inline-insns-recursivemax-inline-insns-recursive-auto-
Указывает максимальное количество инструкций, до которых может увеличиться внестрочная копия саморекурсивной встраиваемой функции путём рекурсивного встраивания.
--param max-inline-insns-recursive применяется к объявленным inline функциям. Для функций, не объявленных inline, рекурсивное встраивание происходит только при включённом параметре -finline-functions (включён в -O3); вместо этого применяется --param max-inline-insns-recursive-auto.
max-inline-recursive-depthmax-inline-recursive-depth-auto-
Указывает максимальную глубину рекурсии, используемую для рекурсивного встраивания.
--param max-inline-recursive-depth применяется к объявленным inline функциям. Для функций, не объявленных inline, рекурсивное встраивание происходит только при включённом параметре -finline-functions (включён в -O3); вместо этого применяется --param max-inline-recursive-depth-auto.
min-inline-recursive-probability-
Рекурсивное встраивание выгодно только для функций с высокой средней рекурсией и может навредить функциям с небольшой глубиной рекурсии, увеличивая размер пролога или сложность тела функции для других оптимизаторов.
Если доступны результаты профилирования (см. -fprofile-generate), можно предположить фактическую глубину рекурсии из вероятности того, что функция рекурсивно вызывается через данное выражение вызова. Этот параметр ограничивает встраивание только выражениями вызова, вероятность которых превышает указанный порог (в процентах).
early-inlining-insns-
Указывает увеличение, которое может сделать ранний инлайнер. По сути, это увеличивает объём встраивания для кода с большой стоимостью абстракции.
max-early-inliner-iterations
-
Предел итераций раннего инлайнера. Это в основном ограничивает количество вложенных косвенных вызовов, которые может разрешить ранний инлайнер. Более глубокие цепочки всё ещё обрабатываются поздним инлайнингом.
comdat-sharing-probability-
Вероятность (в процентах), что функция C++ inline с видимость comdat будут совместно использоваться в нескольких модулях компиляции.
modref-max-basesmodref-max-refsmodref-max-accesses-
Указывает максимальное количество базовых указателей, ссылок и обращений, хранимых для одной функции анализатором mod/ref.
modref-max-tests-
Указывает максимальное количество тестов, которые может выполнить oracle алиасов, чтобы разобрать местоположения памяти с использованием информации mod/ref. Этот параметр должен быть больше, чем --param modref-max-bases и --param modref-max-refs.
modref-max-depth-
Указывает максимальную глубину обхода DFS, используемого анализом modref escape. Установка в 0 полностью отключает анализ.
modref-max-escape-points-
Указывает максимальное количество точек выхода, отслеживаемых modref на имя SSA.
modref-max-adjustments-
Указывает максимальное значение, на которое увеличивается диапазон доступа при анализе потока данных modref.
profile-func-internal-id-
Параметр, контролирующий использование внутреннего идентификатора функции при поиске в базе профилей. Если значение равно 0, компилятор использует идентификатор, основанный на имени ассемблера функции и имени файла, что делает старые профили более устойчивыми к изменениям исходного кода, таким как переупорядочивание функций и т.д.
min-vect-loop-bound-
Минимальное количество итераций, при котором циклы не векторизуются при использовании -ftree-vectorize. Количество итераций после векторизации должно быть больше значения, заданного этим параметром, для разрешения векторизации.
gcse-cost-distance-ratio-
Множитель масштабирования при расчёте максимального расстояния, на которое выражение может быть перемещено оптимизациями GCSE. В настоящее время это поддерживается только в проходе подъёма кода. Чем больше коэффициент, тем более агрессивным является подъём кода для простых выражений, т.е. для выражений, стоимость которых меньше gcse-unrestricted-cost. Установка в 0 отключает подъём простых выражений.
gcse-unrestricted-cost-
Стоимость, приблизительно измеряемая как стоимость одной типичной машинной инструкции, при которой оптимизации GCSE не ограничивают расстояние, которое может пройти выражение. В настоящее время это поддерживается только в проходе подъёма кода. Чем меньше стоимость, тем более агрессивным является подъём кода. Установка в 0 позволяет всем выражениям перемещаться на неограниченные расстояния.
max-hoist-depth-
Глубина поиска в дереве доминаторов для подъёма выражений. Это используется для предотвращения квадратичного поведения в алгоритме подъёма. Значение 0 не ограничивает поиск, но может замедлить компиляцию больших функций.
max-tail-merge-comparisons-
Максимальное количество похожих блоков базовых инструкций (BB) для сравнения BB. Используется для предотвращения квадратичного поведения в слиянии хвостов дерева.
max-tail-merge-iterations-
Максимальное количество итераций прохода по функции. Используется для ограничения времени компиляции при слиянии хвостов дерева.
store-merging-allow-unaligned-
Разрешить проходу слияния хранений вводить невыровненные хранилища, если это законно.
max-stores-to-merge-
Максимальное количество хранений, которые нужно попытаться слить в более широкие хранилища в проходе слияния хранений.
max-store-chains-to-track-
Максимальное количество цепочек хранений, которые необходимо отслеживать одновременно при попытке объединить их в более широкие хранилища в проходе слияния хранений.
max-stores-to-track-
Максимальное количество хранений, которые нужно отслеживать одновременно при попытке объединить их в более широкие хранилища в проходе слияния хранений.
max-unrolled-insns-
Максимальное количество инструкций, которое может иметь цикл для его развёртывания. Если цикл развёртывается, этот параметр также определяет, сколько раз код цикла развёртывается.
max-average-unrolled-insns-
Максимальное количество инструкций, взвешенных вероятностями их выполнения, которые может иметь цикл для его развёртывания. Если цикл развёртывается, этот параметр также определяет, сколько раз код цикла развёртывается.
max-unroll-times-
Максимальное количество развёртываний одного цикла.
max-peeled-insns-
Максимальное количество инструкций, которое может иметь цикл для его обрезания (peeled). Если цикл обрезается, этот параметр также определяет, сколько раз код цикла обрезается.
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-depth-
Максимальная глубина вложенных циклов для переключения.
lim-expensive-
Минимальная стоимость дорогостоящего выражения в движении инвариантов цикла.
min-loop-cond-split-prob-
Когда доступна информация о профиле FDO, min-loop-cond-split-prob задаёт минимальный порог вероятности для условия полуинвариантного оператора, чтобы вызвать разделение цикла.
iv-consider-all-candidates-bound-
Ограничение на количество кандидатов для индукционных переменных, ниже которого все кандидаты рассматриваются для каждого использования в оптимизациях индукционных переменных. Если кандидатов больше, чем это, рассматриваются только самые релевантные, чтобы избежать квадратичной временной сложности.
iv-max-considered-uses-
Оптимизации индукционных переменных отказываются от циклов, которые содержат больше используемых индукционных переменных.
iv-always-prune-cand-set-bound-
Если количество кандидатов в наборе меньше этого значения, всегда пытайтесь удалить ненужные индукционные переменные из набора при добавлении новой.
avg-loop-niter-
Среднее количество итераций цикла.
dse-max-object-size-
Максимальный размер (в байтах) объектов, отслеживаемых байтово ликвидацией мёртвых хранилищ. Более большие значения могут привести к более длительному времени компиляции.
dse-max-alias-queries-per-store-
Максимальное количество запросов к oracle алиасов на хранение. Большие значения приводят к увеличению времени компиляции и могут привести к большему удалению мёртвых хранилищ.
scev-max-expr-size-
Ограничение на размер выражений, используемых в анализаторе скалярных эволюций. Крупные выражения замедляют анализатор.
scev-max-expr-complexity-
Ограничение на сложность выражений в анализаторе скалярных эволюций. Сложные выражения замедляют анализатор.
max-tree-if-conversion-phi-args-
Максимальное количество аргументов в PHI, поддерживаемое TREE при преобразовании, если цикл не помечен псевдонимом simd.
vect-max-layout-candidates-
Максимальное количество возможных схем векторов (таких как перестановки), которые следует учитывать при оптимизации кода, который будет векторизован.
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-fraction-
Знаменатель n дроби 1/n максимального количества исполнений базового блока во всей программе, которое должен иметь базовый блок как минимум, чтобы считаться горячим. По умолчанию 10000, что означает, что базовый блок считается горячим, если его количество исполнений больше, чем 1/10000 от максимального количества исполнений. 0 означает, что он никогда не считается горячим. Используется в режиме без LTO.
hot-bb-count-ws-permille-
Количество самых часто исполняемых промилле, от 0 до 1000, профилированных исполнений всей программы, к которым количество исполнений базового блока должно относиться, чтобы считаться горячим. По умолчанию 990, что означает, что базовый блок считается горячим, если его количество исполнений составляет более 990 промилле или 99.0% профилированного выполнения всей программы. 0 означает, что он никогда не считается горячим. Используется в режиме LTO.
hot-bb-frequency-fraction-
Знаменатель n дроби 1/n частоты исполнения начального блока функции, которую базовый блок этой функции должен иметь как минимум, чтобы считаться горячим. По умолчанию 1000, что означает, что базовый блок считается горячим в функции, если он исполняется чаще, чем 1/1000 от частоты начального блока функции. 0 означает, что он никогда не считается горячим.
unlikely-bb-count-fraction-
Знаменатель n дроби 1/n количества профилированных запусков всей программы, ниже которого количество исполнений базового блока должно быть, чтобы базовый блок считался маловероятным для исполнения. По умолчанию 20, что означает, что базовый блок считается маловероятным для исполнения, если он исполняется меньше, чем 1/20 или 5% запусков программы. 0 означает, что он всегда считается маловероятным для исполнения.
max-predicted-iterations-
Максимальное количество итераций цикла, которое мы предсказываем статически. Это полезно в случаях, когда функция содержит один цикл с известным пределом и другой цикл с неизвестным пределом. Известное количество итераций предсказывается правильно, а неизвестное количество итераций в среднем составляет примерно 10. Это означает, что цикл без пределов выглядит искусственно холодным по сравнению с другим.
builtin-expect-probability-
Управляет вероятностью того, что выражение имеет указанное значение. Этот параметр принимает процент (т.е. 0...100) в качестве входных данных.
builtin-string-cmp-inline-length-
Максимальная длина строковой константы для вызова встроенной функции сравнения строк, подходящей для инлайнинга.
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-probabilitytracer-min-branch-probability-feedback-
Остановить прямой рост, если вероятность лучшего ребра ниже этого порога.
Аналогично параметру tracer-dynamic-coverage предоставлены два параметра. tracer-min-branch-probability-feedback используется для компиляции с обратной связью профиля, а tracer-min-branch-probability — для компиляции без нее. Значение для компиляции с обратной связью профиля должно быть более консервативным (высшим), чтобы сделать трассировщик эффективным.
stack-clash-protection-guard-size-
Укажите размер предоставленного операционной системой защитного стека как 2 в степени num байт. Более высокие значения могут уменьшить количество явных зондирований, но значение, большее, чем предоставленная операционной системой защита, сделает код уязвимым для атак типа столкновения стека.
stack-clash-protection-probe-interval-
Защита от столкновений стека включает в себя зондирование пространства стека по мере его выделения. Этот параметр управляет максимальным расстоянием между зондированиями в стеке как 2 в степени num байт. Более высокие значения могут уменьшить количество явных зондирований, но значение, большее, чем предоставленная операционной системой защита, сделает код уязвимым для атак типа столкновения стека.
max-cse-path-length-
Максимальное количество базовых блоков на пути, которые CSE рассматривает.
max-cse-insns-
Максимальное количество инструкций, которые обрабатывает CSE перед сбросом.
ggc-min-expand-
GCC использует сборщик мусора для управления собственным выделением памяти. Этот параметр задает минимальный процент, на который куча сборщика мусора должна быть разрешена для расширения между сборами. Настройка этого может улучшить скорость компиляции; это не влияет на генерацию кода.
Значение по умолчанию составляет 30% + 70% * (RAM/1 ГБ) с верхним пределом 100%, когда RAM >= 1 ГБ. Если доступен
getrlimit, понятие «RAM» — это минимальное значение между фактической RAM иRLIMIT_DATAилиRLIMIT_AS. Если GCC не может рассчитать RAM на конкретной платформе, используется нижний предел 30%. Установка этого параметра и ggc-min-heapsize в ноль вызывает полный сбор в любой момент. Это чрезвычайно медленно, но может быть полезно для отладки. ggc-min-heapsize-
Минимальный размер кучи сборщика мусора, прежде чем он начнет беспокоиться о сборе мусора. Первый сбор происходит после расширения кучи на ggc-min-expand% за пределами ggc-min-heapsize. Опять же, настройка этого может улучшить скорость компиляции, и это не влияет на генерацию кода.
Значение по умолчанию — это меньшее из RAM/8, RLIMIT_RSS или предел, который пытается гарантировать, что RLIMIT_DATA или RLIMIT_AS не превышены, но с нижним пределом 4096 (четыре мегабайта) и верхним пределом 131072 (128 мегабайт). Если GCC не может рассчитать RAM на конкретной платформе, используется нижний предел. Установка этого параметра очень большим значением фактически отключает сборщик мусора. Установка этого параметра и ggc-min-expand в ноль вызывает полный сбор в любой момент.
max-reload-search-insns-
Максимальное количество перезагрузки инструкций должно искать назад эквивалентный регистр. Увеличение значений означает более агрессивную оптимизацию, увеличивая время компиляции, вероятно, с немного лучшей производительностью.
max-cselib-memory-locations-
Максимальное количество ячеек памяти, которые cselib должен учитывать. Увеличение значений означает более агрессивную оптимизацию, увеличивая время компиляции, вероятно, с немного лучшей производительностью.
max-sched-ready-insns-
Максимальное количество инструкций, готовых к выдаче, которые планировщик должен учитывать в любой момент во время первого прохода планирования. Увеличение значений означает более тщательный поиск, увеличивая время компиляции, вероятно, с небольшим преимуществом.
max-sched-region-blocks-
Максимальное количество блоков в области, которые необходимо учитывать для межблочного планирования.
max-pipeline-region-blocks-
Максимальное количество блоков в области, которые необходимо учитывать для конвейеризации в селективном планировщике.
max-sched-region-insns-
Максимальное количество инструкций в области, которые необходимо учитывать для межблочного планирования.
max-pipeline-region-insns-
Максимальное количество инструкций в области, которые необходимо учитывать для конвейеризации в селективном планировщике.
min-spec-prob-
Минимальная вероятность (в процентах) достижения источника блока для межблочного спекулятивного планирования.
max-sched-extend-regions-iters-
Максимальное количество итераций по CFG для расширения областей. Значение 0 отключает расширение областей.
max-sched-insn-conflict-delay-
Максимальная задержка конфликта для инструкции, которая должна рассматриваться для спекулятивного перемещения.
sched-spec-prob-cutoff-
Минимальная вероятность успеха спекуляции (в процентах), так что спекулятивные инструкции планируются.
sched-state-edge-prob-cutoff-
Минимальная вероятность, которую должно иметь ребро, чтобы планировщик сохранял свое состояние через него.
sched-mem-true-dep-cost-
Минимальное расстояние (в циклах процессора) между операцией сохранения и загрузкой, нацеленными на одни и те же места в памяти.
selsched-max-lookahead-
Максимальный размер окна предварительного просмотра селективного планирования. Это глубина поиска доступных инструкций.
selsched-max-sched-times-
Максимальное количество раз, когда инструкция планируется во время селективного планирования. Это ограничение на количество итераций, через которые инструкция может быть конвейеризирована.
selsched-insns-to-rename-
Максимальное количество лучших инструкций в списке, готовых к рассмотрению для переименования в селективном планировщике.
sms-min-sc-
Минимальное значение количества стадий, которое генерирует планировщик модуля swing.
max-last-value-rtl-
Максимальный размер, измеренный как количество RTL, которые могут быть записаны в выражении в объединителе для псевдорегистра в качестве последнего известного значения этого регистра.
max-combine-insns-
Максимальное количество инструкций, которые объединитель RTL пытается объединить.
integer-share-limit-
Малые целочисленные константы могут использовать общую структуру данных, уменьшая использование памяти компилятором и увеличивая ее скорость. Это устанавливает максимальное значение общей целочисленной константы.
ssp-buffer-size-
Минимальный размер буферов (т. е. массивов), которые получают защиту от переполнения стека при использовании -fstack-protector.
min-size-for-stack-sharing-
Минимальный размер переменных, участвующих в совместном использовании слотов стека при отсутствии оптимизации.
max-jump-thread-duplication-stmts-
Максимальное количество операторов, разрешенных в блоке, который необходимо дублировать при потоковой передаче переходов.
max-jump-thread-paths-
Максимальное количество путей для рассмотрения при поиске возможностей потоковой передачи переходов. При попадании в блок входные ребра рассматриваются только в том случае, если количество путей, которые необходимо искать до сих пор, умноженное на количество входных ребер, не исчерпывает указанное максимальное количество путей для рассмотрения.
max-fields-for-field-sensitive-
Максимальное количество полей в структуре, обрабатываемой в полезависимом режиме во время анализа указателей.
prefetch-latency-
Оценка среднего количества инструкций, которые выполняются до завершения предварительной выборки. Расстояние предварительной выборки пропорционально этой константе. Увеличение этого числа может также привести к меньшему количеству потоков, подлежащих предварительной выборке (см. simultaneous-prefetches).
simultaneous-prefetches-
Максимальное количество предварительных выборок, которые могут выполняться одновременно.
l1-cache-line-size-
Размер строки кэша в кэше данных L1 в байтах.
l1-cache-size-
Размер кэша данных L1 в килобайтах.
l2-cache-size-
Размер кэша данных L2 в килобайтах.
prefetch-dynamic-strides-
Нужно ли проходу предварительной выборки массива цикла генерировать подсказки программной предварительной выборки для шагов, которые не являются константами. В некоторых случаях это может быть полезно, хотя тот факт, что шаг не является постоянным, может затруднить прогнозирование, когда очевидно есть выгода от выдачи этих подсказок.
Установите в 1, если подсказки предварительной выборки должны быть выданы для неконстантных шагов. Установите в 0, если подсказки предварительной выборки должны быть выданы только для шагов, которые известны как постоянные и меньше prefetch-minimum-stride.
prefetch-minimum-stride-
Минимальный постоянный шаг в байтах, чтобы начать использование подсказок предварительной выборки. Если шаг меньше этого порога, подсказки предварительной выборки не будут выданы.
Эта настройка полезна для процессоров, которые имеют аппаратные механизмы предварительной выборки, в которых могут возникать конфликты между аппаратными и программными механизмами предварительной выборки. Если аппаратные механизмы предварительной выборки имеют максимальный шаг, который они могут обработать, он должен быть использован здесь для улучшения использования программных механизмов предварительной выборки.
Значение -1 означает, что у нас нет порога, и поэтому подсказки предварительной выборки могут быть выданы для любого постоянного шага.
Эта настройка полезна только для шагов, которые известны и постоянны.
destructive-interference-sizeconstructive-interference-size
-
-
Значения для переменных C++17
std::hardware_destructive_interference_sizeиstd::hardware_constructive_interference_size. Размер деструктивного вмешательства — минимально рекомендуемый смещение между двумя независимыми объектами, обращение к которым происходит параллельно; размер конструктивного вмешательства — максимально рекомендуемый размер смежных участков памяти, к которым обращаются совместно. Обычно оба значения равны размеру строки кэша L1 для целевой платформы в байтах. Для универсальной целевой платформы, охватывающей диапазон размеров строк кэша L1, размер конструктивного вмешательства обычно соответствует меньшему значению в диапазоне, а размер деструктивного вмешательства — большему.Размер деструктивного вмешательства предназначен для размещения и, следовательно, оказывает влияние на ABI. Значение по умолчанию, скорее всего, не будет стабильным, и на некоторых платформах зависит от -mtune, поэтому использование этой переменной в контексте, где важна стабильность ABI, например, в публичном интерфейсе библиотеки, категорически не рекомендуется; если это необходимо, пользователи могут стабилизировать значение с помощью этого параметра.
Размер конструктивного вмешательства менее чувствителен, так как он обычно используется только в конструкции static_assert, чтобы убедиться, что тип помещается в строке кэша.
См. также -Winterference-size.
loop-interchange-max-num-stmts-
Максимальное количество инструкций в цикле, которые могут быть переставлены.
loop-interchange-stride-ratio-
Минимальное отношение между шагом двух циклов, чтобы перестановка была выгодной.
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 умноженное на количество ветвей в переключении.
max-partial-antic-length-
Максимальная длина частичного антимножества, вычисленного во время оптимизации частичной избыточности дерева (-ftree-pre) при оптимизации на уровне -O3 и выше. Для некоторых типов исходного кода оптимизация частичной избыточности может неограниченно расти, потребляя всю доступную память на хост-машине. Этот параметр устанавливает ограничение на длину вычисляемых множеств, что предотвращает подобное поведение. Установка значения 0 для этого параметра позволяет неограниченную длину множества.
rpo-vn-max-loop-depth-
Максимальная глубина цикла, которая оптимизируется с использованием нумерации значений. Когда достигается предел с наивнейшим нумерацией значений в самых внутренних циклах rpo-vn-max-loop-depth, и самым внешним циклом в цикле, а остальные нет.
sccvn-max-alias-queries-per-access-
Максимальное количество запросов оркула алиасов, которые выполняются при поиске избыточности загрузки и сохранения. Если этот предел достигнут, поиск прерывается, и загрузка или сохранение не считаются избыточными. Количество запросов алгоритмически ограничено количеством сохранений на всех путях от загрузки до входа в функцию.
ira-max-loops-num-
IRA по умолчанию использует региональную выделение регистров. Если функция содержит больше циклов, чем задано этим параметром, то только заданное количество наиболее часто выполняемых циклов образуют регионы для регионального выделения регистров.
ira-max-conflict-table-size-
Хотя IRA использует сложный алгоритм для сжатия таблицы конфликтов, таблица все равно может потребовать чрезмерного количества памяти для очень больших функций. Если таблица конфликтов для функции может превысить размер в МБ, заданный этим параметром, планировщик регистров вместо этого использует более быстрый, простой и менее качественный алгоритм, который не требует построения псевдотаблицы конфликтов регистров.
ira-loop-reserved-regs-
IRA может использоваться для оценки более точного давления на регистры в циклах для принятия решений о перемещении инвариантов циклов (см. -O3). Количество доступных регистров, зарезервированных для некоторых других целей, указано в этом параметре. Значение параметра по умолчанию — лучшее, найденное в результате многочисленных экспериментов.
ira-consider-dup-in-all-alts-
Заставляет IRA учитывать ограничение соответствия (дублированные номера операндов) в всех доступных альтернативах для предпочтительного класса регистров. Если значение равно нулю, это означает, что IRA учитывает ограничение соответствия только тогда, когда оно является единственной доступной альтернативой с соответствующим классом регистров. В противном случае это означает, что IRA проверит все доступные альтернативы для предпочтительного класса регистров, даже если он нашел подходящий вариант с соответствующим классом регистров и учел найденное квалифицированное ограничение соответствия.
ira-simple-lra-insn-threshold-
Приблизительное количество инструкций функции в 1К блоках, запускающих простое локальное выделение регистров.
lra-inheritance-ebb-probability-cutoff-
LRA пытается повторно использовать значения, загруженные в регистры, в последующих инструкциях. Эта оптимизация называется наследованием. EBB используется как область для выполнения этой оптимизации. Параметр определяет минимальную вероятность перехода без ветвления в процентах, используемую для добавления BB в EBB наследования в LRA. Значение по умолчанию было выбрано на основе многочисленных запусков SPEC2000 на x86-64.
loop-invariant-max-bbs-in-loop-
Перемещение инвариантов цикла может быть очень затратным, как во время компиляции, так и в объеме памяти, необходимой во время компиляции, с очень большими циклами. Циклы с количеством блоков больше, чем этот параметр, не будут подвергаться оптимизации перемещения инвариантов цикла.
loop-max-datarefs-for-datadeps-
Построение зависимостей данных дорогостояще для очень больших циклов. Этот параметр ограничивает количество ссылок на данные в циклах, которые учитываются для анализа зависимостей данных. Эти большие циклы не обрабатываются оптимизациями, использующими зависимости данных циклов.
max-vartrack-size-
Устанавливает максимальное количество слотов таблицы хеширования, используемых во время анализа потока данных отслеживания переменных для любой функции. Если этот предел превышен при включенном отслеживании переменных при присваиваниях, анализ для этой функции повторяется без него после удаления всех отладочных инструкций из функции. Если предел превышен даже без отладочных инструкций, анализ отслеживания переменных полностью отключается для функции. Установка параметра в ноль делает его неограниченным.
max-vartrack-expr-depth-
Устанавливает максимальное количество уровней рекурсии при попытке сопоставить имена переменных или временные отладочные переменные с выражениями значений. Это позволяет увеличить время компиляции для получения более полной отладочной информации. Если это значение слишком мало, выражения значений, которые доступны и могут быть представлены в отладочной информации, могут оказаться неиспользованными; установка более высокого значения может позволить компилятору найти более сложные выражения отладки, но время компиляции и использование памяти могут увеличиться.
max-debug-marker-count-
Устанавливает порог на количество отладочных меток (например, меток начала инструкций) для предотвращения взрыва сложности при встраивании или разворачивании в RTL. Если у функции больше таких gimple-инструкций, чем установленное ограничение, такие инструкции будут удалены из встроенной копии функции и из её расширения в RTL.
min-nondebug-insn-uid-
Использование идентификаторов, начиная с этого параметра, для инструкций без отладки. Диапазон ниже параметра зарезервирован исключительно для отладочных инструкций, созданных параметром -fvar-tracking-assignments, но отладочные инструкции могут получить (непересекающиеся) идентификаторы выше него, если зарезервированный диапазон исчерпан.
ipa-sra-deref-prob-threshold-
IPA-SRA заменяет указатель, известный как не NULL, одним или несколькими новыми параметрами только тогда, когда вероятность его разыменования (в процентах, относительно входа в функцию) выше этого параметра.
ipa-sra-ptr-growth-factor-
IPA-SRA заменяет указатель на агрегат одним или несколькими новыми параметрами только тогда, когда их совокупный размер меньше или равен ipa-sra-ptr-growth-factor умноженному на размер исходного параметра указателя.
ipa-sra-ptrwrap-growth-factor-
Дополнительный максимальный допустимый рост общего размера новых параметров, которые ipa-sra заменяет указателем на агрегат, если он указывает на локальную переменную, к которой вызывающий код только записывает и передает её как аргумент другим функциям.
ipa-sra-max-replacements-
Максимальное количество частей агрегата, которые отслеживает IPA-SRA. Вследствие этого, это также максимальное количество замен формального параметра.
sra-max-scalarization-size-Ospeedsra-max-scalarization-size-Osize-
Два прохода по скалярному сокращению агрегатов (SRA и IPA-SRA) стремятся заменить скалярные части агрегатов использованием независимых скалярных переменных. Эти параметры управляют максимальным размером, в единицах хранения, агрегата, который рассматривается для замены при компиляции для скорости (sra-max-scalarization-size-Ospeed) или размера (sra-max-scalarization-size-Osize) соответственно.
sra-max-propagations-
Максимальное количество искусственных обращений, которые скалярная замена агрегатов (SRA) будет отслеживать для одной локальной переменной, чтобы облегчить копирование.
tm-max-aggregate-size-
При копировании локальных переменных потоков в транзакции этот параметр указывает размер в байтах, после которого переменные сохраняются с помощью функций ведения журнала вместо пар кода сохранения/восстановления. Этот параметр применим только при использовании -fgnu-tm.
graphite-max-nb-scop-params-
Для предотвращения экспоненциального эффекта в преобразованиях циклов Graphite, количество параметров в статической части управления (SCoP) ограничено. Значение ноль может быть использовано для снятия ограничения. Переменная, значение которой неизвестно во время компиляции и определена вне SCoP, является параметром SCoP.
hardcfr-max-blocks-
Отключить -fharden-control-flow-redundancy для функций с большим количеством блоков, чем указано. Ноль удаляет любое ограничение.
hardcfr-max-inline-blocks-
Вынудить -fharden-control-flow-redundancy использовать внеблочную проверку для функций с большим количеством базовых блоков, чем указано.
loop-block-tile-size-
Преобразования блокирования или нарезки циклов, включенные с помощью -floop-block или -floop-strip-mine, нарезают каждый цикл в цикловой вложенности на заданное количество итераций. Длина нарезки может быть изменена с помощью параметра loop-block-tile-size.
ipa-jump-function-lookups-
Указывает количество посещенных операторов во время определения смещения функции перехода.
ipa-cp-value-list-size
-
-
IPA-CP пытается отслеживать все возможные значения и типы, передаваемые в параметр функции, чтобы распространить их и выполнить девиртуализацию. ipa-cp-value-list-size — максимальное количество значений и типов, хранимых им на один формальный параметр функции.
ipa-cp-eval-threshold-
IPA-CP рассчитывает свой собственный балл по эвристике клонирования и производит эти возможности клонирования с баллами, превышающими ipa-cp-eval-threshold.
ipa-cp-max-recursive-depth-
Максимальная глубина рекурсивного клонирования для саморекурсивных функций.
ipa-cp-min-recursive-probability-
Рекурсивное клонирование только тогда, когда вероятность выполнения вызова превышает параметр.
ipa-cp-profile-count-base-
При использовании параметра -fprofile-use, IPA-CP будет рассматривать измеренное количество выполнений ребра графа вызовов в этом процентном положении в их гистограмме в качестве основы для расчёта своих эвристик.
ipa-cp-recursive-freq-factor-
Количество раз, когда межпроцедурная копирование предполагает, что рекурсивные функции будут вызывать сами себя.
ipa-cp-recursion-penalty-
Процентная пеня, которую получат рекурсивные функции при оценке на клонирование.
ipa-cp-single-call-penalty-
Процентная пеня, которую получат функции, содержащие единственный вызов другой функции, при оценке на клонирование.
ipa-max-agg-items-
IPA-CP также способен распространять несколько скалярных значений, переданных в агрегате. ipa-max-agg-items контролирует максимальное количество таких значений на один параметр.
ipa-cp-loop-hint-bonus-
Когда IPA-CP определяет, что кандидат на клонирование позволит узнать количество итераций цикла, он добавляет бонус ipa-cp-loop-hint-bonus к баллу рентабельности кандидата.
ipa-max-loop-predicates-
Максимальное количество различных предикатов, которые будет использовать IPA для описания, когда циклы в функции имеют известные свойства.
ipa-max-aa-steps-
В ходе анализа тела функции IPA-CP использует анализ алиасов, чтобы отслеживать значения, на которые указывают параметры функции. Чтобы не тратить слишком много времени на анализ больших функций, он прекращает анализ и считает всю память переписанной после проверки ipa-max-aa-steps операторов, изменяющих память.
ipa-max-switch-predicate-bounds-
Максимальное количество граничных конечных точек диапазонов значений оператора switch. Для операторов switch, превышающих этот лимит, IPA-CP не будет строить предикаты стоимости клонирования, используемые для оценки выгоды от клонирования, для оператора default оператора switch.
ipa-max-param-expr-ops-
IPA-CP будет анализировать условные операторы, которые ссылаются на некоторые параметры функции, чтобы оценить выгоду от клонирования при определенном постоянном значении. Но если количество операций в выражении параметра превышает ipa-max-param-expr-ops, выражение считается сложным и не обрабатывается анализом IPA.
lto-partitions-
Укажите желаемое количество партиций, созданных во время компиляции WHOPR. Количество партиций должно превышать количество используемых для компиляции процессоров.
lto-min-partition-
Размер минимальной партиции для WHOPR (в оценочных инструкциях). Это предотвращает затраты на разделение очень маленьких программ на слишком много партиций.
lto-max-partition-
Размер максимальной партиции для WHOPR (в оценочных инструкциях). Устанавливает верхнюю границу для индивидуального размера партиции. Предназначен для использования только со сбалансированным разделением.
lto-max-streaming-parallelism-
Максимальное количество параллельных процессов, используемых для потоковой передачи LTO.
cxx-max-namespaces-for-diagnostic-help-
Максимальное количество пространств имен для консультации по предложениям, когда поиск имени C++ по идентификатору завершается неудачно.
sink-frequency-threshold-
Максимальная относительная частота выполнения (в процентах) целевого блока по отношению к исходному блоку оператора, чтобы разрешить утопление оператора. Более высокие значения приводят к более агрессивному утоплению операторов. Небольшая положительная корректировка применяется для операторов с операциями с памятью, так как они ещё более выгодны для утопления.
max-stores-to-sink-
Максимальное количество пар условных хранилищ, которые могут быть утоплены. Устанавливается в 0, если отключена векторизация (-ftree-vectorize) или преобразование условных операторов (-ftree-loop-if-convert).
case-values-threshold-
Наименьшее количество различных значений, для которых лучше использовать таблицу переходов вместо дерева условных ветвлений. Если значение равно 0, используется значение по умолчанию для машины.
jump-table-max-growth-ratio-for-size-
Максимальное отношение роста размера кода при расширении в таблицу переходов (в процентах). Параметр используется при оптимизации по размеру.
jump-table-max-growth-ratio-for-speed-
Максимальное отношение роста размера кода при расширении в таблицу переходов (в процентах). Параметр используется при оптимизации по скорости.
tree-reassoc-width-
Установите максимальное количество инструкций, выполняемых параллельно в пересоединенном дереве. Этот параметр переопределяет зависящие от целевого устройства эвристики, используемые по умолчанию, если имеет ненулевое значение.
sched-pressure-algorithm-
Выбор между двумя доступными реализациями -fsched-pressure. Алгоритм 1 — оригинальная реализация, которая с большей вероятностью предотвратит переупорядочивание инструкций. Алгоритм 2 был разработан как компромисс между относительно консервативным подходом, принятым алгоритмом 1, и довольно агрессивным подходом, принятым по умолчанию планировщиком. Он больше опирается на наличие регулярного файла регистров и точных классов давления регистров. См. haifa-sched.cc в исходном коде 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.
Примечание: По умолчанию проверка отключена во время выполнения. Чтобы включить её, добавьте
detect_stack_use_after_return=1в переменную средыASAN_OPTIONS. asan-instrumentation-with-call-threshold-
Если количество операций доступа к памяти в инструментируемой функции больше или равно этому числу, используйте обратные вызовы вместо встроенных проверок. Например, чтобы отключить встроенный код, используйте --param asan-instrumentation-with-call-threshold=0.
asan-kernel-mem-intrinsic-prefix-
Если ненулевое, префикс вызовов к
memcpy,memsetиmemmoveс ‘__asan_’ или ‘__hwasan_’ для -fsanitize=kernel-address или ‘-fsanitize=kernel-hwaddress’ соответственно. hwasan-instrument-stack-
Включить hwasan инструментирование статически размещенных переменных, размещенных в стеке. Этот вид инструментирования включен по умолчанию при использовании -fsanitize=hwaddress и отключен по умолчанию при использовании -fsanitize=kernel-hwaddress. Чтобы отключить инструментирование стека, используйте --param hwasan-instrument-stack=0, а чтобы включить его — --param hwasan-instrument-stack=1.
hwasan-random-frame-tag-
При использовании инструментирования стека, выбирайте метки для стековых переменных, используя детерминированную последовательность, начинающуюся со случайной метки для каждого кадра. Если этот параметр не установлен, метки выбираются с помощью той же последовательности, но начиная с 1. Это включено по умолчанию для -fsanitize=hwaddress и недоступно для -fsanitize=kernel-hwaddress. Для отключения используйте --param hwasan-random-frame-tag=0.
hwasan-instrument-allocas-
Включить hwasan инструментирование динамически размещенных переменных, размещенных в стеке. Этот вид инструментирования включен по умолчанию при использовании -fsanitize=hwaddress и отключен по умолчанию при использовании -fsanitize=kernel-hwaddress. Для отключения инструментирования таких переменных используйте --param hwasan-instrument-allocas=0, а чтобы включить — --param hwasan-instrument-allocas=1.
hwasan-instrument-reads-
Включить hwasan проверки на чтение памяти. Инструментирование операций чтения включено по умолчанию как для -fsanitize=hwaddress, так и для -fsanitize=kernel-hwaddress. Чтобы отключить проверку операций чтения памяти, используйте --param hwasan-instrument-reads=0.
hwasan-instrument-writes-
Включить hwasan проверки на запись в память. Инструментирование операций записи включено по умолчанию как для -fsanitize=hwaddress, так и для -fsanitize=kernel-hwaddress. Чтобы отключить проверку операций записи в память, используйте --param hwasan-instrument-writes=0.
hwasan-instrument-mem-intrinsics
-
-
Включить инструментацию hwasan для встроенных функций. Инструментация этих встроенных функций включена по умолчанию для обоих -fsanitize=hwaddress и -fsanitize=kernel-hwaddress. Чтобы отключить инструментацию встроенных функций, используйте --param hwasan-instrument-mem-intrinsics=0.
use-after-scope-direct-emission-threshold-
Если размер локальной переменной в байтах меньше или равен этому числу, непосредственно отравлять (или снимать отравление) теневую память вместо использования обратных вызовов во время выполнения.
tsan-distinguish-volatile-
Выводить специальную инструментацию для обращений к переменным volatile.
tsan-instrument-func-entry-exit-
Выводить вызовы инструментации __tsan_func_entry() и __tsan_func_exit().
max-fsm-thread-path-insns-
Максимальное количество инструкций для копирования при дублировании блоков на пути потока прыжка автомата конечного состояния.
threader-debug-
threader-debug=[none|all] Включает подробную выгрузку решателя threader.
parloops-chunk-size-
Размер блока omp schedule для циклов, распараллеленных с помощью parloops.
parloops-schedule-
Тип планирования omp schedule для циклов, распараллеленных с помощью parloops (static, dynamic, guided, auto, runtime).
parloops-min-per-thread-
Минимальное количество итераций на поток во внутреннем распараллеленном цикле, для которого распараллеленная версия предпочтительнее однопоточной. Обратите внимание, что для вложенного распараллеленного цикла минимальное количество итераций внешнего цикла на поток равно двум.
max-ssa-name-query-depth-
Максимальная глубина рекурсии при запросе свойств имён SSA в таких операциях, как процедуры сворачивания. Один уровень рекурсии соответствует слежению за цепочкой использования-определения.
max-speculative-devirt-maydefs-
Максимальное количество may-defs, которые мы анализируем при поиске must-def, определяющего динамический тип объекта, вызывающего виртуальный вызов, который мы можем девиртуализировать умозрительно.
ranger-debug-
Указывает тип отладочного вывода для диапазонов.
unroll-jam-min-percent-
Минимальный процент ссылок на память, которые необходимо оптимизировать, для того чтобы преобразование развёртывания-и-соединения считалось выгодным.
unroll-jam-max-unroll-
Максимальное количество раз, которое внешний цикл должен быть развёрнут преобразованием развёртывания-и-соединения.
max-rtl-if-conversion-unpredictable-cost-
Максимальная допустимая стоимость последовательности, которая была бы сгенерирована проходом RTL-преобразования условия `if` для ветви, которая считается непредсказуемой.
max-variable-expansions-in-unroller-
Если используется -fvariable-expansion-in-unroller, максимальное количество раз, которое отдельная переменная будет расширена во время развёртывания цикла.
partial-inlining-entry-probability-
Максимальная вероятность входа BB разделяемой области (в процентах относительно BB входа функции), чтобы сделать частичное встраивание.
max-tracked-strlens-
Максимальное количество строк, для которых оптимизирующий проход strlen будет отслеживать длины строк.
gcse-after-reload-partial-fraction-
Пороговое соотношение для выполнения частичного удаления избыточности после загрузки.
gcse-after-reload-critical-fraction-
Пороговое соотношение числа выполнения критических ребер, которое позволяет выполнить удаление избыточности после загрузки.
max-loop-header-insns-
Максимальное количество insn в заголовке цикла, дублированных проходом копирования заголовков циклов.
vect-epilogues-nomask-
Включить векторизацию эпилога цикла с использованием меньшего размера вектора.
vect-partial-vector-usage-
Управляет тем, когда векторизатор циклов рассматривает использование частичных векторизованных загрузок и сохранений как альтернативу возвращению к скалярному коду. 0 останавливает векторизатор от использования частичных векторизованных загрузок и сохранений. 1 разрешает частичные векторизованные загрузки и сохранения, если векторизация устраняет необходимость кода в итерации. 2 разрешает частичные векторизованные загрузки и сохранения во всех циклах. Параметр действует только на целевые платформы, которые поддерживают частичные векторизованные загрузки и сохранения.
vect-inner-loop-cost-factor-
Максимальный коэффициент, который векторизатор циклов применяет к стоимости операторов во внутреннем цикле относительно векторизованного цикла. Применяемый коэффициент — это максимальное значение из оцениваемого количества итераций внутреннего цикла и этого параметра. Значение параметра по умолчанию — 50.
vect-induction-float-
Включить векторизацию цикла для индуктивов с плавающей точкой.
vrp-sparse-threshold-
Максимальное количество базовых блоков, прежде чем VRP использует кэш разреженной битовой карты.
vrp-switch-limit-
Максимальное количество исходящих ребер в переключении, прежде чем VRP не обработает его.
vrp-vector-threshold-
Максимальное количество базовых блоков, чтобы VRP использовал базовый векторный кэш.
avoid-fma-max-bits-
Максимальное количество битов, для которых мы избегаем создания FMAs.
fully-pipelined-fma-
Является ли целевая платформа полностью конвейерируемой для инструкций FMA. Если не равно нулю, перегруппировка рассматривает выгоду от распараллеливания части умножения FMA и части сложения FMA, предполагая, что FMUL и FMA используют те же блоки, которые также могут выполнять FADD.
sms-loop-average-count-threshold-
Порог среднего числа итераций, которое учитывается планировщиком swing modulo.
sms-dfa-history-
Количество циклов, которые планировщик swing modulo рассматривает при проверке конфликтов с использованием DFA.
graphite-allow-codegen-errors-
Должны ли ошибки кодогенерации быть ICE, когда используется -fchecking.
sms-max-ii-factor-
Коэффициент для настройки верхней границы, которую планировщик swing modulo использует для планирования цикла.
lra-max-considered-reload-pseudos-
Максимальное число псевдонимов загрузки, которые учитываются при вытеснении псевдонима без загрузки.
max-pow-sqrt-depth-
Максимальная глубина цепочек sqrt для использования при синтезе возведения в степень действительной константой.
max-dse-active-local-stores-
Максимальное количество активных локальных сохранений в устранении мёртвых сохранений RTL.
asan-instrument-allocas-
Включить защиту asan для allocas/VLAs.
max-iterations-computation-cost-
Граница стоимости выражения для вычисления числа итераций.
max-isl-operations-
Максимальное количество операций isl, 0 означает неограниченное.
graphite-max-arrays-per-scop-
Максимальное количество массивов на scop.
max-vartrack-reverse-op-size-
Максимальный размер списка loc, для которого должны быть добавлены обратные операции.
fsm-scale-path-stmts-
Коэффициент масштабирования, применяемый к количеству операторов в пути потока, пересекающего обратное ребро цикла, при сравнении с --param=max-jump-thread-duplication-stmts.
uninit-control-dep-attempts-
Максимальное количество вложенных вызовов для поиска зависимостей управления во время анализа неинициализированных переменных.
uninit-max-chain-len-
Максимальное количество предикатов, связанных операцией `and`, для каждого предиката, объединённого операцией `or` в нормализованной цепи предикатов.
uninit-max-num-chains-
Максимальное количество предикатов, объединённых операцией `or` в нормализованной цепи предикатов.
sched-autopref-queue-depth-
Флаг управления моделью планировщика аппаратного автопредзагрузчика. Количество циклов предвидения, в которые модель смотрит; в « » — только включение эвристики сортировки инструкций.
loop-versioning-max-inner-insns-
Максимальное количество инструкций, которые может содержать внутренний цикл, прежде чем проход версии циклов посчитает его слишком большим для копирования.
loop-versioning-max-outer-insns-
Максимальное количество инструкций, которые может содержать внешний цикл, прежде чем проход версии циклов посчитает его слишком большим для копирования, не считая инструкций во внутренних циклах, которые напрямую выигрывают от версиирования.
ssa-name-def-chain-limit-
Максимальное количество присвоений SSA_NAME для следования при определении свойства переменной, такого как её значение. Это ограничивает количество итераций или рекурсивных вызовов, которые GCC выполняет при оптимизации определённых операторов или при определении их корректности перед выводом диагностики.
store-merging-max-size-
Максимальный размер одной области слияния сохранения в байтах.
hash-table-verification-limit-
Количество элементов, для которых выполняется проверка хеш-таблицы для каждого искомого элемента.
max-find-base-term-values-
Максимальное количество VALUE, обрабатываемых во время одного вызова find_base_term.
analyzer-max-enodes-per-program-point-
Максимальное количество взрывоопасных узлов на точку программы внутри анализатора перед завершением анализа этой точки.
analyzer-max-constraints-
Максимальное количество ограничений на состояние.
analyzer-min-snodes-for-call-summary-
Минимальное количество суперузлов в функции, чтобы анализатор мог рассмотреть обобщение его эффектов в местах вызова.
analyzer-max-enodes-for-full-dump-
Максимальная глубина взрывоопасных узлов, которые должны появиться в дампе dot, прежде чем переключиться на менее подробный формат.
analyzer-max-recursion-depth-
Максимальное количество раз, когда место вызова может появиться в стеке вызовов внутри анализатора, прежде чем завершить анализ вызова, который бы рекурсивно уходил глубже.
analyzer-max-svalue-depth-
Максимальная глубина символического значения перед аппроксимацией значения как неизвестного.
analyzer-max-infeasible-edges-
Максимальное количество невозможных ребер для отклонения перед объявлением диагностики как невозможной.
gimple-fe-computed-hot-bb-threshold-
Количество выполнений базового блока, которое считается горячим. Параметр используется только в GIMPLE FE.
analyzer-bb-explosion-factor-
Максимальное количество взрывоопасных узлов «после суперузла» внутри анализатора на суперузел, перед завершением анализа.
analyzer-text-art-string-ellipsis-threshold-
Количество байтов, при котором будут усечены строковые литералы в диаграммах анализатора.
analyzer-text-art-ideal-canvas-width-
Идеальная ширина в символах текстовых диаграмм, генерируемых анализатором.
analyzer-text-art-string-ellipsis-head-len-
Количество байтов литерала, которые необходимо показать в начале строкового литерала в текстовой диаграмме при усечении.
analyzer-text-art-string-ellipsis-tail-len-
Количество байтов литерала, которые необходимо показать в конце строкового литерала в текстовой диаграмме при усечении.
ranger-logical-depth-
Максимальная глубина вычисления логического выражения, которую будет просматривать диапазон, при оценке диапазонов исходящих ребер.
ranger-recompute-depth-
Максимальная глубина цепочек инструкций для рассмотрения пересчёта в вычислителе исходящих диапазонов.
relation-block-limit-
Максимальное количество отношений, которые зарегистрирует oracle в базовом блоке.
min-pagesize-
Минимальный размер страницы для целей вывода предупреждений.
openacc-kernels
-
-
Укажите режим обработки конструкций OpenACC ‘kernels’. С помощью --param=openacc-kernels=decompose, конструкции OpenACC ‘kernels’ разбиваются на части, последовательность вычислительных конструкций, каждая из которых обрабатывается индивидуально. Эта функция находится в стадии разработки. С помощью --param=openacc-kernels=parloops, конструкции OpenACC ‘kernels’ обрабатываются проходом ‘parloops’ целиком. Это текущее значение по умолчанию.
openacc-privatization-
Управляет тем, выводят ли опции -fopt-info-omp-note и соответствующие опции -fdump-tree-*-details диагностику приватизации OpenACC. С помощью --param=openacc-privatization=quiet, не выводить диагностику. Это текущее значение по умолчанию. С помощью --param=openacc-privatization=noisy, выводить диагностику.
Доступны следующие варианты name для целей AArch64:
aarch64-vect-compare-costs-
При векторизации следует рассмотреть использование нескольких различных подходов и использовать модель затрат для выбора самого дешевого. Это включает в себя:
- Попытку использования как SVE, так и Advanced SIMD, когда SVE доступен.
- Попытку использования 64-битных векторов Advanced SIMD для самых маленьких элементов данных вместо использования 128-битных векторов для всего.
- Попытку использования «неупакованных» векторов SVE для более мелких элементов. Это включает хранение меньших элементов в более крупных контейнерах и доступ к элементам с помощью расширяющих загрузок и усекающих сохранений.
aarch64-float-recp-precision-
Количество итераций Ньютона для вычисления обратной величины для типа float. Точность деления пропорциональна этому параметру, когда включено приближение деления. Значение по умолчанию равно 1.
aarch64-double-recp-precision-
Количество итераций Ньютона для вычисления обратной величины для типа double. Точность деления пропорциональна этому параметру, когда включено приближение деления. Значение по умолчанию равно 2.
aarch64-autovec-preference-
Принудительная стратегия выбора ISA для автоматической векторизации. Принимает значения от 0 до 4 включительно.
- ‘0’
Используются стандартные эвристики.
- ‘1’
Для автоматической векторизации используется только Advanced SIMD.
- ‘2’
Для автоматической векторизации используется только SVE.
- ‘3’
Используются и Advanced SIMD, и SVE. При равных затратах отдается предпочтение Advanced SIMD.
- ‘4’
Используются и Advanced SIMD, и SVE. При равных затратах отдается предпочтение SVE.
Значение по умолчанию равно 0.
aarch64-ldp-policy-
Политика тонкой настройки для пар загрузок. С помощью --param=aarch64-ldp-policy=default, используется политика структуры настройки. Это текущее значение по умолчанию. С помощью --param=aarch64-ldp-policy=always, генерируется ldp независимо от выравнивания. С помощью --param=aarch64-ldp-policy=never, не генерируется ldp. С помощью --param=aarch64-ldp-policy=aligned, генерируется ldp только если указатель источника выровнен по крайней мере вдвое больше, чем выравнивание типа.
aarch64-stp-policy-
Политика тонкой настройки для пар сохранений. С помощью --param=aarch64-stp-policy=default, используется политика структуры настройки. Это текущее значение по умолчанию. С помощью --param=aarch64-stp-policy=always, генерируется stp независимо от выравнивания. С помощью --param=aarch64-stp-policy=never, не генерируется stp. С помощью --param=aarch64-stp-policy=aligned, генерируется stp только если указатель источника выровнен по крайней мере вдвое больше, чем выравнивание типа.
aarch64-ldp-alias-check-limit-
Ограничение на количество проверок псевдонимов, выполняемых проходом AArch64 по слиянию пар загрузок/сохранений при попытке сформировать ldp/stp. Более высокие значения делают проход более агрессивным при переупорядочении загрузок перед сохранениями, за счет увеличения времени компиляции.
aarch64-ldp-writeback-
Параметр для управления тем, какие возможности записи мы пытаемся обработать в проходе AArch64 по слиянию пар загрузок/сохранений. Значение 0 отключает обработку обратной записи. Значение 1 означает, что мы пытаемся сформировать пары, включающие одну или несколько существующих отдельных операций обратной записи, где это возможно. Значение 2 означает, что мы также пытаемся создать возможности обратной записи путем объединения в хвостовых разрушающих обновлениях базового регистра, используемого парой.
aarch64-loop-vect-issue-rate-niters-
Настройка для некоторых процессоров AArch64 пытается учесть как задержки, так и скорости выдачи при принятии решения о том, следует ли векторизовать цикл с помощью SVE, векторизовать с помощью Advanced SIMD или вообще не векторизовать. Если этот параметр установлен на n, GCC не будет использовать этот эвристический метод для циклов, которые, как известно, выполняются меньше чем n итераций Advanced SIMD.
aarch64-vect-unroll-limit-
Векторизатор будет использовать доступную информацию для настройки, чтобы определить, было бы выгодно развернуть основной векторизованный цикл и на сколько. Этот параметр устанавливает верхнюю границу того, насколько развернет векторизатор основной цикл. Значение по умолчанию равно четырем.
Доступны следующие варианты name для целей GCN:
gcn-preferred-vectorization-factor-
Предпочтительный коэффициент векторизации: ‘default’, ‘32’, ‘64’.
Доступны следующие варианты name для целей i386 и x86_64:
x86-stlf-window-ninsns-
Количество инструкций, превышение которого позволяет компенсировать штраф за задержку STFL.
x86-stv-max-visits-
Максимальное количество посещений использования и определения при обнаружении цепочки STV перед прерыванием обнаружения.
-
© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-14.2.0/gcc/Optimize-Options.html