/*
* O3 的描述如下:
*/
-O3 完美包含 -O2 的全部优化选项,还有额外的优化。
-fgcse-after-reload
如果启用了-fgcse after reload,则会在重新加载后执行冗余负载消除过程。此通行证的目的是清理多余的溢出物。
由-O3、-fprofile使用和-futo配置文件启用。
-fipa-cp-clone
进行功能克隆,使过程间恒定传播更强。启用时,当可以使用常量参数调用外部可见函数时,过程间常量传播会执行函数克隆。
因为这种优化可以创建函数的多个副本,所以它可能会显著增加代码大小(请参阅--param ipa cp unit growth=value)。
默认情况下,此标志在-O3处启用。fprofile use和-futo profile也启用了它。
-floop-interchange
在石墨外进行回路交换。此标志可以提高循环嵌套上的缓存性能,并允许进行进一步的循环优化,如矢量化。例如,循环
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和-futo profile也启用了它。
-floop-unroll-and-jam
对可行循环应用展开和阻塞变换。在循环嵌套中,这会将外循环展开一些因子,并融合由此产生的多个内循环。
默认情况下,此标志在-O3处启用。fprofile use和-futo profile也启用了它。
-fpeel-loops
Peels循环有足够的信息,它们不会滚动太多(来自配置文件反馈或静态分析)。
它还开启了完整的循环剥离(即,以较小的恒定迭代次数完全去除循环)。
由-O3、-fprofile使用和-futo配置文件启用。
-fpredictive-commoning
执行预测通用优化,即重用在循环的先前迭代中执行的计算(尤其是内存加载和存储)。
此选项在-O3级别启用。fprofile use和-futo profile也启用了它。
-fsplit-loops
如果循环包含一个条件,该条件对迭代空间的一侧始终为true,对另一侧始终为false,则将循环一分为二。
由-fprofile使用和-futo配置文件启用。
-fsplit-paths
分割导致循环后边缘的路径。这可以改进死代码消除和公共子表达式消除。默认情况下,在-O3及以上时启用此选项。
-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和-futo profile也启用了它。
-ftree-partial-pre
使部分冗余消除(PRE)更具攻击性。默认情况下,此标志在-O3处启用。
-funswitch-loops
将具有循环不变条件的分支移出循环,在两个分支上都有循环的副本(根据条件的结果进行修改)。
由-fprofile使用和-futo配置文件启用。
-fvect-cost-model=dynamic
-fversion-loops-for-strides
如果一个循环在一个具有可变步长的数组上迭代,请创建另一个假设步长始终为一的循环版本。例如:
for (int i = 0; i < n; ++i)
x[i * stride] = …;
becomes:
if (stride == 1)
for (int i = 0; i < n; ++i)
x[i] = …;
else
for (int i = 0; i < n; ++i)
x[i * stride] = …;
这对于Fortran中的假定形状数组特别有用,例如,它允许在假定连续访问的情况下进行更好的矢量化。
默认情况下,此标志在-O3处启用。fprofile use和-futo profile也启用了它。