C ユーザーズガイド

-xO[1|2|3|4|5]

オブジェクトコードを最適化します。-xO と指定することは、-xO2 を指定することと同じです。

-O オプションと -g オプションを組み合わせて使用すると、特定の範囲だけをデバッグすることができます。

最適化のレベルは 1 から 5 のうちのいずれかです。使用するプラットフォームによって変わります。

(SPARC)

-xO1

最小限の局所的な最適化 (ピープホール) を行います。

-xO2

基本的な局所的および大域的最適化を行います。ここでは帰納変数の削除、局所的および大域的な共通部分式の除去、算術の簡素化、コピー通達、定数通達、不変ループの最適化、レジスタの割り当て、基本ブロックのマージ、再帰的末尾の除去、無意味なコードの除去、末尾呼び出しの削除、複雑な式の展開を行います。

-xO2 レベルでは、大域、外部、間接の参照または定義はレジスタに割り当てられません。これらの参照や定義は、あたかも volatile 型として宣言されたかのように取り扱われます。一般的にコードサイズは最も小さくなります。

-xO3

-xO2 に加えて、外部変数の参照または定義も最適化します。ループの展開やソフトウェアのパイプラインなども実行されます。-xO3 レベルではポインタ割り当ての結果を追跡しません。デバイスドライバをコンパイルするとき、またはシグナルハンドラの内部から外部変数を変更するプログラムをコンパイルするときは、volatile 型の修飾子を使用してオブジェクトが最適化されないようにする必要があります。一般的に -xO3 レベルではコードサイズが増大します。

-xO4

-xO3 に加えて、同一のファイルに含まれている関数の自動的なインライン化も行います。通常はこれによって実行速度が上がります。このレベルでは、ポインタ代入の結果が追跡され、通常はコードサイズが増大します。

-xO5

最高レベルの最適化を生成します。この最適化アルゴリズムは、コンパイルの所要時間がより長く、または実行時間が確実に短縮化されるわけではないという短所がありますが、プロファイルフィードバックを伴って実行するとパフォーマンスをより向上させやすくなります。-xprofile=pを参照してください。

(x86)

-xO1

デフォルトの最適化での 1 つの段階の他に、メモリーからの引数の事前ロードと、クロスジャンプ (末尾融合) を行います。

-xO2

高レベルと低レベルの両方の命令をスケジュールし、改良されたスピルコードの解析、ループ中のメモリー参照の除去、レジスタの寿命解析、高度なレジスタ割り当て、大域的な共通部分式の除去を行います。

-xO3

レベル 2 で行う最適化の他に、ループの削減と帰納変数の除去を行います。

-xO4

レベル 23 で行う最適化の他に、ループの展開と、可能であればスタックフレーム生成の回避、および同一ファイルに含まれる関数の自動インライン化を行います。この最適化を行うと、adbdbx のスタックトレースに誤りが発生する可能性があるので注意してください。

-x05

最高レベルの最適化を行います。この最適化アルゴリズムは、コンパイルの所要時間が長く、また実行時間が確実に短縮される保証がありません。たとえば、エクスポートされた関数が局所的に呼び出されるような関数の入口を設定する、スピルコードを最適化する、命令スケジュールを向上するための解析を追加するなどがあります。

オプティマイザによりメモリーが不足した場合は、最適化のレベルを下げて現在の関数を再試行することによって回復を試みます。これ以後の関数に対してはコマンド行オプションで指定されている本来のレベルで再開します。

-xO3 または -xO4 で (1 つの関数内のコードが数千行になるような) 大きな関数を最適化する場合、膨大な量の仮想メモリーが必要になり、マシンのパフォーマンスが低下することがあります。