1.4 コンパイラの使用
1.4.3 インクルードファイル
-M
オプション:
-Mmodel 引数:
使用するメモリモデル。modelは次のいずれかになります。
s スモール
c コンパクトコード d コンパクトデータ
l ラージ
デフォルト:
-Ms 説明:
使用するデータメモリモデルを指定します。
例:
c88 -M1 test.c 参照:
"1.2.2.2 メモリモデル"
-O
オプション:
-Oflag 引数:
0または1 デフォルト:
-O1 説明:
最適化を制御します。最適化のオン、オフを切り換えるために、0または1の数字を指定します。
-O0 最適化はオフになります。
-O1 デフォルト。c88が最小のコードを生成するよう最適化を設定します。
以下に、最適化項目と-Oオプション指定による実行内容を説明します。
エイリアスチェックの緩和
-O1を使用するとエイリアスチェックが緩和されます。書き込み操作が間接(計算)アドレス経由で行わ
れる場合、レジスタに記憶されているユーザ変数の内容が消去されません。
-O0を使用すると、厳密なエイリアスチェックが実行されます。このオプションを指定すると、書き込 み操作が間接(計算)アドレス経由で行われる場合、コンパイラは、レジスタに記憶されているユーザ変 数のすべての内容を消去します。
初期化されていないスタティック変数およびグローバル変数のクリア
-O1、-O0のどちらを指定した場合でも、コンパイラは、初期化されていないスタティック変数とグロー バル変数を"クリア"します。
共通項のまとめ
-O1を使用すると、CSE(共通項のまとめ)がオンになります。このオプションを指定すると、コンパイ
ラはCコード内で共通式を探します。共通式は1回だけ評価され、その結果が一時的にレジスタ内に保持 されます。
-O0を使用すると、CSE(共通項のまとめ)がオフになります。このオプションを指定すると、コンパイ
ラは共通式を探しません。また、エイリアスチェック、式の置換、不変コードのループ外への移動がす べて無効になります。
例:
/*
* Compile with -O0,
* Compile with -O1, common subexpressions are found * and temporarily saved.
*/
char x, y, a, b, c, d;
void
main( void ) {
x = (a * b) - (c * d);
y = (a * b) + (c * d); /*(a*b) and (c*d) are common */
}
データフロー、明示的代入文の定数式化
-O1を使用すると、定数およびコピーの伝搬がオンになります。このオプションを指定すると、コンパ イラは定数値が変数へ割り当てられている場合を探し、それ以降その変数が他の変数に割り当てられて いれば定数値で置き換えます。
-O0を使用すると、定数とコピーの伝搬がオフになります。
例:
/*
* Compile with -O0, 'i' is actually assigned to 'j'
* Compile with -O1, 15 is assigned to 'j', 'i' was propagated */
int i;
int j;
void
main( void ) {
i = 10;
j = i + 5;
}
式の置換
-O1を使用すると、式の置換がオンになります。このオプションを指定すると、コンパイラは式が変数 へ割り当てられている場合を探し、それ以降その変数が他の変数に割り当てられていればその式で置き 換えます。
-O0を使用すると、式の置換がオフになります。
例:
/*
* Compile with -O0, normal cse is done * Compile with -O1, 'i+j' is propagated.
*/
unsigned i, j;
int
main( void ) {
static int a;
a = i + j;
return (a);
}
コードフロー、順序の変更
-O1を使用すると、中間ファイルで制御フローの最適化とコード順序の変更がオンになります。たとえ ば、ジャンプの変更や条件ジャンプの反転などがこれに該当します。
-O0を使用すると、制御フローの最適化がオフになります。
例:
次の例は、制御の最適化の状況を示しています。
/*
* Compile with -O0
* Compile with -O1, compiler finds first time 'i' is * always < 10, the unconditional jump is removed.
*/
int i;
void
main( void ) {
for( i=0; i<10; i++ ) {
do_something( );
} }
次の例は、条件ジャンプの反転の状況を示しています。
/*
* Compile with -O0, code as written sequential * Compile with -O1, code is rearranged
* Code rearranging enables other optimizations to optimize better, e.g. CSE */
int i;
extern void dummy( void );
void main( ) {
do {
if ( i ) {
i--;
} else {
i++;
break;
}
dummy( );
} while ( i );
}
ピープホール最適化
-O1を使用すると、ピープホール最適化がオンになります。これにより、冗長なコードが削除されます。
ピープホールオプティマイザは、冗長な命令、または命令の数を少なくするために結合できる命令シー ケンスを探します。
-O0を使用すると、ピープホール最適化がオフになります。
不変コードのループ外への移動
-O1を使用すると、不変コードがループ外へ移されます。
-O0を使用すると、不変コードのループ外への移動がオフになります。
例:
/*
* Compile with -O0, normal cse is done
* Compile with -O1, invariant code is found in * the loop, code is moved outside the loop.
*/
void
main( void ) {
char x, y, a, b;
int i;
for( i=0; i<20; i++ ) {
x = a + b;
y = a + b;
} }
高速ループ(コードサイズの増加)
-O1、-O0のどちらを指定した場合でも、高速ループがオフになります。
コードサイズの縮小
-O1を使用すると、サイズの小さなコードが作成されます。可能であれば、使用される命令の数が削減 されます。ただし、このオプションを使用すると、命令サイクルは多くなります。
-O0を使用すると、最小コード最適化がオフになります。
ループの展開
-O1、-O0のどちらを指定した場合でも、ループの展開がオフになります。
添字の効率的な最適化
-O1を使用すると、添字の効率的な最適化がオンになります。このオプションを指定すると、コンパイ ラは、インデックス変数に関連する式の効率的な最適化をしようとします。
-O0を使用すると、添字の効率的な最適化がオフになります。
例:
/*
* Compile with -O0, disable subscript strength reduction * Compile with -O1, begin and end address of 'a' are
* determined before the loop and temporarily put in registers * instead of determining the address each time inside the loop */
int i;
int a[4];
void
main( void ) {
for( i=0; i<4; i++ ) {
a[i] = i;
} }
-o
オプション:
-o file 引数:
出力ファイルの名前。ファイル名はオプションの直後に続けられません。オプションの後にタブまたは スペースを入れる必要があります。
デフォルト:
.src接尾辞を持つモジュール名。
説明:
.src接尾辞を持つモジュール名の代わりに、fileを出力ファイル名として使用します。最初に見つ かった-oオプションが最初にコンパイルするファイルに適用され、2番目の-oオプションが2番目のコ ンパイルファイルに適用されるという具合になるため、このオプションを使用するときは、特に注意 が必要です。
例:
次のコマンドが指定された場合、
c88 file1.c file2.c -o file3.src -o file2.src
file1.cがコンパイルされてfile3.srcが作成され、file2.cがコンパイルされてfile2.srcが作成 されて、2つのファイルが作成されます。
-s
オプション:
-s プラグマ:
source 説明:
Cソースコードを、生成されたアセンブラコードとマージして、ファイルに出力します。
例:
c88 -s test.c
; test.c:
; 1 |int i;
; 2 |
; 3 |int
; 4 |main( void )
; 5 |{
extern __START global _main 参照: