9

LLVM が次の IR コードの最適化に失敗する理由を知りたいです (最適化を「3」に設定した PassManagerBuilder を使用し、LLVM の「opt」ツールも使用):

%GenericStruct = type { i32 }

define void @makeGenericStructOuter(%GenericStruct* noalias nocapture sret) {
entry:
  %1 = alloca %GenericStruct
  call void @makeGenericStructInner(%GenericStruct* %1)
  %2 = load %GenericStruct* %1
  store %GenericStruct %2, %GenericStruct* %0
  ret void
}

declare void @makeGenericStructInner(%GenericStruct* noalias nocapture sret)

予想されるコードは次のとおりです。

%GenericStruct = type { i32 }

define void @makeGenericStructOuter(%GenericStruct* noalias nocapture sret) {
entry:
  call void @makeGenericStructInner(%GenericStruct* %0)
  ret void
}

declare void @makeGenericStructInner(%GenericStruct* noalias nocapture sret)

このケースを処理するために現在利用できる最適化はありませんか? それとも、最適化を可能にする適切な IR を作成できていないのでしょうか (このコードは、私が開発しているフロントエンドから生成されています)。

提案される前に、これらの関数は「GenericStruct」のサイズや内容を知らない他のモジュール/ライブラリから呼び出すことができる必要があるため、値で返すコードを生成することはできません (そして、「TestClass」を「struct」としてローカルに宣言します)。不透明」)。

4

1 に答える 1

1

最適化が必要だと思われる場合は、LLVM Bug Trackerでバグを報告してください。LLVM 開発者は通常、最適化の機会を逃したことを報告することに非常に満足し、関心を持っています。

于 2013-12-27T00:24:17.010 に答える