7

GCC マニュアルによると、-fipa-pta最適化は次のことを行います。

-fipa-pta: 手続き間のポインター分析と手続き間の変更および参照分析を実行します。このオプションは、大規模なコンパイル単位で過度のメモリとコンパイル時の使用を引き起こす可能性があります。デフォルトでは、どの最適化レベルでも有効になっていません。

私が想定しているのは、GCC は、プロシージャーで使用されるポインターと参照に基づいて、可変データと不変データを区別しようとすることです。より深い GCC の知識を持つ人は、何を説明でき-fipa-ptaますか?

4

2 に答える 2

6

「インタープロシージャル」という言葉がここでの鍵だと思います。

私は 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置き換えることさえできると判断できます。printfputs("ptr = 123.456");

(実際、上記のコード スニペットに似た小さなプログラムを使用して、 と を使用して同じコードを生成した-O3ため-O3 -fipa-pta、おそらく何かが不足しています。)

典型的なプログラムには多数の関数が含まれており、膨大な数の呼び出しシーケンスが考えられるため、この種の分析には非常にコストがかかる可能性があります。

于 2012-10-25T19:46:31.783 に答える