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