2016-08-10 12 views
0

Linux 14.04 x64でg ++ 4.8.4を使用しています。コンパイルとリンクの両方で-O3と-fltoフラグを付けてプロジェクトをコンパイルしています。つまり、MakefileのCFLAGSとLDFLAGSの両方にこれらのオプションがあります。GCC:リンカーで-O3最適化フラグを使用

浮動小数点数/倍精度浮動小数点演算を含む計算では、最適化されたバイナリが異なる動作をする(誤って)ことがわかりました。 LDFLAGSだけから-O3を削除することは、この問題を解決するようです。

コンパイラとリンカの両方に同じ最適化フラグセットを指定するのが一般的に安全であることを覚えています。私の理解が間違っていますか?前もって感謝します。

+0

「Linux 14.04」はありません。あなたはUbuntu 14.04を意味するのでしょうか? – SurvivalMachine

+0

私のお詫び - –

+0

の前に誤って "Ubuntu"をスキップしました。あなたがLTOで何かをしていて、間違った最適化がO3のみに適用された場合、最後のステップからO3を削除するとO0か何かにコード全体が再コンパイルされます。誤ったオプションを引き起こさない。 –

答えて

1

コンパイル中のコンパイラは、中間コード表現(a.k.a. GIMPLE)をオブジェクトファイルの特別なセクションにダンプします。

マシンコードへの実際のコンパイルと最適化はリンク段階で行われます。

あなたのコードはUBを引き起こすか、または単に-O3オプションで誤最適化されている場合には(予想通り)あなたは-O0に変更する場合はそうです、それは異なる動作をするかもしれない、-Ogなど

だからあなたがする必要があなたのコードが間違っているか、実際のGCC LTOバグかを調べてください。

+0

はそれを得ました。私が "-flto"なしで試してみましょう。しかし、コンパイラとリンカの両方に "-O3"フラグを付けるのは正しいですか? –

+0

@SrivathsanMはい、コンパイラとリンカの両方に同じフラグを与える必要があります –

+0

"-flto"フラグを削除してからプロジェクトがクラッシュしていないので、@ "Severin Pappadeux" "-O3"最適化さえ "-flto"なしでうまく動作します。ですから、実際にはUbuntu 14.04 x64のGCC 4.8.4のLTOバグのようです。 GCC 5.xと最新の6.2を試したことはありませんが –

関連する問題