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」としてローカルに宣言します)。不透明」)。