0

私は、SSA を使用して指定された IR コードを調べてきました。特に、この形式で LLVM IR を生成しています。ただし、自明ではないコピー セマンティクスを持つ型が提示された場合に、これが効果的かどうかについては混乱しています。例えば、

void f() {
    std::string s = "Too long for you, short string optimization!";
    std::string s1 = s + " Also, goodbye SSA.";
    some_other_function(s1);
}

この SSA 形式では、少なくとも最も明白なレベルでは、(C++ の場合でも) 厄介なコピーの混乱が生じます。LLVM などのオプティマイザーは、実際にこのケースを正確に最適化できますか? SSA は、重要なコピー/代入/etc セマンティクスを持つ型でも使用できますか?

編集:問題は、LLVM SSA レジスタを使用して複雑な型 (この場合は) を表す場合、ここでは手動で SSA を作成することによって表される場合、LLVM はこれを一般的なケースで基になるアセンブリの変更呼び出しにstd:string自動的に変換できるかということです。+=厄介なコピーを避けますか?

4

1 に答える 1

1

SSA は、単一の静的割り当てを意味します。これは、レジスタに適用される値のセマンティクスを処理する方法です。各オブジェクトは、正確に 1 つのマシン命令の結果です。

LLVM は汎用の「移動」命令を提供します。これは、8、32、N バイトを移動するさまざまなアーキテクチャの命令が多数あるため便利です。また、構造化されたデータ型と配列も提供します。これは、そのようなものをレジスタにホイストするのに便利であり、風変わりな高レベルのマシン構造を表すために使用できるためです。その意図は、OOP をモデル化することではありません。

于 2012-06-09T13:56:41.287 に答える