3.12 Параметры, управляющие оптимизацией
Эти параметры управляют различными видами оптимизации.
Без указания параметров оптимизации цель компилятора — сократить время компиляции и обеспечить ожидаемые результаты при отладке. Операторы независимы: если остановить программу точкой останова между операторами, затем присвоить новое значение любой переменной или изменить счётчик команд так, чтобы перейти к любому другому оператору в функции, вы получите именно те результаты, которых ожидаете, исходя из исходного кода.
Включение флагов оптимизации побуждает компилятор повышать производительность и/или уменьшать размер кода за счёт увеличения времени компиляции и возможного ухудшения возможностей отладки программы.
Компилятор выполняет оптимизацию, основываясь на имеющихся у него сведениях о программе. Компиляция нескольких файлов за один раз в один выходной файл позволяет компилятору использовать при компиляции каждого файла информацию, полученную из всех файлов.
Не все оптимизации управляются непосредственно флагами. В этом разделе перечислены только оптимизации, для которых предусмотрен флаг.
Большинство оптимизаций полностью отключено при -O0 или если в командной строке не задан уровень -O, даже если указаны отдельные флаги оптимизации. Аналогичным образом, -Og отключает многие этапы оптимизации.
В зависимости от целевой платформы и параметров сборки GCC на каждом уровне -O может быть включён несколько иной набор оптимизаций, чем тот, что перечислен здесь. Чтобы узнать точный набор оптимизаций, включённых на каждом уровне, запустите GCC с параметрами -Q --help=optimizers. Примеры см. в разделе Параметры, управляющие видом выходных данных.
-
-O -O1-
Выполнять оптимизацию. Оптимизирующая компиляция занимает несколько больше времени и требует гораздо больше памяти для больших функций.
При использовании -O компилятор пытается уменьшить размер кода и время его выполнения, не выполняя оптимизаций, требующих значительного времени компиляции.
-O — рекомендуемый уровень оптимизации для большого объёма кода, созданного автоматически: он обеспечивает разумный баланс между временем компиляции и использованием памяти. На более высоких уровнях оптимизации выполняются оптимизации с более высокой алгоритмической сложностью, чем при -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 -fivopts -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-crc -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 -
Сократить время компиляции и обеспечить ожидаемые результаты при отладке. Этот режим используется по умолчанию.
При -O0 GCC полностью отключает большинство этапов оптимизации; они не выполняются, даже если явно включены в командной строке или перечислены параметром -Q --help=optimizers как включённые по умолчанию. Многие оптимизации GCC зависят от этапов анализа кода или каноникализации, включаемых параметром -O, поэтому выполнение отдельных этапов оптимизации изолированно не имеет смысла.
-
-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.
-
-favoid-store-forwarding -fno-avoid-store-forwarding-
При загрузке, частично зависящей от предыдущих записей меньшего размера, многие ЦП простаивают в течение множества тактов. Этот проход пытается обнаружить такие случаи и избежать штрафа, изменив порядок загрузки и записи, а затем скорректировав загруженное значение.
По умолчанию отключён.
-
-ffp-contract=style -
-ffp-contract=off отключает свёртывание выражений с плавающей точкой. -ffp-contract=fast включает свёртывание выражений с плавающей точкой, например формирование операций слитного умножения-сложения, если целевая платформа поддерживает их аппаратно. -ffp-contract=on включает свёртывание выражений с плавающей точкой, если это разрешено стандартом языка. Реализация для C и C++ позволяет выполнять свёртывание в пределах одного выражения, но не между разными инструкциями.
По умолчанию для C в режиме соответствия стандарту (-std=c11 или аналогичном) используется -ffp-contract=off, в остальных случаях — -ffp-contract=fast.
-
-fomit-frame-pointer -
Не сохраняет указатель кадра в функциях, которым он не нужен. Это позволяет не выполнять инструкции сохранения, настройки и восстановления указателя кадра; на многих целевых платформах также освобождается дополнительный регистр.
На некоторых целевых платформах этот флаг не действует, поскольку стандартная последовательность вызова всегда использует указатель кадра, который поэтому нельзя опустить.
Обратите внимание: -fno-omit-frame-pointer не гарантирует использование указателя кадра во всех функциях. На некоторых целевых платформах указатель кадра всегда опускается в функциях-листьях.
Включён по умолчанию начиная с -O1.
-
-foptimize-crc -
Обнаруживает циклы, вычисляющие CRC (выполняющие полиномиальное деление столбиком), и заменяет их более быстрой реализацией. Обнаруживает CRC шириной 8, 16, 32 и 64 бита с постоянным полиномом без старшего бита 1 как для прямого, так и для обратного порядка битов. Если целевая платформа поддерживает инструкцию CRC, а полином в исходном коде совпадает с полиномом, используемым этой инструкцией, генерируется инструкция CRC. В противном случае, если целевая платформа поддерживает инструкцию умножения без переноса, CRC генерируется с её помощью; иначе генерируется CRC на основе таблицы.
Включён по умолчанию начиная с -O2.
-
-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, применяемая только к функциям, объявленным с использованием атрибута или спецификатора declspec
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 -
Выполняет планирование по модулю методом swing непосредственно перед первым проходом планирования. Этот проход рассматривает внутренние циклы и переупорядочивает их инструкции, совмещая разные итерации.
-
-fmodulo-sched-allow-regmoves -
Выполняет более агрессивное планирование по модулю на основе SMS, разрешая перемещения регистров. При установке этого флага удаляются некоторые рёбра антизависимостей, что приводит к генерации перемещений регистров на основе анализа диапазонов жизни. Этот параметр действует только при включённом -fmodulo-sched.
-
-fno-branch-count-reg -
Отключает проход оптимизации, который ищет возможности использовать инструкции «уменьшить счётчик и перейти» для регистра-счётчика вместо последовательностей инструкций, уменьшающих регистр, сравнивающих его с нулём и выполняющих переход в зависимости от результата. Этот параметр имеет смысл только для архитектур, поддерживающих такие инструкции, включая x86, PowerPC, IA-64 и S/390. Обратите внимание: параметр -fno-branch-count-reg не удаляет из генерируемого потока инструкций инструкции уменьшения счётчика и перехода, добавленные другими проходами оптимизации.
По умолчанию на уровне -O1 и выше используется -fbranch-count-reg, за исключением -Og.
-
-fno-function-cse -
Не помещает адреса функций в регистры; каждая инструкция, вызывающая константную функцию, содержит явный адрес этой функции.
Этот параметр приводит к менее эффективному коду, однако некоторые необычные приёмы, изменяющие вывод ассемблера, могут работать некорректно из-за оптимизаций, выполняемых при отключённом параметре.
По умолчанию используется -ffunction-cse
-
-fno-zero-initialized-in-bss -
Если целевая платформа поддерживает секцию BSS, GCC по умолчанию помещает в неё переменные, инициализированные нулём. Это может уменьшить размер результирующего кода.
Этот параметр отключает такое поведение, поскольку некоторые программы явно полагаются на то, что переменные находятся в секции данных, например, чтобы результирующий исполняемый файл мог найти начало этой секции и/или использовать основанные на этом предположения.
По умолчанию используется -fzero-initialized-in-bss, кроме языка Ada.
-
-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 -
Выполняет преобразование cross-jumping. Это преобразование объединяет эквивалентный код и уменьшает его размер. Полученный код может работать как быстрее, так и медленнее, чем код без cross-jumping.
Включён на уровнях -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 -
ABI C++ требует нескольких точек входа для конструкторов и деструкторов: одной для базового подобъекта, одной для целого объекта и одной для виртуального деструктора, который затем вызывает оператор delete. В иерархии с виртуальными базовыми классами варианты для базового и целого объекта являются клонами, то есть существуют две копии функции. При использовании этого параметра варианты для базового и целого объекта заменяются заглушками, вызывающими общую реализацию.
Включён параметром -Os.
-
-fdelete-null-pointer-checks -
Предполагает, что программы не могут безопасно разыменовывать нулевые указатели и что по адресу ноль не располагаются элементы кода или данных. Этот параметр включает простые оптимизации свёртки констант на всех уровнях оптимизации. Кроме того, другие проходы оптимизации GCC используют этот флаг для управления глобальным анализом потоков данных, устраняющим бесполезные проверки нулевых указателей; предполагается, что обращение к памяти по адресу ноль всегда вызывает исключение, поэтому указатель не может быть нулевым, если его проверяют после разыменования.
Однако обратите внимание, что в некоторых средах это предположение неверно. Используйте -fno-delete-null-pointer-checks, чтобы отключить эту оптимизацию в программах, зависящих от такого поведения.
На большинстве целевых платформ этот параметр включён по умолчанию. На AVR и MSP430 он полностью отключён.
Проходы, использующие сведения о потоках данных, независимо включаются на разных уровнях оптимизации.
-
-fdevirtualize -
Пытается преобразовать вызовы виртуальных функций в прямые вызовы. Это выполняется как внутри процедуры, так и межпроцедурно в рамках косвенной подстановки (-findirect-inlining) и межпроцедурного распространения констант (-fipa-cp). Включён на уровнях -O2, -O3, -Os.
-
-fdevirtualize-speculatively -
Пытается преобразовать вызовы виртуальных функций в спекулятивные прямые вызовы. На основе анализа графа наследования типов определяет набор вероятных целей для данного вызова. Если набор невелик, предпочтительно состоит из одной цели, вызов заменяется условной конструкцией, выбирающей между прямым и косвенным вызовами. Спекулятивные вызовы позволяют выполнять дополнительные оптимизации, например подстановку. Если после дальнейшей оптимизации они оказываются бесполезными, их преобразуют обратно в исходную форму.
-
-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++ значение объекта изменяется только в течение его времени жизни: когда начинается конструктор, значение объекта не определено, а любые изменения за время жизни объекта становятся мёртвыми после его уничтожения. Обычно удаление мёртвых записей использует это свойство; если ваш код полагается на сохранение значения в хранилище объекта после окончания времени его жизни, используйте этот флаг, чтобы отключить оптимизацию. Чтобы сохранять записи, сделанные до начала конструктора (например, если ваш operator 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 -
Включает перематериализацию в LRA с учётом CFG. Вместо загрузки значений вытесненных псевдорегистров LRA пытается перематериализовать (повторно вычислить) значения, если это выгодно.
Включён на уровнях -O2, -O3, -Os.
-
-fdelayed-branch -
Если целевая машина поддерживает эту возможность, пытается переупорядочить инструкции, чтобы использовать доступные слоты инструкций после инструкций отложенного перехода.
Включён на уровнях -O1, -O2, -O3, -Os, но не на -Og.
-
-fschedule-insns -
Если целевая машина поддерживает эту возможность, пытается переупорядочить инструкции, чтобы устранить простои выполнения из-за недоступности необходимых данных. Это помогает машинам с медленными инструкциями операций с плавающей точкой или загрузки из памяти, позволяя выполнять другие инструкции до тех пор, пока не потребуется результат загрузки или операции с плавающей точкой.
Обычно включён на уровнях оптимизации -O2 и -O3. Однако на многих целевых платформах это поведение переопределено. Например, на x86 параметр отключён на всех уровнях, а на AArch64 включён только на уровне -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 компилятор предполагает, что при подмене функций заменяющая функция будет иметь в точности ту же семантику (и побочные эффекты). Аналогично, при подмене переменных конструктор переменной будет тем же. Флаг не влияет на функции, явно объявленные встроенными (для них подмена, меняющая семантику, в любом случае не допускается), и на символы, явно объявленные слабыми.
-
-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 -
Пытаться минимизировать использование стека. Компилятор старается использовать меньше места в стеке, даже если это замедляет программу. Этот параметр задает значение 100 для параметра large-stack-frame и значение 400 для параметра large-stack-frame-growth.
-
-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-reorder-for-locality -
Размещать цепочки вызовов рядом в двоичном файле, чтобы улучшить локальность кода и минимизировать расстояния переходов между часто вызываемыми функциями. В отличие от -freorder-functions, этот проход учитывает цепочки вызовов между функциями и группирует их, а не помещает все часто выполняемые, обычные, редко выполняемые и никогда не выполняемые функции в отдельные секции. В отличие от -fprofile-reorder-functions, он стремится улучшить локальность кода на протяжении всего времени выполнения программы, а не сосредоточивается на ее запуске. Этот параметр несовместим с явно заданным параметром -flto-partition=, поскольку принудительно задает пользовательскую схему разбиения. При использовании этого параметра рекомендуется также применять обратную связь профилирования, однако без нее данный параметр по умолчанию не включается.
-
-fipa-stack-alignment -
По возможности уменьшать выравнивание стека в местах вызова. Включен по умолчанию.
-
-fipa-pta -
Выполнять межпроцедурный анализ указателей, а также межпроцедурный анализ модификаций и ссылок. При больших единицах компиляции этот параметр может привести к чрезмерному использованию памяти и увеличению времени компиляции. По умолчанию он не включен ни на одном уровне оптимизации.
-
-fipa-profile -
Выполнять межпроцедурное распространение профиля. Функции, вызываемые только из редко выполняемых функций, помечаются как редко выполняемые. Также выявляются функции, выполняемые один раз (например,
cold,noreturn, статические конструкторы или деструкторы). Редко выполняемые функции и части функций без циклов, выполняемые один раз, затем оптимизируются по размеру. Включен по умолчанию при -O1 и выше. -
-fipa-modref -
Выполнять межпроцедурный анализ модификаций и ссылок. Эта оптимизация анализирует побочные эффекты функций (модифицируемые или используемые ячейки памяти) и позволяет лучше оптимизировать код на границах вызова функций. Этот флаг включен по умолчанию при -O1 и выше.
-
-fipa-cp -
Выполнять межпроцедурное распространение констант. Эта оптимизация анализирует программу, чтобы определить, когда передаваемые функциям значения являются константами, и затем оптимизирует код соответствующим образом. Она может значительно повысить производительность, если в приложении функциям передаются константы. Этот флаг включен по умолчанию при -O2, -Os и -O3. Он также включается параметрами -fprofile-use и -fauto-profile.
-
-fipa-cp-clone -
Выполнять клонирование функций, чтобы усилить межпроцедурное распространение констант. Если этот параметр включен, межпроцедурное распространение констант клонирует функции, когда функцию с внешней видимостью можно вызвать с аргументами-константами. Поскольку эта оптимизация может создавать несколько копий функций, она способна значительно увеличить размер кода (см. --param ipa-cp-unit-growth=value). Этот флаг включен по умолчанию при -O3. Он также включается параметрами -fprofile-use и -fauto-profile.
-
-fipa-bit-cp -
Если параметр включен, выполнять межпроцедурное побитовое распространение констант. Этот флаг включен по умолчанию при -O2, а также параметрами -fprofile-use и -fauto-profile. Для его работы необходимо включить -fipa-cp.
-
-fipa-vrp -
Если параметр включен, выполнять межпроцедурное распространение диапазонов значений. Этот флаг включен по умолчанию при -O2. Для его работы необходимо включить -fipa-cp.
-
-fipa-icf -
Выполнять объединение идентичного кода для функций и переменных, доступных только для чтения. Оптимизация уменьшает размер кода и может нарушить стек раскрутки, заменяя функцию эквивалентной функцией с другим именем. Оптимизация работает эффективнее при включенной оптимизации на этапе компоновки.
Хотя поведение похоже на оптимизацию ICF компоновщика Gold, GCC ICF работает на других уровнях, поэтому оптимизации не совпадают: некоторые эквивалентности находит только GCC, а некоторые — только Gold.
Этот флаг включен по умолчанию при -O2 и -Os.
-
-flate-combine-instructions -
Включить два прохода объединения инструкций, выполняемые на сравнительно поздних этапах компиляции. Один проход выполняется до распределения регистров, другой — после. Основная цель этих проходов — подставить определения во все места использования.
На большинстве целевых платформ этот флаг включен по умолчанию при -O2 и -Os.
-
-flive-patching=level -
Управлять оптимизациями GCC для генерации вывода, пригодного для динамического исправления программы.
Если оптимизация компилятора использует тело функции или извлеченную из него информацию для оптимизации или изменения другой функции, последняя называется затронутой функцией первой. При исправлении функции ее затронутые функции также следует исправить.
Затронутые функции определяются межпроцедурными оптимизациями компилятора. Например, вызывающая функция становится затронутой при встраивании в нее функции, при клонировании функции и изменении ее вызывающей функции для вызова нового клона, а также при извлечении сведений о чистоте или константности функции для оптимизации ее прямых или косвенных вызывающих функций и т. д.
Как правило, чем больше включено межпроцедурных оптимизаций, тем больше затронутых функций приходится на каждую функцию. Чтобы контролировать число затронутых функций и упростить вычисление их списка, межпроцедурные оптимизации можно частично включить на двух разных уровнях.
Аргумент level должен иметь одно из следующих значений:
- ‘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-cselim -
Выполнять условное устранение записей в деревьях. Этот флаг включен по умолчанию при -O1 и выше на целевых платформах с инструкциями условного перемещения.
-
-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 -
Включить тождественное преобразование для Graphite. Для каждого 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 для заполнения нулями. Например, цикл
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 для заполнения нулями.
-
-floop-interchange -
Выполнять перестановку циклов вне Graphite. Этот флаг может повысить эффективность кэша во вложенных циклах и дать возможность выполнять дальнейшие оптимизации циклов, например векторизацию. Например, цикл
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 затруднена (вызовы функций, операции, разворачиваемые в нетривиальные последовательности инструкций). С параметром -funswitch-loops он также выносит из цикла операнды инвариантных условий, чтобы при переключении циклов можно было использовать только тривиальный анализ инвариантности. Проход также включает перемещение операций записи.
-
-ftree-loop-ivcanon -
Создавать канонический счетчик числа итераций для циклов, в которых для определения числа итераций требуется сложный анализ. Последующие оптимизации смогут легко определить это число. Особенно полезно в сочетании с разворачиванием циклов.
-
-ftree-scev-cprop -
Выполнять подстановку конечного значения. Если переменная изменяется в цикле таким образом, что ее значение при выходе из цикла можно определить, используя только ее начальное значение и число итераций цикла, заменять обращения к конечному значению таким вычислением, если оно достаточно дешево. Это сокращает зависимости по данным и может позволить выполнить дальнейшие упрощения. По умолчанию включено при -O1 и выше.
-
-fivopts -
Выполнять оптимизацию индукционных переменных (снижение силы, объединение индукционных переменных и удаление индукционных переменных) в деревьях. По умолчанию включено при -O1 и выше.
-
-ftree-parallelize-loops=n -
Распараллеливать циклы, то есть делить пространство их итераций для выполнения в n потоках. Это возможно только для циклов с независимыми итерациями, порядок которых можно произвольно менять. Оптимизация выгодна только на многопроцессорных машинах и для циклов с высокой загрузкой ЦП, а не для циклов, ограниченных, например, пропускной способностью памяти. Этот параметр подразумевает -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» отключает векторизацию циклов при необходимости любых проверок зависимости данных или выравнивания во время выполнения, а также отключает векторизацию завершающих циклов; в остальном она эквивалентна модели «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 и еслиi— целое число размером 32 бита или меньше, можно оптимизировать ветвление и тело оператораif(но не вызовsnprint), поскольку гарантируется, что возвращаемое значение не превышает 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-
Отключить любые машинно-зависимые оптимизации на уровне просмотрщика шаблонов. Различие между -fno-peephole и -fno-peephole2 заключается в их реализации в компиляторе: некоторые целевые платформы используют один параметр, некоторые — другой, а некоторые — оба.
-fpeephole включен по умолчанию. -fpeephole2 включен при уровнях -O2, -O3, -Os.
-
-fno-guess-branch-probability -
Не угадывать вероятности переходов с помощью эвристик.
Если вероятности переходов не предоставлены профилированием (-fprofile-arcs), GCC использует эвристики для их оценки. Эти эвристики основаны на графе потока управления. Если некоторые вероятности переходов заданы с помощью
__builtin_expect, эвристики используются для оценки вероятностей остальных переходов графа потока управления с учетом информации__builtin_expect. Взаимодействие эвристик с__builtin_expectможет быть сложным; в некоторых случаях эвристики полезно отключить, чтобы упростить понимание влияния__builtin_expect.Ожидаемую вероятность выражения также можно задать с помощью встроенной функции
__builtin_expect_with_probability.По умолчанию при уровнях -O, -O2, -O3, -Os используется -fguess-branch-probability.
-
-freorder-blocks -
Изменять порядок базовых блоков в скомпилированной функции, чтобы уменьшить число выполняемых переходов и повысить локальность кода.
Включено при уровнях -O1, -O2, -O3, -Os.
-
-freorder-blocks-algorithm=algorithm -
Использовать указанный алгоритм переупорядочивания базовых блоков. Аргумент algorithm может быть равен «simple»: этот алгоритм не увеличивает размер кода (кроме случаев, когда это происходит вследствие вторичных эффектов, например выравнивания); либо «stc» — алгоритм «software trace cache», который стремится сгруппировать часто выполняемый код, сокращая число выполняемых переходов за счет создания дополнительных копий кода.
По умолчанию при уровнях -O1 и -Os используется «simple», а при уровнях -O2 и -O3 — «stc».
-
-freorder-blocks-and-partition -
Помимо переупорядочивания базовых блоков скомпилированной функции для сокращения числа выполняемых переходов, распределять горячие и холодные базовые блоки по отдельным секциям ассемблерного кода и файлам .o, чтобы улучшить производительность подкачки страниц и локальность кэша.
Эта оптимизация автоматически отключается при наличии обработки исключений или таблиц раскрутки стека (на целевых платформах, использующих setjump/longjump или специфичный для платформы механизм), для секций linkonce, для функций с пользовательским атрибутом секции, а также на архитектурах, не поддерживающих именованные секции. При использовании -fsplit-stack этот параметр по умолчанию не включается (во избежание ошибок компоновщика), но его можно включить явно (если используется исправный компоновщик).
Включено для x86 при уровнях -O2, -O3, -Os.
-
-freorder-functions -
Переупорядочивать функции в объектном файле, чтобы повысить локальность кода. В отличие от -fipa-reorder-for-locality, этот параметр отдает приоритет группировке всех функций одной категории (горячие/обычные/холодные/не выполняющиеся) вместе. Это реализуется с помощью специальных подсекций
.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; }Часто применяется чтение не из того члена объединения, в который было выполнено последнее присваивание (это называется «типовым переосмыслением»). Даже при использовании -fstrict-aliasing типовое переосмысление разрешено, если доступ к памяти осуществляется через тип объединения. Поэтому приведенный выше код работает ожидаемым образом. См. Структуры, объединения, перечисления и битовые поля. Однако следующий код может работать неправильно:
int f() { union a_union t; int* ip; t.d = 3.0; ip = &t.i; return *ip; }Аналогично, получение адреса объекта, приведение полученного указателя и разыменование результата приводит к неопределенному поведению, даже если при приведении используется тип объединения, например:
int f() { double d = 3.0; return ((union a_union *) &d)->i; }Параметр -fstrict-aliasing включен при уровнях -O2, -O3, -Os.
-
-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-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-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++ (с помощью оператора
newи оператораdelete) при удалении мертвого кода.См. также -fmalloc-dce.
-
-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 и окончательным объектным кодом. В режиме LTO GCC автоматически выбирает файлы для оптимизации и файлы, которые следует компоновывать без дополнительной обработки.
Как правило, параметры, указанные при компоновке, переопределяют параметры, заданные при компиляции, хотя в некоторых случаях 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’ создаёт новый раздел для каждого символа, если это возможно; ‘cache’ балансирует размеры частей, сохраняя связанные символы вместе для улучшения кэширования при инкрементальной LTO. Значение ‘none’ отключает разбиение и потоковую обработку. Значение по умолчанию — ‘balanced’. Хотя ‘1to1’ можно использовать как обходной путь при различных проблемах с порядком кода, разбиение ‘max’ предназначено только для внутреннего тестирования. Значение ‘one’ указывает, что следует использовать ровно один раздел, а значение ‘none’ отключает разбиение и выполняет этап оптимизации на этапе компоновки непосредственно из фазы WPA.
-
-flto-incremental=path -
Включает инкрементальную LTO с кэшем в указанном существующем каталоге. Может значительно сократить циклы редактирования и компиляции при использовании LTO.
При использовании с LTO (-flto) кэшируются результаты обработки единиц трансляции в LTO. При повторной компиляции с небольшими изменениями кода кэшированные единицы трансляции, вероятно, будут использованы снова, что сократит время повторной компиляции.
Несколько экземпляров GCC могут параллельно использовать один и тот же кэш.
-
-flto-incremental-cache-size=n -
Задаёт число записей кэша инкрементальной LTO, после достижения которого удаляются старые записи. Это мягкое ограничение: временно число записей может быть больше.
-
-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 без Fat файлы make необходимо изменить так, чтобы они использовали эти обёртки.Обратите внимание, что современные 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-
Пытается устранить инструкции сложения, сворачивая их в операции загрузки и сохранения в памяти.
Включено на уровнях -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).
Если указано значение path, 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
path — имя файла, содержащего данные профиля 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. Этому инструменту также необходимо передать не stripped двоичный файл программы. См. https://github.com/google/autofdo.Например:
create_gcov --binary=your_program.unstripped --profile=perf.data \ --gcov=profile.afdo
Следующие опции управляют поведением компилятора при выполнении арифметических операций с плавающей запятой. Эти опции задают компромисс между скоростью и точностью. Каждую из них необходимо включать явно.
-
-fexcess-precision=style -
Эта опция позволяет управлять избыточной точностью на машинах, где операции с плавающей запятой выполняются в формате с большей точностью или диапазоном, чем стандартные и обменные типы с плавающей запятой IEEE. Примером такой цели является число с плавающей запятой x87 на процессорах x86, в котором внутренне используется 80-битное представление вместо 64-битного формата IEEE. Для большинства программ избыточная точность безвредна, но некоторые программы могут полагаться на требования стандартов языков C или C++ при обработке значений 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 без избыточной точности, а во втором округление непредсказуемо.
-
-ffloat-store -
Не сохранять переменные с плавающей запятой в регистрах и отключать другие опции, которые могут изменить способ получения значения с плавающей запятой из регистра или памяти. Эта опция в целом была заменена на -fexcess-precision=standard, которая является более универсальной. Если вы все же используете -ffloat-store, вам может потребоваться изменить программу так, чтобы явно сохранять промежуточные вычисления во временных переменных, поскольку -ffloat-store выполняет округление до формата IEEE только при присваиваниях, а не при приведении типов, как это делает -fexcess-precision=standard.
-
-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, кроме -Ofast, поскольку она может привести к некорректному выводу для программ, зависящих от точной реализации правил/спецификаций IEEE или ISO для математических функций. Тем не менее, она может давать более быстрый код для программ, которые не требуют гарантий этих спецификаций.
Значение по умолчанию — -fmath-errno.
В системах Darwin математическая библиотека никогда не устанавливает
errno. Следовательно, у компилятора нет причин рассматривать такую возможность, и по умолчанию используется -fno-math-errno. -
-funsafe-math-optimizations -
Разрешить оптимизации для арифметики с плавающей запятой, которые (a) предполагают, что аргументы и результаты являются допустимыми, и (b) могут нарушать стандарты IEEE или ANSI. При использовании на этапе компоновки это может включать библиотеки или стартовые файлы, которые изменяют слово управления FPU по умолчанию или выполняют другие подобные оптимизации.
Эта опция не включается ни одной опцией -O, кроме -Ofast, поскольку она может привести к некорректному выводу для программ, зависящих от точной реализации правил/спецификаций IEEE или ISO для математических функций. Тем не менее, она может давать более быстрый код для программ, которые не требуют гарантий этих спецификаций. Включает -fno-signed-zeros, -fno-trapping-math, -fassociative-math и -freciprocal-math.
Значение по умолчанию — -fno-unsafe-math-optimizations.
-
-fassociative-math -
Разрешить переупорядочивание операндов в сериях операций с плавающей запятой. Это нарушает стандарт языков ISO C и C++, поскольку может изменить результат вычислений. ПРИМЕЧАНИЕ: изменение порядка может изменить знак нуля, а также проигнорировать NaN и подавить или создать переполнение (underflow или overflow) (и поэтому не может использоваться в коде, который полагается на поведение округления, например
(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)подлежит исключению общих подвыражений. Обратите внимание, что это приводит к потере точности и увеличивает количество операций с плавающей запятой (flops), выполняемых над значением.Значение по умолчанию — -fno-reciprocal-math.
-
-ffinite-math-only -
Разрешить оптимизации для арифметики с плавающей запятой, которые предполагают, что аргументы и результаты не являются NaN или +-Inf.
Эта опция не включается ни одной опцией -O, кроме -Ofast, поскольку она может привести к некорректному выводу для программ, зависящих от точной реализации правил/спецификаций 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 -
Компилировать код в предположении, что операции с плавающей запятой не могут генерировать видимые пользователем прерывания (трапы). Эти прерывания включают деление на ноль, переполнение, исчерпание порядка (underflow), неточный результат и неверную операцию. Эта опция требует, чтобы действовала опция -fno-signaling-nans. Установка этой опции может позволить получить более быстрый код, если вы полагаетесь, например, на «безостановочную» арифметику IEEE.
Эта опция не включается ни одной опцией -O, кроме -Ofast, поскольку она может привести к некорректному выводу для программ, зависящих от точной реализации правил/спецификаций IEEE или ISO для математических функций.
Значение по умолчанию — -ftrapping-math.
Будущие версии GCC могут предоставить более точный контроль над этим параметром с помощью прагмы C99
FENV_ACCESS. Эта опция командной строки будет использоваться вместе с -frounding-math для задания состояния по умолчанию дляFENV_ACCESS. -
-frounding-math -
Отключить преобразования и оптимизации, которые предполагают поведение округления с плавающей запятой по умолчанию (округление до ближайшего). Эту опцию следует указывать для программ, которые динамически изменяют режим округления чисел с плавающей запятой или могут выполняться в режиме округления, отличном от режима по умолчанию. Эта опция отключает свертку констант выражений с плавающей запятой во время компиляции (на которую может влиять режим округления) и арифметические преобразования, которые небезопасны при наличии зависящих от знака режимов округления.
Значение по умолчанию — -fno-rounding-math.
Эта опция является экспериментальной и в настоящее время не гарантирует отключение всех оптимизаций GCC, на которые влияет режим округления. Будущие версии GCC могут предоставить более точный контроль над этим параметром с помощью прагмы C99
FENV_ACCESS. Эта опция командной строки будет использоваться вместе с -ftrapping-math для задания состояния по умолчанию дляFENV_ACCESS. -
-fsignaling-nans -
Компилировать код в предположении, что сигнализирующие NaN (signaling NaN) стандарта IEEE могут генерировать видимые пользователем прерывания во время операций с плавающей запятой. Установка этой опции отключает оптимизации, которые могут изменить количество исключений, видимых при использовании сигнализирующих NaN. Эта опция подразумевает -ftrapping-math.
Эта опция приводит к определению макроса препроцессора
__SUPPORT_SNAN__.Значение по умолчанию — -fno-signaling-nans.
Эта опция является экспериментальной и в настоящее время не гарантирует отключение всех оптимизаций GCC, влияющих на поведение сигнализирующих NaN.
-
-fno-fp-int-builtin-inexact -
Не разрешать встроенным функциям
ceil,floor,roundиtrunc, а также их вариантамfloatиlong doubleгенерировать код, который возбуждает исключение «неточный результат» (inexact) для нецелых аргументов. Стандарты ISO C99 и C11 разрешают этим функциям возбуждать исключение «inexact», но ISO/IEC TS 18661-1:2014, привязки C к IEEE 754-2008, интегрированные в ISO C23, не разрешают этим функциям делать это.Значением по умолчанию является -ffp-int-builtin-inexact, разрешающее возбуждение исключения, если не выбран стандарт C23 или более поздний стандарт C. Эта опция ничего не делает, если не действует -ftrapping-math.
Даже если используется -fno-fp-int-builtin-inexact, если функции генерируют вызов функции библиотеки, исключение «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, чтобы улучшить оптимизацию на основе количества срабатываний каждой ветвления (branch). Когда программа, скомпилированная с -fprofile-arcs, завершает работу, она сохраняет счетчики выполнения дуг (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 -
Переупорядочивание функций на основе профильного инструментирования собирает время первого выполнения функции и упорядочивает эти функции по возрастанию с целью оптимизации запуска программы за счет более эффективной загрузки сегментов кода (text segments).
Включается с помощью -fprofile-use.
-
-fvpt -
В сочетании с -fprofile-arcs эта опция предписывает компилятору добавить код для сбора информации о значениях выражений.
При использовании с -fbranch-probabilities она считывает собранные данные обратно и фактически выполняет оптимизации на их основе. В настоящее время оптимизации включают специализацию операций деления с использованием знаний о значении знаменателя.
Включается с помощью -fprofile-use и -fauto-profile.
-
-frename-registers -
Попытка избежать ложных зависимостей в расписанном коде (scheduled code) путем использования регистров, оставшихся после распределения регистров. Эта оптимизация наиболее полезна для процессоров с большим количеством регистров. Однако в зависимости от формата отладочной информации, принятого целевой архитектурой, это может сделать отладку невозможной, так как переменные больше не остаются в «домашнем регистре».
Включено по умолчанию при использовании -funroll-loops.
-
-fschedule-fusion -
Выполняет зависящий от целевой платформы проход по потоку инструкций для совместного планирования инструкций одного типа, поскольку целевая машина может выполнять их более эффективно, если они находятся рядом друг с другом в потоке инструкций.
Включено на уровнях -O2, -O3, -Os.
-
-ftracer -
Выполнять дублирование хвостовых участков (tail duplication) для увеличения размера суперблока. Это преобразование упрощает поток управления функции, позволяя другим оптимизациям работать эффективнее.
Включается опциями -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 -
Отшелушивать (peel) циклы, для которых имеется достаточно информации о том, что они выполняют мало итераций (на основе обратной связи профиля или статического анализа). Это также включает полное развертывание циклов (т. е. полное удаление циклов с небольшим постоянным числом итераций).
Включается опциями -O3, -fprofile-use и -fauto-profile.
-
-fmalloc-dce -
Управляет тем, могут ли
malloc(и её варианты, такие какcallocилиstrdup) быть оптимизированы и удалены, при условии, что её возвращаемое значение используется только в качестве параметра вызоваfreeили сравнивается сNULL. Если используется -fmalloc-dce=1, разрешены только вызовыfree, в то время как при -fmalloc-dce=2 сравнения с указателемNULLтакже считаются безопасными для удаления.Значение по умолчанию — -fmalloc-dce=2. См. также -fallocation-dce.
-
-fmove-loop-invariants -
Включает проход вынесения инвариантов циклов (loop invariant motion) в RTL-оптимизаторе циклов. Включено на уровне -O1 и выше, за исключением -Og.
-
-fmove-loop-stores -
Включает проход вынесения сохранений из циклов (loop store motion) в оптимизаторе циклов GIMPLE. Это перемещает инвариантные операции сохранения за пределы конца цикла в обмен на перенос сохраняемого значения в регистре через итерации. Обратите внимание, что для того чтобы эта опция возымела эффект, также должно быть включено -ftree-loop-im. Включено на уровне -O1 и выше, за исключением -Og.
-
-fsplit-loops -
Разделить цикл на два, если он содержит условие, которое всегда истинно для одной стороны пространства итераций и ложно для другой.
Включается опциями -fprofile-use и -fauto-profile.
-
-funswitch-loops -
Переносить ветвления с инвариантными для цикла условиями за пределы цикла, дублируя цикл для обеих ветвей (с изменениями в соответствии с результатом условия).
Включается опциями -fprofile-use и -fauto-profile.
-
-fversion-loops-for-strides -
Если цикл перебирает массив с переменным шагом (stride), создать другую версию цикла, которая предполагает, что шаг всегда равен единице. Например:
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] = …;Это особенно полезно для массивов с предполагаемой формой (assumed-shape arrays) в Fortran, где (например) это позволяет улучшить векторизацию в предположении непрерывного доступа. Этот флаг включен по умолчанию при -O3. Он также включается опциями -fprofile-use и -fauto-profile.
-
-ffunction-sections -fdata-sections-
Помещать каждую функцию или элемент данных в собственную секцию в выходном файле, если целевая архитектура поддерживает произвольные секции. Имя функции или элемента данных определяет имя секции в выходном файле.
Используйте эти опции в системах, где компоновщик может выполнять оптимизации для улучшения локальности ссылок в пространстве кода. Большинство систем, использующих формат объектов ELF, имеют компоновщики с такими оптимизациями. На AIX компоновщик переупорядочивает секции (CSECT) на основе графа вызовов. Влияние на производительность различается.
В сочетании с уборкой мусора компоновщика (опция компоновщика --gc-sections) эти опции могут приводить к созданию меньших по размеру статически скомпонованных исполняемых файлов (после удаления символов).
В системах ELF/DWARF эти опции не ухудшают качество отладочной информации. Могут возникнуть проблемы с другими объектными файлами / форматами отладочной информации.
Используйте эти опции только тогда от этого есть значительная польза. При указании этих опций ассемблер и компоновщик создают более крупные объектные и исполняемые файлы, а также работают медленнее. Эти опции влияют на генерацию кода. Они предотвращают оптимизации со стороны компилятора и ассемблера, использующие относительные расположения внутри единицы трансляции, поскольку эти расположения неизвестны до момента компоновки. Примером такой оптимизации является превращение вызовов в инструкции короткого вызова.
-
-fstdarg-opt -
Оптимизировать пролог функций с переменным числом аргументов (variadic arguments) с точки зрения использования этих аргументов.
-
-fsection-anchors -
Попытаться уменьшить количество вычислений символьных адресов путем использования общих «якорных» символов (anchor symbols) для адресации близлежащих объектов. Это преобразование помогает уменьшить количество записей GOT и обращений к 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 не встраивает (inline) функции, содержащие больше определенного количества инструкций. Вы можете управлять некоторыми из этих констант в командной строке, используя опцию --param.
Имена конкретных параметров и значение их величин связаны с внутренней структурой компилятора и могут быть изменены без предварительного уведомления в будущих выпусках.
Чтобы получить минимальное, максимальное и значения по умолчанию для параметра, используйте опции --help=param -Q.
В каждом случае value является целым числом. Для всех целевых платформ распознаются следующие варианты name:
phiopt-factor-max-stmts-live-
При вынесении операторов из if/then/else это максимальное число операторов после определяющего оператора, на которое разрешено продлить время жизни имени.
predictable-branch-outcome-
Если вероятность того, что ветвление будет выполнено, ниже этого порога (в процентах), оно считается хорошо предсказуемым.
max-rtl-if-conversion-insns-
Преобразование if-conversion для RTL пытается удалить условные переходы вокруг блока и заменить их условно выполняемыми инструкциями. Этот параметр задаёт максимальное число инструкций в блоке, для которого следует рассматривать if-conversion. Компилятор также использует другие эвристики, чтобы определить, будет ли if-conversion, скорее всего, эффективным.
file-cache-files-
Максимальное число файлов в файловом кэше. Файловый кэш используется для вывода строк исходного кода в диагностических сообщениях и выполнения некоторых проверок исходного кода, например -Wmisleading-indentation.
file-cache-lines-
Максимальное число строк, индексируемых в файловом кэше. Если значение равно 0, размер определяется автоматически. Файловый кэш используется для вывода строк исходного кода в диагностических сообщениях и выполнения некоторых проверок исходного кода, например -Wmisleading-indentation.
max-rtl-if-conversion-predictable-cost-
Преобразование if-conversion для RTL пытается удалить условные переходы вокруг блока и заменить их условно выполняемыми инструкциями. Эти параметры задают максимально допустимую стоимость последовательности, которая будет создана при if-conversion, в зависимости от того, определяется ли статически предсказуемость ветвления. Единицы измерения этого параметра совпадают с единицами метрики GCC seq_cost. Компилятор попытается задать разумное значение по умолчанию, используя целевой макрос BRANCH_COST.
max-crossjump-edges-
Максимальное число входящих рёбер, учитываемых при слиянии переходов. Алгоритм, используемый -fcrossjumping, имеет сложность O(N^2) относительно числа входящих в каждый блок рёбер. Увеличение значения делает оптимизацию более агрессивной, повышая время компиляции, вероятно, при небольшом уменьшении размера исполняемого файла.
min-crossjump-insns-
Минимальное число инструкций, которые должны совпадать в конце двух блоков, чтобы для них было выполнено слияние переходов. Это значение игнорируется, если совпадают все инструкции блока, из которого выполняется слияние переходов.
max-grow-copy-bb-insns-
Максимальный коэффициент увеличения размера кода при копировании базовых блоков вместо перехода. Увеличение рассчитывается относительно инструкции перехода.
max-goto-duplication-insns-
Максимальное число инструкций, дублируемых в блоке, который выполняет переход к вычисляемому goto. Чтобы избежать поведения O(N^2) в нескольких проходах, GCC рано на этапе компиляции выносит вычисляемые goto, а объединяет их обратно как можно позже. Объединяются только вычисляемые переходы в конце базовых блоков, число инструкций в которых не превышает 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 ограничивает увеличение размера большой функции двукратным относительно исходного размера.
large-unit-insns-
Порог, определяющий большой модуль трансляции. Увеличение размера из-за встраивания в модулях, размер которых превышает этот предел, ограничивается параметром --param inline-unit-growth. Для небольших модулей это ограничение может быть слишком строгим. Например, рассмотрим модуль, состоящий из функции A, объявленной inline, и функции 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-
Задаёт максимальное число инструкций, до которого может увеличиться вынесенная копия саморекурсивной функции inline в результате рекурсивного встраивания.
--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++ с видимостью comdat будет совместно использоваться несколькими модулями компиляции.
modref-max-basesmodref-max-refsmodref-max-accesses-
Задаёт максимальное число базовых указателей, ссылок и обращений, сохраняемых анализом mod/ref для одной функции.
modref-max-tests-
Задаёт максимальное число проверок, которые может выполнить анализатор алиасов, чтобы различить адреса памяти с использованием информации mod/ref. Этот параметр должен быть больше, чем --param modref-max-bases и --param modref-max-refs.
modref-max-depth-
Задаёт максимальную глубину обхода в глубину, используемого анализом выхода за пределы modref. Значение 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-
Максимальное число похожих базовых блоков, с которыми сравнивается базовый блок. Используется для предотвращения квадратичного поведения при слиянии хвостов в дереве.
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-
Максимальное число инструкций, до которого может быть размотан цикл. Если цикл разматывается, этот параметр также определяет, сколько раз разматывается его код.
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-
Максимальное число запросов к анализатору алиасов на одну операцию записи. Большие значения увеличивают время компиляции и могут привести к удалению большего числа мёртвых операций записи.
scev-max-expr-size-
Ограничение на размер выражений, используемых анализатором скалярной эволюции. Большие выражения замедляют работу анализатора.
scev-max-expr-complexity-
Ограничение на сложность выражений в анализаторе скалярной эволюции. Сложные выражения замедляют работу анализатора.
max-tree-if-conversion-phi-args-
Максимальное число аргументов PHI, поддерживаемых преобразованием if-conversion для 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.
stack-clash-protection-probe-interval-
Защита от атак типа stack clash предусматривает проверку пространства стека по мере его выделения. Этот параметр задаёт максимальное расстояние между проверками стека как 2 в степени num байт. Более высокие значения могут сократить число явных проверок, однако значение, превышающее размер защиты, предоставляемой операционной системой, оставит код уязвимым для атак типа stack clash.
max-cse-path-length-
Максимальное число базовых блоков на пути, учитываемых CSE.
max-cse-insns-
Максимальное число инструкций, обрабатываемых CSE до сброса.
ggc-min-expand-
GCC использует сборщик мусора для управления собственной памятью. Этот параметр задаёт минимальный процент, на который куче сборщика мусора разрешено увеличиваться между циклами сборки. Настройка этого параметра может повысить скорость компиляции; на генерацию кода она не влияет.
Значение по умолчанию — 30% + 70% * (RAM/1GB), но не более 100% при RAM >= 1GB. Если доступен
getrlimit, под «RAM» понимается меньшее из значений фактического объёма RAM иRLIMIT_DATAилиRLIMIT_AS. Если GCC не может вычислить объём RAM на конкретной платформе, используется нижняя граница 30%. Если установить этот параметр и ggc-min-heapsize в 0, полная сборка будет выполняться при каждой возможности. Это крайне медленно, но может быть полезно для отладки. 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 в 0, полная сборка будет выполняться при каждой возможности.
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 modulo.
max-last-value-rtl-
Максимальный размер, измеряемый числом RTL, который может быть записан в выражении combiner для псевдорегистра как последнее известное значение этого регистра.
max-combine-insns
-
Максимальное число инструкций, которые RTL-комбинатор пытается объединить.
max-combine-search-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 отказывается создавать массивы, размер которых превышает число ветвей switch, умноженное на switch-conversion-max-branch-ratio.
switch-lower-slow-alg-max-cases-
Максимальное число вариантов, при котором используются медленные алгоритмы понижения switch.
max-partial-antic-length-
Максимальная длина частичного множества antic, вычисляемого при оптимизации частичного устранения избыточности в дереве (-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 уделять большое внимание ограничению на совпадение (номер дублированного операнда) во всех доступных альтернативах для предпочтительного класса регистров. Если задано значение 0, IRA учитывает ограничение на совпадение, только когда оно присутствует в единственной доступной альтернативе с подходящим классом регистров. В противном случае IRA проверяет все доступные альтернативы для предпочтительного класса регистров, даже если уже найден вариант с подходящим классом регистров, и учитывает найденное подходящее ограничение на совпадение.
ira-simple-lra-insn-threshold-
Приблизительное число инструкций функции в единицах по 1K, при котором запускается простое локальное распределение регистров.
lra-inheritance-ebb-probability-cutoff-
LRA пытается повторно использовать значения, повторно загруженные в регистры в последующих инструкциях. Эта оптимизация называется наследованием. Для её выполнения в качестве области используется EBB. Параметр задаёт минимальную вероятность ребра прямого перехода в процентах, необходимую для включения базового блока в EBB наследования в LRA. Значение по умолчанию выбрано на основе многочисленных запусков SPEC2000 на x86-64.
loop-invariant-max-bbs-in-loop-
Перемещение инвариантов цикла может быть очень затратным как по времени компиляции, так и по объёму необходимой во время компиляции памяти, если циклы очень большие. Для циклов, содержащих больше базовых блоков, чем задано этим параметром, оптимизация перемещения инвариантов цикла не выполняется.
loop-max-datarefs-for-datadeps-
Построение зависимостей данных для очень больших циклов обходится дорого. Этот параметр ограничивает число обращений к данным в циклах, рассматриваемых при анализе зависимостей данных. Эти большие циклы не обрабатываются оптимизациями, использующими зависимости данных цикла.
max-vartrack-size-
Задаёт максимальное число слотов хеш-таблицы, используемых при анализе потока данных для отслеживания переменных в любой функции. Если этот предел превышен при включённом отслеживании переменных в точках присваивания, анализ функции повторяется без этого режима после удаления из функции всех отладочных инструкций. Если предел превышен и без отладочных инструкций, анализ отслеживания переменных для этой функции полностью отключается. Значение 0 снимает ограничение.
max-vartrack-expr-depth-
Задаёт максимальное число уровней рекурсии при попытке сопоставить имена переменных или временные отладочные переменные с выражениями значений. Это позволяет обменять время компиляции на более полную отладочную информацию. Если значение слишком мало, выражения значений, которые доступны и могут быть представлены в отладочной информации, могут не использоваться; увеличение значения может помочь компилятору находить более сложные отладочные выражения, но при этом могут возрасти время компиляции и потребление памяти.
max-debug-marker-count-
Задаёт пороговое число отладочных маркеров (например, маркеров начала оператора), позволяющее избежать резкого роста сложности при встраивании или преобразовании в RTL. Если в функции больше таких операторов GIMPLE, чем задано пределом, они удаляются из встроенной копии функции и из её представления RTL.
min-nondebug-insn-uid-
Использовать для инструкций, не относящихся к отладке, идентификаторы UID, начиная с этого значения. Диапазон ниже заданного значения зарезервирован исключительно для отладочных инструкций, создаваемых параметром -fvar-tracking-assignments, однако при исчерпании зарезервированного диапазона отладочные инструкции могут получать непересекающиеся UID и выше этого значения.
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-
Максимальное число искусственных обращений к одной локальной переменной, отслеживаемых Scalar Replacement of Aggregates (SRA) для упрощения распространения копий.
tm-max-aggregate-size-
При создании копий локальных для потока переменных в транзакции этот параметр задаёт размер в байтах, после которого переменные сохраняются с помощью функций журналирования, а не пар последовательностей кода сохранения и восстановления. Этот параметр применяется только при использовании -fgnu-tm.
graphite-max-nb-scop-params-
Чтобы избежать экспоненциального роста при преобразованиях циклов Graphite, число параметров в статической управляющей области (SCoP) ограничено. Значение 0 снимает ограничение. Переменная, значение которой неизвестно во время компиляции и которая определена за пределами SCoP, является параметром SCoP.
hardcfr-max-blocks-
Отключить -fharden-control-flow-redundancy для функций, число блоков в которых превышает заданное значение. Значение 0 снимает ограничение.
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. Если это ограничение превышено, IPA-CP не будет строить предикат стоимости клонирования для варианта по умолчанию оператора 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-partition-locality-frequency-cutoff-
Знаменатель n дроби 1/n, задающей долю частоты выполнения вызываемой функции, необходимую для её клонирования для конкретного вызывающего кода. Специальное значение 0 предписывает всегда выполнять клонирование без порогового ограничения.
lto-partition-locality-size-cutoff-
Пороговый размер вызываемой функции с учётом встроенных вызовов для клонирования для конкретного вызывающего кода.
lto-max-locality-partition-
Максимальный размер раздела по локальности для LTO (в оценочном числе инструкций). Значение 0 означает использование значения по умолчанию.
lto-max-streaming-parallelism-
Максимальное число параллельных процессов, используемых для потоковой передачи LTO.
cxx-max-namespaces-for-diagnostic-help-
Максимальное число пространств имён, проверяемых при поиске подсказок, если при поиске имени C++ не удаётся найти идентификатор.
sink-frequency-threshold-
Максимальная относительная частота выполнения целевого блока (в процентах от частоты исходного блока оператора), при которой разрешено перемещение оператора вниз по потоку. Чем больше значение, тем агрессивнее перемещаются операторы. Для операторов с операндами-памятью применяется небольшая положительная поправка, поскольку перемещать такие операторы ещё выгоднее.
max-stores-to-sink-
Максимальное число пар условных сохранений, которые можно переместить вниз по потоку. Задайте значение 0, если отключена векторизация (-ftree-vectorize) или преобразование if (-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] включает подробный вывод отладочной информации решателя протягивания переходов.
parloops-chunk-size-
Размер блока планирования omp для циклов, распараллеленных с помощью parloops.
parloops-schedule-
Тип планирования omp для циклов, распараллеленных с помощью parloops (static, dynamic, guided, auto, runtime).
parloops-min-per-thread-
Минимальное число итераций на поток для самого внутреннего распараллеленного цикла, при котором предпочтителен распараллеленный вариант, а не однопоточный. Обратите внимание: для распараллеленного гнезда циклов минимальное число итераций самого внешнего цикла на поток равно двум.
max-ssa-name-query-depth-
Максимальная глубина рекурсии при запросе свойств имён SSA в таких процедурах, как процедуры свёртки. Один уровень рекурсии соответствует переходу по цепочке использования и определения.
max-speculative-devirt-maydefs-
Максимальное число возможных определений, анализируемых при поиске обязательного определения, задающего динамический тип объекта, который выполняет виртуальный вызов, потенциально поддающийся спекулятивной девиртуализации.
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-
Максимальная вероятность входного базового блока разделённой области (в процентах относительно входного базового блока функции), при которой выполняется частичное встраивание.
max-tracked-strlens-
Максимальное число строк, для которых проход оптимизации strlen отслеживает длины строк.
gcse-after-reload-partial-fraction-
Пороговое отношение для выполнения частичного устранения избыточности после перезагрузки.
gcse-after-reload-critical-fraction-
Пороговое отношение числа выполнений критических рёбер, при котором разрешено выполнять устранение избыточности после перезагрузки.
max-loop-header-insns-
Максимальное число инструкций в заголовке цикла, дублируемом проходом копирования заголовков циклов.
vect-epilogues-nomask-
Включить векторизацию эпилога цикла с использованием меньшего размера вектора.
-
vect-partial-vector-usage-
Управляет тем, когда векторизатор циклов рассматривает частичные векторные загрузки и сохранения как альтернативу переходу к скалярному коду. Значение 0 запрещает векторизатору использовать частичные векторные загрузки и сохранения. Значение 1 разрешает их, если векторизация устраняет необходимость итераций кода. Значение 2 разрешает частичные векторные загрузки и сохранения во всех циклах. Параметр действует только на целевых платформах, поддерживающих частичные векторные загрузки и сохранения.
vect-inner-loop-cost-factor-
Максимальный множитель, применяемый векторизатором циклов к стоимости операторов во внутреннем цикле относительно цикла, который векторизуется. Применяемый множитель равен максимуму из оценочного числа итераций внутреннего цикла и значения этого параметра. Значение параметра по умолчанию — 50.
vect-induction-float-
Включить векторизацию циклов с индукционными переменными с плавающей точкой.
vect-force-slp-
Принудительно использовать SLP при векторизации; завершить работу с ошибкой, если это невозможно.
vrp-block-limit-
Максимальное число базовых блоков, при превышении которого VRP переключается на алгоритм с меньшими требованиями к памяти.
vrp-sparse-threshold-
Максимальное число базовых блоков, при превышении которого VRP использует разреженный кэш растрового изображения.
vrp-switch-limit-
Максимальное число исходящих рёбер в операторе switch, при превышении которого VRP не обрабатывает этот оператор.
vrp-vector-threshold-
Максимальное число базовых блоков, при котором VRP использует базовый кэш-вектор.
avoid-fma-max-bits-
Максимальное число бит, для которого мы не создаём FMA.
fully-pipelined-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-
Включить защиту alloca/VLA в ASan.
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 в нормализованной цепочке предикатов.
uninit-max-prune-work-
Максимальный объём работы по отсечению путей, на которых переменная всегда инициализирована.
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-
Максимальный размер в байтах одной области объединения операций сохранения.
store-forwarding-max-distance-
Максимальное расстояние в инструкциях, на которое пересылка данных из небольшого сохранения в более широкую загрузку может вызвать задержку. Значение ’0’ отключает проверки стоимости для прохода по предотвращению пересылки данных из сохранения.
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 просматривает при вычислении диапазонов исходящих рёбер.
ranger-recompute-depth-
Максимальная глубина цепочек инструкций, рассматриваемых для повторного вычисления в калькуляторе диапазонов исходящих рёбер.
relation-block-limit-
Максимальное число отношений, регистрируемых oracle в базовом блоке.
transitive-relations-work-bound-
Ограничение объёма работы при обнаружении транзитивных отношений на основе существующих отношений.
min-pagesize-
Минимальный размер страницы для векторизации с предупреждениями и досрочным завершением.
openacc-kernels-
Задать режим обработки конструкций OpenACC ‘kernels’. При использовании --param=openacc-kernels=decompose конструкции OpenACC ‘kernels’ разбиваются на части — последовательность вычислительных конструкций, каждая из которых затем обрабатывается отдельно. Работа над этим режимом продолжается. При использовании --param=openacc-kernels=parloops конструкции OpenACC ‘kernels’ обрабатываются проходом ‘parloops’ целиком. Это текущий режим по умолчанию.
openacc-privatization-
Управлять выдачей диагностических сообщений о приватизации OpenACC параметрами -fopt-info-omp-note и соответствующими параметрами -fdump-tree-*-details. При использовании --param=openacc-privatization=quiet диагностика не выдаётся. Это текущий режим по умолчанию. При использовании --param=openacc-privatization=noisy диагностика выдаётся.
cycle-accurate-model-
Указывает, следует ли GCC предполагать, что описание планирования в основном представляет собой модель целевого процессора с точностью до такта, на котором должен выполняться код, при отсутствии промахов кэша. Ненулевое значение означает, что выбранная модель планирования точна и, вероятно, описывает процессор с последовательным выполнением команд, а также что при планировании следует активно использовать пролив, чтобы по возможности заполнить паузы в конвейере. Это текущее значение по умолчанию. Нулевое значение означает, что описание планирования может быть недоступно, неточным или вовсе неприменимым, например для современных процессоров с внеочередным выполнением команд.
Для целевых платформ AArch64 доступны следующие варианты name:
aarch64-vect-compare-costs-
При векторизации рассматривать несколько различных подходов и выбирать наиболее дешёвый с помощью модели стоимости. В частности:
- Пробовать и SVE, и Advanced SIMD, если доступна SVE.
- Пробовать использовать векторы Advanced SIMD шириной 64 бита для самых маленьких элементов данных вместо векторов шириной 128 бит для всех элементов.
- Пробовать использовать «неупакованные» векторы SVE для элементов меньшего размера. В частности, хранить элементы меньшего размера в контейнерах большего размера и обращаться к ним с помощью расширяющих загрузок и усекающих сохранений.
aarch64-float-recp-precision-
Число итераций Ньютона для вычисления обратного значения типа float. При включённом приближённом делении точность деления пропорциональна этому параметру. Значение по умолчанию — 1.
aarch64-double-recp-precision-
Число итераций Ньютона для вычисления обратного значения типа double. При включённом приближённом делении точность деления пропорциональна этому параметру. Значение по умолчанию — 2.
aarch64-autovec-preference-
Принудительно задать стратегию выбора ISA для автоматической векторизации.
- ‘default’
Использовать эвристики по умолчанию.
- ‘asimd-only’
Использовать для автоматической векторизации только Advanced SIMD.
- ‘sve-only’
Использовать для автоматической векторизации только SVE.
- ‘prefer-asimd’
Использовать Advanced SIMD и SVE. При равной стоимости отдавать предпочтение Advanced SIMD.
- ‘prefer-sve’
Использовать Advanced SIMD и SVE. При равной стоимости отдавать предпочтение SVE.
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-
Векторизатор использует доступные сведения о настройке, чтобы определить, будет ли полезно развернуть основной векторизованный цикл и насколько. Этот параметр задаёт верхнюю границу степени развёртывания основного цикла векторизатором. Значение по умолчанию — четыре.
Для целевых платформ GCN доступны следующие варианты name:
gcn-preferred-vectorization-factor-
Предпочтительный коэффициент векторизации: ‘default’, ‘32’, ‘64’.
Для целевых платформ i386 и x86_64 доступны следующие варианты name:
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-15.3.0/gcc/Optimize-Options.html