5.3 コンパイラ最適化レベルとデバッグビュー

コンパイラによって正確な最適化を実行できるかどうかは、どの最適化レベルを選択するかだけでなく、パフォーマンスとコードサイズのどちらを最適化しようとしているかによっても決まります。

コンパイラでは、以下の最適化レベルがサポートされています。
0
最小限の最適化。ほとんどの最適化を実行しません。デバッグ機能が有効になっていると、生成されたコードの構造がソースコードに直接対応するため、このオプションによって最良のデバッグビューが実現します。デバッグビューを妨げるすべての最適化は無効になります。以下に例を示します。
  • ブレークポイントは、デッドコードを含む、どの到達可能点にも設定できます。
  • 変数の値は、初期化されていない有効範囲を除くすべての有効範囲内で使用可能です。
  • バックトレースにより、ソースを読んだときに想定されるオープン関数アクティベーションのスタックが得られます。

-O0 により生成されるデバッグビューは、ソースコードにほぼ対応していますが、ユーザは -O1 によって生成されるデバッグビューの方を好むかもしれません。それは、こちらの方が基本的構造を変えなくても、コードの質が向上するからです。

デッドコードには、使用されないローカル変数への割り当てなど、プログラムの結果に影響のない到達可能コードが含まれます。到達不可能なコードとは、return ステートメント直後のコードなど、制御フローパス経由で到達できないコードです。
1
制限された最適化。コンパイラはデバッグ情報で説明可能な最適化のみを実行します。未使用のインライン関数とスタティック関数を削除します。デバッグビューに著しく悪影響を及ぼす最適化は実行しません。--debug と組み合わせて使用すると、 十分満足できるデバッグビューと優れたコード密度が提供されます。
–O0 からのデバッグビューでの違いは、次のとおりです。
  • デッドコードには、ブレークポイントを設定できません。
  • 変数をいったん初期化した後には、変数の値をスコープ内で入手することはできなくなる可能性があります。例えば、割当先の場所が再利用されている場合です。
  • 副作用のない関数が、シーケンス外で呼び出されるか、結果が不要な場合に省略される可能性があります。
  • 末尾の呼び出しが存在するため、バックトレースにより、ソースを読んだときに想定されるオープン関数アクティベーションのスタックが得られなくなる可能性があります。
最適化レベル –O1 により、ソースコードとオブジェクトコードの間で良好な対応関係が得られます。これは特に、ソースコードにデッドコードがない場合にそうなります。生成されたコードは、–O0 でのコードよりはるかに小さくなる可能性があります。したがって、オブジェクトコードの分析が簡単になる可能性があります。
2
高度な最適化。--debug と組み合わせて使用すると、オブジェクトコードとソースコードとの間のマップが明確でない場合があるため、デバッグビューの質は低下します。コンパイラは、デバッグ情報で記述できない最適化を実行できることがあります。
これがデフォルトの最適化レベルです。
–O1 からのデバッグビューの違いは、次のとおりです。
  • ソースコード対オブジェクトコードのマッピングは多対 1 になる可能性がありますが、これは複数のソースコード場所がファイル内の 1 点にマッピングされ、さらに積極的な命令スケジューリングが組まれる可能性があるためです。
  • 命令スケジューリングは、シーケンスポイントにまたがることができます。これにより、特定ポイントで報告された変数値とソースコードの呼び出しから予測した値との間に、不一致が見られることがあります。
  • コンパイラは、自動的に関数をインライン展開します。
3
最大限の最適化。デバッグ機能が有効になっている場合に、このオプションを選択すると、質の低いデバッグビューになります。ARM では、低い最適化レベルでのデバッグを推奨しています。
-O3 および -Otime を使用すると、コンパイラは、さらに以下のような強力な最適化を実行できます。
  • ループ展開を含む高レベルのスカラ最適化。コードサイズの増加を抑えながらパフォーマンスを大幅に向上できますが、ビルドに時間がかかる可能性があります。
  • より強力なインライン展開とインライン展開の自動化。
これらの最適化により、入力ソースコードが効果的に書き直されます。その結果、オブジェクトコードにおいて、ソースコードおよび最悪のデバッグビューとの対応性が最小になります。--loop_optimization_level=option は、–O3 –Otime で実行されるループ最適化の量を制限します。ループ最適化の量が多ければ多いほど、ソースコードとオブジェクトコードの対応性は悪化します。
--vectorize オプションを使用すると、ソースコードとオブジェクトコード間の一致も低くなります。
–O3 –Otime のソースコードで実行される高レベルの変換に関する追加情報については、--remarks コマンドラインオプションを使用します。
Because optimization affects the mapping of object code to source code, the choice of optimization level with -Ospace and -Otime generally impacts the debug view.
オプション -O0 は、単純なデバッグビューが必要な場合に最良のオプションです。通常、-O0 を選択すると、ELF イメージのサイズが 7 ~ 15% 増大します。デバッグテーブルのサイズを縮小するには、--remove_unneeded_entities オプションを使用します。
非機密扱いPDF file icon PDF 版ARM DUI0472LJ
Copyright © 2010-2015 ARM.All rights reserved.