オプティマイザが浮動小数点演算に関する前提事項を単純化できるようにします。
n を指定する場合は、0、1、2 のいずれかでなければなりません。デフォルトは次のとおりです。
-fsimple[=n] を指定しない場合は、-fsimple=0 が使用されます。
=n のない -fsimple だけを指定すると、-fsimple=1 が使用されます。
-fsimple=0
前提事項の単純化を行えないようにします。厳密に IEEE 754 に準拠します。
-fsimple=1
適度の単純化を行えるようにします。生成されるコードは IEEE 754 に厳密には準拠しませんが、大部分のプログラムの数値結果は変化しません。
-fsimple=1 を指定すると、オプティマイザは以下の事項を前提とします。
IEEE 754 のデフォルトの丸めとトラップモードは、プロセスの初期化後は変化しない。
浮動小数点の数値例外以外には、目に見える結果が生じない演算は削除できる。
オペランドに無限または NaN をもつ演算は、その結果に NaN を伝達する必要はない。たとえば、x*0 は 0 で置き換えられる。
演算はゼロの符号に依存しない。
-fsimple=1 を指定した場合は、オプティマイザは必ず四捨五入や数値例外に応じた処理を行います。特に浮動小数点演算は、実行時に定数化される四捨五入モードでは異なる結果を生じる演算と、置き換えることはできません。-fast マクロフラグを使用すると、-fsimple=1 に設定されます。
-fsimple=2
高度な浮動小数点最適化を行うことができ、丸めの変化によって、多くのプログラムが異なる数値結果を生じる可能性があります。たとえば、オプティマイザはあるループ内に x/y の演算があった場合、x/y がループ内で少なくとも 1 回は必ず評価され、ループの実行中に y と z(=1/y) が一定の値をとると判断できると、x/y の演算をすべて x*z で置き換えることができると仮定します。
本来浮動小数点例外を発生しないプログラムならば、-fsimple=2 を指定してもオプティマイザが浮動小数点例外を発生させることはありません。