●
-foptimize-register-move,-fregmove
GCC2.95では-foptimize-register-movesという名称で,2オペランド命令の機種で役立つものでした.インテル・アーキテクチャのマシンではあまり意味をもたなかったのです.
これはTRON仕様やRISC系マイクロプロセッサをもつマシンに指定してレジスタの割り当てを最適化することにも役立つものでした.
今は語尾の“s”がなくなり,用途が少し変わりました.
このオプションを指定すると,move命令内で,およびその他の単純な命令におけるオペランドにおいて,レジスタとの結合量を最大化するために,レジスタ番号の再割り当てを試みます.もちろん,2オペランド命令の機種において特に役立つことに変わりはありません.
● -foptimize-sibling-calls
このオプションを付けることで,最適化によって末尾再帰の除去を行います.末尾再帰でスタックを食い尽くさないようになります.
● -fprefetch-loop-arrays
ターゲット・マシンがサポートしているならば,大量のデータ読み込みの際に先読みを行います.このとき,オプション-fstrength-reduceを付加しないと効果がありません.
● -frename-registers
この最適化は,多くのレジスタを備えたプロセッサに役立つでしょう.レジスタの使用を割り付けの後にすることにより,スケジューリングされたコード中の誤りを回避することを試みます.
● -freorder-blocks,-freorder-functions
このオプションは,AthlonやPentiumVで機能します.それほど重要な最適化ではありません.
● -fsignaling-nans
このオプションを指定すると,浮動小数点式のオペレーション中にユーザ可視のトラップを生成します.
オプションの指定の方法は次のとおりです.
- 指定なし
gcc test233.c -S -ffast-math
-fomit-frame -pointer -O3
- 指定あり
gcc test233.c -S -fsignaling-nans
-fomit -frame-pointer -O3
ソースと生成されたコードをリスト1〜リスト3に示します.
● -fsingle-precision-constant
このオプションを指定すると,浮動小数の定数をすべてfloatとして単精度で扱います.
ソースと生成されたコードをリスト4〜リスト6に示します.
実行結果は次のとおりです.
単精度で扱うと範囲外になる値も倍精度で扱うと正しい結果になります.
$ gcc test234.c -fsingle-precision -constant
-o test234
$ ./test234
INF
6.543217E+00
NAN
$ gcc test234.c -o test234
$ ./test234
1.797690E+308
6.543217E+00
1.000000E+08
$
● -fstrict-aliasing
このオプションを指定すると,簡単にいえばdoubleで確保した領域をintポインタで参照することが不可能になります.厳密にコードをチェックするときに有益です.
オプションの指定の方法は次のとおりです.
- 指定なし
gcc -O2 -fno-strict-aliasing test235.c
- 指定あり
gcc -O2 test235.c
ソースと生成されたコードをリスト7〜リスト9に示します.
また,実行結果を次に示します.
$ gcc test235.c -o test235 -O2
$ ./test235
3.141593e+00
3.141593e+00
$ gcc test235.c -o test235
-fno-strict -aliasing
$ ./test235
3.141593e+00
-3.141593e+00
$
● -ftracer
このオプションは解析やフロー・コントロールを最適化し,他の最適化の実行を助けます.
● -funsafe-math-optimizations
IEEEまたはANSIの基準を破っても浮動小数点演算のための最適化を行います.これは好みで指定してください.
* *
次回はSSA最適化,および最適化オプションのまとめを行います.
 記事内インデックス 連載インデックスはこちら Interfaceのトップ |
|
|
Copyright 2004 岸 哲夫
Copyright 1997-2004 CQ Publishing Co.,Ltd.