Согласно руководству GCC, -fipa-pta
оптимизация делает:
-fipa-pta
: Выполнить межпроцедурный анализ указателя, а также межпроцедурную модификацию и эталонный анализ. Эта опция может вызвать чрезмерную
использование памяти и времени компиляции на больших единицах компиляции. Это не
включен по умолчанию на любом уровне оптимизации.
Я предполагаю, что GCC пытается дифференцировать изменчивые и неизменные данные на основе указателей и ссылок, используемых в процедуре. Может кто-то с более глубокими знаниями GCC объяснить, что -fipa-pta
делает?
Я думаю, что слово «межпроцедурный» является ключевым здесь.
Я не очень хорошо знаком с оптимизатором gcc, но раньше работал над оптимизацией компиляторов. Следующее является несколько умозрительным; возьмите его с небольшим количеством соли или подтвердите это кому-то, кто знает внутренности gcc.
Оптимизирующий компилятор обычно выполняет анализ и оптимизацию только внутри каждой отдельной функции (или подпрограммы, или процедуры, в зависимости от языка). Например, данный код похож на этот надуманный пример:
double *ptr = ...;
void foo(void) {
...
*ptr = 123.456;
some_other_function();
printf("*ptr = %f\n", *ptr);
}
оптимизатор не сможет определить, является ли значение *ptr
был изменен при вызове some_other_function()
,
Если межпроцедурного анализ включен, тогда оптимизатор может анализировать поведение some_other_function()
и может быть в состоянии доказать, что он не может изменить *ptr
, Учитывая такой анализ, он может определить, что выражение *ptr
должен еще оценить 123.456
и в принципе это могло бы даже заменить printf
позвонить с puts("ptr = 123.456");
,
(На самом деле, с небольшой программой, похожей на приведенный выше фрагмент кода, я получил такой же сгенерированный код с -O3
а также -O3 -fipa-pta
так что я наверное что-то упустил.)
Поскольку типичная программа содержит большое количество функций, с огромный Количество возможных последовательностей вызовов, этот вид анализа может быть очень дорогим.
Других решений пока нет …