コンパイラの最適化を適用したら、プログラムが動作しなくなる
テクニカル・ノート 181233J
アーキテクチャ:
All
コンポーネント:
compiler
更新日:
2019/02/18 9:13
はじめに
最適化をオンにしたらプログラムが動作しなくなったという問題がしばしば発生します。本テクニカルノートでは、最適化によって問題が発生する原因と対策について説明します。
解説
- 最適化の変化により発生する問題について
最適化を行ってプログラムが正しく動かなくなる原因には、以下のようなものが考えられます。
- 実行速度の変化
プログラムの動作条件に実行速度依存の部分がある場合、最適化による実行速度の変化によるもの。 - プログラムサイズの変化
プログラムの動作条件にプログラム実装位置に依存する部分がある場合、その条件の変化によるもの。 - C言語の解釈の違い
最適化は、C言語の規格を厳密に解釈するため、プログラマの認識とずれる場合があるためによるもの。
- 対策
下記の手順でプログラムの部分を特定し、対策してください。
・ 問題の発生するきっかけとなる最適化内容の特定
(以下の作業を行う前にプロジェクト全体のバックアップをしておいてください。)
最適化には、4段階のレベルがあり、中、高レベルにおいては、最適化内容を選択することができます。これらは、プロジェクトを開いた状態で、[プロジェクト]メニュー > [オプション] > [C/C++コンパイラ] > [最適化]タブで、レベル「なし」、「低」、「中」、「高」、レベル「中」「高」の場合はさらに項目を設定することができます。最初に、問題の発生するレベルを探し、そのレベルが「中」または「高」の場合、さらに項目を順にオン/オフして特定してください。
・ 問題が発生するプログラム部分の特定
先に[プロジェクト]メニュー > [オプション] > [C/C++コンパイラ] > [リスト]タブで「リストファイルの出力」と「アセンブラニーモニック」にチェックを入れておいてください。
Embedded Workbench for Armの画面左に見えるファイルの名前を右クリックし[オプション]を開き、「継承した設定をオーバライド」にチェックを入れ、[C/C++コンパイラ] > [最適化タブ]で、最適化を元に戻して、問題がなくなるかどうか確認してください。問題がなくならない場合は「継承した設定をオーバライド」を元に戻してください。(条件によっては戻さないほうが探しやすい場合もあります)これを繰り返して、関係するソースファイルを探してください。
ソースファイルが特定できましたら、そのファイルのコンパイル結果のわかるリストファイルをエディタで比較し、違う部分を探してください。
本来必要であるはずのコードが、コンパイラが無駄なプログラムとして判断して削除された場合は、volatile型修飾子を用いて削除または順序の変更が行われないようにします。
すでにあるコードの場合、最適化のチューニングが済んでいて、特定の最適化条件が指定されている場合がございます。その場合は、その開発者の方に相談されることをお勧めします。
まとめ
プロジェクト全体を同じ最適化レベルにすることは開発効率を考えた場合、良い選択とは言えません。デバイスドライバとアプリケーションとでは最適化レベル設定を変えるなど、ファイル毎に最適化のチューニングを行うことをお勧めします。
全ての製品名は、それぞれの所有者の商標または登録商標です