12

ウィキペディアのOptimization Compilerから、

コンパイラーの最適化は、通常、一連の最適化変換(プログラムを取得して変換し、より少ないリソースを使用する意味的に同等の出力プログラムを生成するアルゴリズム) を使用して実装されます。

GCCには多くの最適化オプションがあります。

、、など-Sのさまざまなフラグを使用してコンパイルするときに GCC が最適化を実行するたびに、生成されたアセンブリ (1 つが与える) を調べたいと思います。-O1-O2-O3

これどうやってするの?

編集:私の入力はCコードになります。

4

7 に答える 7

9

中間表現は、スイッチを使用してファイルに保存できます-fdump-tree-all

よりきめ細かい-fdumpスイッチが利用可能です。

詳細については、gcc のマニュアルを参照してください。

これらの表現を読み取れるようにするには、GCC internals manual を参照してください

于 2013-03-05T15:25:43.337 に答える
2

gcc -S大文字S

asm出力を提供しますが、アセンブラーは物事を変更できるので、オブジェクトを作成することを好みます

gcc -c -o myfile.o myfile.c

その後、分解します

objdump -D myfile.o

これはリンクされていないため、外部ブランチの宛先やその他の外部アドレスには実数ではなくプレースホルダーがあることを理解してください。最適化が最適化なし(-O0)でコンパイルされることを確認したい場合は、-O1、次に-O2、および-O3を使用してコンパイルし、何かが変更された場合にどうなるかを確認します。あなたが遊ぶことができる他の最適化フラグもあります。違いを確認するには、フラグがある場合とない場合でコンパイルし、違いを自分で比較する必要があります。

diffは機能しません。理由がわかります(レジスタ割り当ての変更)。

于 2013-03-05T15:05:06.757 に答える
1

-Sアセンブリ コードを取得するには、スイッチを使用してコンパイルします。これは、どのレベルの最適化でも機能するはずです。たとえば、O2モードで生成されたアセンブリ コードを取得するには、次を試してください。

    g++/gcc -S -O2 input.cpp

生成されたアセンブリ コードを含む、対応input.sする が生成されます。必要な最適化レベルに対してこれを繰り返します。

于 2013-03-05T14:49:26.623 に答える
1

小さなコードを取得し-Sて、さまざまなオプションを指定してコンパイルすることは可能ですが、実際に何が変更されたのかを理解するのは困難です。コードをまったく異なるものにするために必要なのは、わずかな変更だけです。1 つの変数がレジスターに入るということは、そのレジスターが何かに使用できなくなり、関数内の残りのすべてのコードに連鎖反応を引き起こすことを意味します。

私は今日 (C++ に関する質問をするために) 2 つのほぼ同一の関数の同じコードを比較していましたが、ソース コードに 1 つの違いがありました。変数が 1 つの for ループ内の終了条件に使用される 1 つの変更により、アセンブラー コードの変更が行を超えました。コンパイラがレジスタを別の方法で配置することを決定したため、メイン変数の 1 つに別のレジスタを使用し、結果として他のすべてが変更されました。

関数に小さな変更を加えると、関数がインラインから非インラインに移動し、そのコードを呼び出すプログラム内のすべてのコードに大きな変更が加えられるケースを見てきました。

したがって、はい、ぜひ、さまざまな最適化を使用して非常に単純なコードをコンパイルし、 -S を使用してコンパイラが生成したコードを検査してください。次に、さまざまなバリアントを比較して、その効果を確認します。しかし、アセンブラー コードを読むことに慣れていて、実際に探しているものを理解していない限り、木を見て森を見るのは難しい場合があります。

また、最適化ステップはしばしば連携して機能することも考慮する価値があります。あるステップでは、別のステップがその作業を実行できます (インラインでは、ブランチのマージ、レジスタの使用などにつながります)。

于 2013-03-05T16:24:09.043 に答える
1

gcc/clang は中間表現 (IR) に対して最適化を実行します。これは、各最適化パスの後に出力できます。

gcc では (-fdump-tree-all) ' http://gcc.gnu.org/onlinedocs/gcc/Debugging-Options.html ' で、clang では (-llvm -print-after-all) です。

Clang/gcc には、最適化を分析するためのさらに多くのオプションが用意されています。コマンドラインから最適化をオン/オフするのは簡単です ( http://gcc.gnu.org/onlinedocs/gcc-3.4.4/gcc/Optimize-Options.htmlhttp://llvm.org/docs /Passes.html )

clang-llvm を使用すると、コマンド ライン オプション (-mllvm -debug-pass=Structure) を使用して実行された最適化パスを一覧表示することもできます。

于 2013-03-07T08:34:24.933 に答える
0

コンパイラーの最適化を研究したいが、コンパイラーにとらわれない場合は、Clang/LLVM プロジェクトを参照してください。Clang は LLVM IR を出力できる C コンパイラであり、LLVM コマンドは特定の最適化パスを個別に適用できます。

出力 LLVM IR:

clang test.c -S -emit-llvm -o test.ll

最適化パスを実行します。

opt test.ll -<optimization_pass> -S -o test_opt.ll

アセンブリにコンパイル:

llc test.ll -o test.s
于 2013-03-05T15:22:09.843 に答える