Oracle Solaris Studio 12.2: C ユーザーガイド

B.2.122 -xO[1|2| 3|4|5]

オブジェクトコードを最適化します。大文字 O のあとに数字の 12345 のいずれかが続きます。一般に、最適化レベルが高いほど、実行時のパフォーマンスは向上します。しかし、最適化レベルが高ければ、それだけコンパイル時間が増え、実行可能ファイルが大きくなる可能性があります。

ごくまれに、-xO2 の方がほかの値より実行速度が速くなることがあり、-xO3 の方が -xO4 より早くなることがあります。すべてのレベルでコンパイルを行なってみて、こうしたことが発生するかどうか試してみてください。

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

デフォルトでは最適化は行われません。ただし、これは最適化レベルを指定しない場合にかぎり有効です。最適化レベルを指定すると、最適化を無効にするオプションはありません。

最適化レベルを設定しないようにする場合は、最適化レベルを示すようなオプションを指定しないようにしてください。たとえば、-fast は最適化を -xO5 に設定するマクロオプションです。それ以外で最適化レベルを指定するすべてのオプションでは、最適化レベルが設定されたという警告メッセージが表示されます。最適化を設定せずにコンパイルする唯一の方法は、コマンド行またはメイクファイルから最適化レ ベルを指定するオプションをすべて削除することです。

-xO3 以下の最適化レベルで -g を指定すると、ほぼ完全な最適化と可能なかぎりのシンボル情報を取得することができます。末尾呼び出しの最適化とバックエンドのインライン化は無効です。

-xO4 以上の最適化レベルで -g を指定すると、完全な最適化と可能なかぎりのシンボル情報を取得することができます。

-g を指定したデバッグでは、-xOn が抑制されませんが、-xOn はいくつかの方法で -g を制限します。たとえば、最適化オプションを使用すると、dbx から渡された変数を表示できないなど、デバッグの機能が一部制限されます。しかし、dbx where コマンドを使用して、シンボリックトレースバックを表示することは可能です。詳細は、『dbx コマンドによるデバッグ』の第 1 章の「最適化コードのデバッグ」を参照してください。

-xO-xmaxopt の両方を指定する場合、-xO で設定する最適化レベルが -xmaxopt 値を超えてはいけません。

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

B.2.122.1 SPARC での最適化について

次の表は、SPARC プラットフォームでの最適化処理について説明しています。

表 B–33 SPARC プラットフォームでの -xO のフラグ

値  

意味  

-xO1

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

-xO2

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

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

-xO3

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

-xO4

-xO3 に加えて、同一のファイルに含まれている関数の自動的なインライン化も行います。通常はこれによって実行速度が上がります。インライン化される関数を制御したい場合は、「B.2.96 -xinline=listを参照してください。

このレベルでは、ポインタ代入の結果が追跡され、通常はコードサイズが増大します。 

-xO5

最高レベルの最適化を行おうとします。この最適化アルゴリズムは、コンパイルの所要時間が長く、また実行時間が確実に短縮される保証がありません。このレベルの最適化によってパフォーマンスが改善される確率を高くするには、プロファイルのフィードバックを使用します。詳細は、「B.2.136 –xprofile=pを参照してください。

B.2.122.2 x86 での最適化について

次の表は、x86 プラットフォームでの最適化処理について説明しています。

表 B–34 x86 プラットフォームでの -xO のフラグ

値 

意味  

-xO1

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

-xO2

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

-xO3

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

-xO4

-xO3 レベルで行う最適化レベルに加えて、同じファイルに含まれる関数のインライン展開も自動的に行われます。インライン展開を自動的に行なった場合、通常は実行速度が速くなりますが、遅くなることもあります。一般にこのレベルを使用するとコードサイズが大きくなります。

-xO5

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

デバッグについての詳細は、『『Solaris Studio: dbx コマンドによるデバッグ』』を参照してください。最適化についての詳細は、『『Solaris Studio 12: パフォーマンスアナライザ』』マニュアルを参照してください。

-xldscope および -xmaxopt も参照してください。