17

いくつかのコードをコンパイルしているときに、-O0と-O1の間で作成されたアセンブラーに大きな違いがあることに気づきました。アセンブラーで特定の変更を引き起こしている原因がわかるまで、最適化の有効化/無効化を実行したかったのです。

-fverbose-asmを使用して、O1がO0と比較して有効にしているフラグを正確に調べ、それらを手動で無効にした場合、生成されるアセンブラーがまだ非常に大きく異なるのはなぜですか?O0でgccを実行し、fverbose-asmがO1で有効になっていると言ったすべてのフラグを手動で追加しても、O1を使用した場合と同じアセンブラーを取得できません。

「-f...」と「-m...」以外に変更できるものはありますか?

または、「O1」は「O0」と比較してオフにできない魔法を持っているということです。


わかりにくいことをお詫びします。これは、GCC + ARMを使用した再帰中のスタック使用量の削減に関連していましたが、その言及により、質問が少し理解しにくくなりました。

4

3 に答える 3

9

O0 で有効になっていない O1 で有効になっているパスを確認するだけの場合は、次のように実行できます。

gcc -O0 test.c -fdump-tree-all -da
ls > O0
rm -f test.c.*
gcc -O1 test.c -fdump-tree-all -da
ls > O1
diff O0 O1

発見した一連のフラグを使用する同様のプロセスにより、フラグによって制御されない追加のマジック パスが O1 で GCC によって実行されていることがわかります。

編集:

あまり面倒でない方法は、-fdump-passes の出力を比較することです。これにより、どのパスがオンまたはオフであるかが stderr にリストされます。

次のようなものです:

gcc -O0 test.c -fdump-passes |& grep ON > O0
gcc -O1 test.c -fdump-passes |& grep ON > O1
diff O0 O1
于 2012-11-01T09:56:16.673 に答える
4

-O1オフにできない魔法についての疑いの証拠を提供することを除いて、これが役立つわけではありません。

  • http://gcc.gnu.org/ml/gcc-help/2007-11/msg00214.htmlから:

    -O1 によって有効化されるすべての最適化に、それらを無効にするためのコマンドライン トグル フラグがあるわけではありません。

  • Hagen の「GCC の決定版ガイド、第 2 版」から:

    注: GCC の最適化のすべてがフラグを使用して制御できるわけではありません。GCC はいくつかの最適化を自動的に実行します。ソース コードを変更しない限り、-O を使用して最適化を要求した場合、これらの最適化を無効にすることはできません。

残念ながら、これらのハードコーディングされた最適化が何であるかについての明確な声明は見つかりませんでした。うまくいけば、GCCの内部について知識のある人が、それに関するいくつかの情報を含む回答を投稿するかもしれません.

于 2012-10-31T17:34:55.700 に答える