第18回 GCC2.95から追加変更のあったオプションの補足と検証(その6)

岸 哲夫

 Fedora2がリリースされ,カーネル2.6が採用されました.CPUも,日を追うごとに高速化していますが,よりいっそうコードの効率化も要求されることでしょう.

 今回は,引き続きGCC2.95から追加変更のあったオプションの補足と検証を行います.重要な「最適化オプション」について扱います. (筆者)

space

-fgcse,-fgcse-lm,-fgcse-sm

  共通部分式の除去やコピー伝播の技法を用いた最適化を行います.-fgcse-lmの場合,それに加えて意味のないループ内のストアやロードを移動し,それをループの外側に追い出すことを試行します.-fgcse-smの場合,ロードやストアを含んでいるループはそのループの前後に移動することを試みます.

 このオプションは単独で使用して,その効果を明示することが困難なのでプログラム例は略します.

-fif-conversion,-fif-conversion2

 アセンブラに展開された状態で生成される,コンディション・フラグによる条件分岐を最適化します.

 このオプションもまた単独で使用して,その効果を明示することが困難なのでプログラム例は略します.

-finline-functions

 このオプションを指定すると単純なstatic関数をインライン関数に置き換えます.このオプションは-O3オプションとともに指定します.

 ソースと生成されたコードを,リスト1リスト3に示します.

 この最適化の結果,関数test1の呼び出しが,実際の命令に置き換えられています.何度もtest1を呼び出す場合,コードのサイズが大きくなりますが,関数呼び出しにかかるオーバヘッド時間が減少し,処理が速くなることがあります.

 実行結果は次のようになります.

  $ gcc test217.c -o test217
  $ ./test217
  1
  2
  $

 このオプションでインライン指定をするのも良いと思いますが,キーワードinlineを指定したほうが可読性も高まり,可搬性も高まると思います.

 ソースと生成されたコードを,リスト4リスト5に示します.

 実行結果は次のようになります.もちろん先と同じ結果になります.

  $ gcc test218.c -o test218
  $ ./test218
  1
  2
  $

-finline-limit=n

 このオプションを付加するとインライン関数を展開する数を指定できます.つまりn以上のインライン関数があった場合,通常の関数として扱うようになります.なお,デフォルト値は600になっています.

 ソースと生成されたコードを,リスト6リスト8に示します.

 リスト8からわかるように,5以上あるインライン関数は無視されています.

-fkeep-inline-functions

 このオプションを付加すると,対象の関数に対する呼び出しが全部統合され,その関数がstaticと宣言されている場合でも,実行時に呼び出し可能な関数を別個に出力します.このオプションは,extern inline宣言された関数には影響しません.

 このオプションに関しては,意図しない動作を招くかもしれないので注意してください.

 ソースと生成されたコードをリスト9リスト11に示します.

-fkeep-static-consts

 このオプションはデフォルトで付加されます.これはstatic const宣言された変数を,たとえその変数が参照されていなくても出力するようにします.-fno-keep-static-constsオプションを使うと参照されていないstatic const変数は出力されません.

 ソースと生成されたコードをリスト12リスト16に示します.

 参照されていないstatic const変数「test_static」は,-fno-keep-inline-functionsオプションを付けるとマップ・リスト(リスト14)にも生成されたアセンブラ(リスト16)にも出力されていません.

 コードのサイズを極限まで小さくしたいときに使用すると便利です.

 次回も引き続き「最適化オプション」の補足を行います.


NEW記事内インデックス    連載インデックスはこちら   Interfaceのトップ
◆最適化オプション
リスト

Copyright 2004 岸 哲夫

Copyright 1997-2004 CQ Publishing Co.,Ltd.