-O


最適化のレベル,または各最適化項目の詳細を指定します。

[指定形式]

-O[level]
-O[item[=value][,item[=value]]...]

 

-

省略時解釈

デバッグに影響しない最適化のみを行います(-Odefaultオプションの指定と同じです)。

[詳細説明]

-

最適化のレベル,または各最適化項目の詳細を指定します。

-

levelに指定可能なものを以下に示します。
これ以外のものを指定した場合は,エラーとなります。

nothing

デバッグ優先の最適化

デバッグのしやすさを重視し,デフォルトで実行する最適化を含むすべての最適化を抑止します。

default

デフォルト

デバッグに影響しない範囲の最適化(式の最適化,およびレジスタ割り付けなど)を行います。

size

オブジェクト・サイズ優先の最適化

ROM/RAM容量の削減を重視して,一般的なプログラムに対して有効な最大限の最適化を行います。

speed

実行速度優先の最適化

実行速度の短縮を重視して,一般的なプログラムに対して有効な最大限の最適化を行います。

 

-

level,およびitemを省略した場合は,sizeを指定したものとみなします。

-

item,およびvalueに指定可能なものを以下に示します。
これ以外のものを指定した場合は,エラーとなります。

最適化項目(item

パラメータ(value

説明

unroll

0〜4294967295

(整数値)

ループ展開

ループ文(for,while,do-while)を展開します。

valueで,最大で何倍の展開を行うかを指定します。

valueの値0は値1と同じ意味となります。

valueを省略した場合は,4を指定したものとみなします。

本項目は,-Ospeedオプションを指定した場合は,-Ounroll=4オプションを指定したものとみなします。

inline

0〜3

(整数値)

関数のインライン展開

valueは,展開のレベルを表します。

0:#pragma inline指定した関数を含めて,すべてのインライン展開を抑止します。

1:#pragma inline指定した関数のみ展開します。

2:自動的に展開対象の関数を判別して展開します。

3:コード・サイズがなるべく増加しない範囲で,自動的に展開対象の関数を判別して展開します。

ただし,1〜3を指定した場合でも,関数の内容やコンパイル状況により,#pragma inline指定した関数が展開されない場合があります。

valueを省略した場合は,2を指定したものとみなします。

本項目は,-Osize,または-Ospeedオプションを指定した場合に有効です(-Osizeオプションを指定した場合は-Oinline=3,-Ospeedオプションを指定した場合は-Oinline=2オプションを指定したものとみなします)。

-Osize,-Ospeed,-Oinlineオプションのいずれも指定していない場合は,-Oinline=1オプション指定したものとみなします。

-Onothingオプションを指定した場合は,-Oinline=0オプションを指定したものとみなします。

inline_size

0〜65535

(整数値)

インライン展開サイズ

コード・サイズが何%増加するまでインライン展開を行うかを指定します。

valueを省略した場合は,100を指定したものとみなします。

本項目は,-Oinline=2オプションを指定した場合に有効です(-Ospeedオプションによる指定も含みます)。

inline_init

【V1.07.00以降】

on,またはoff

自動変数の初期化子の即値化

onを指定した場合,自動変数の初期化を常に即値の代入で行います。

offを指定した場合,初期化をメモリ間コピーで行うか,即値の代入で行うかを,コンパイラが自動的に選択します。

valueを省略した場合は,onを指定したものとみなします。

delete_static_func

on,またはoff

未使用static関数の削除

valueを省略した場合は,onを指定したものとみなします。

本項目は,-Onothingオプション指定時以外に有効です。

pipeline

on,またはoff

パイプライン最適化

valueを省略した場合は,onを指定したものとみなします。

tail_call

on,またはoff

関数末尾の関数呼び出しのjr化

onを指定した場合,関数の末尾が関数呼び出しであり,かつ一定の条件を満たす場合に,その呼び出しに対してjarl命令ではなくjr命令を生成してlpの退避/復帰コードを削除し,コード・サイズを削減します。

ただし,一部のデバッグ機能を使用することができなくなります。

valueを省略した場合は,onを指定したものとみなします。

本項目は,-Ospeed,または-Osizeオプションを指定した場合に有効です。

map

ファイル名

外部変数アクセス最適化

最適化リンカが生成する外部シンボル割り付け情報を元にベースアドレスを設定し,外部変数,または静的変数のアクセスをベース・アドレス相対で行うコードを生成します。

また,スタートアップ・ルーチンでシンボル“__gp_data”を定義してgpに値を設定するコードを記述した場合,外部シンボル割り付け情報を元に,可能であれば変数のアクセスをgp相対で行うコードを生成します。

ファイル名には,最適化リンカが生成した外部シンボル割り付け情報ファイルを指定します。

ファイル名を省略した場合は,一度リンク処理まで実行し,外部シンボル割り付け情報ファイルを作成したのち,再度コンパイルからリンクまでの処理を行います。

smap

なし

コンパイル単位内で定義された外部変数に対する外部変数アクセス最適化

コンパイル対象ファイル内で定義された外部変数,または静的変数についてベース・アドレスを設定し,アクセスをベース・アドレス相対で行うコードを生成します。

 

-

同じitemについて,本オプションを複数指定した場合は,あとから指定したものが有効となります。

-

-Oitemのあとに-Olevelを指定した場合,さきに指定した-Oitemは無効になります。ただし,-Omap,-Osmapは,-Olevelの影響をうけません。

-

-Oitemを指定しなかった場合の最適化項目は,-Olevelの指定によって以下のように解釈します。

最適化項目(item

最適化レベル(level

nothing

default

size

speed

unroll

1

1

1

4

inline

0

1

3

2

inline_size

100

inline_init

off

off

off

on

delete_static_func

off

on

on

on

pipeline

off

off

off

on

tail_call

off

off

on

on

map

smap

この表は,あるlevelを指定すると同時に,itemの指定内容を他のlevelのitemの設定に合わせたとしても,他のlevelと同等の最適化を実施することを示すものではありません。例えば,“-Ospeed”という指定と,“-Osize -Ounroll=4 -Oinline=2 -Oinline_size=100 -Opipeline=on”という指定では,同じ出力コードにならない場合があります。

[使用例]

-

オブジェクト・サイズ優先の最適化を行います。

>ccrh -Osize -Xcommon=rh850 main.c