简而言之,GCC选项-fipa-pta做什么?

mue*_*bau 6 c++ gcc compiler-optimization

根据GCC手册,-fipa-pta优化确实:

-fipa-pta:执行过程间指针分析和过程间修改和参考分析.此选项可能导致大型编译单元的内存和编译时使用过多.默认情况下,在任何优化级别都不会启用它.

我假设GCC试图根据过程中使用的指针和引用来区分可变和不可变数据.有更深入的GCC知识的人可以解释一下是-fipa-pta做什么的吗?

Kei*_*son 5

我认为"过程间"这个词是关键所在.

我并不熟悉gcc的优化器,但之前我一直致力于优化编译器.以下是有点推测的; 拿一小块盐,或与知道gcc内部的人确认.

优化编译器通常仅在每个单独的函数(或子例程或过程,取决于语言)内执行分析和优化.例如,给定代码就像这个人为的例子:

double *ptr = ...;

void foo(void) {
    ...
    *ptr = 123.456;
    some_other_function();
    printf("*ptr = %f\n", *ptr);
}
Run Code Online (Sandbox Code Playgroud)

优化器将无法确定*ptr调用的值是否已更改some_other_function().

如果启用了过程间分析,则优化器可以分析其行为some_other_function(),并且可能能够证明它无法修改*ptr.鉴于此类分析,它可以确定表达式*ptr仍然必须评估123.456,并且原则上它甚至可以替换printf调用puts("ptr = 123.456");.

(事实上​​,对于一个类似于上面代码片段的小程序,我用-O3和得到了相同的生成代码-O3 -fipa-pta,所以我可能会遗漏一些东西.)

由于典型程序包含大量功能,并且具有大量可能的呼叫序列,因此这种分析可能非常昂贵.

  • 听起来很有道理。我将从这里进一步调查。我暂时接受了您的回答,但也许具有更深入的 gcc 知识的人仍然可以做出贡献。 (2认同)