「インタープロシージャル」という言葉がここでの鍵だと思います。
私は 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
、おそらく何かが不足しています。)
典型的なプログラムには多数の関数が含まれており、膨大な数の呼び出しシーケンスが考えられるため、この種の分析には非常にコストがかかる可能性があります。