Короче говоря, что делает опция 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, так что я, вероятно, что-то пропустил.)

поскольку типичная программа содержит большое количество функций, с огромный количество возможных последовательностей вызовов, такой анализ может быть очень дорогим.