9
LLVMは、以下のIRコード(「3」に設定し、最適化してPassManagerBuilderを使用して、そしてまた、LLVMの「オプトイン」ツールを使用して)最適化するために、失敗した理由を、私は思ったんだけど:LLVM構造体リターンの最適化
%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 opaque ')。
'@ makeGenericStructOuter'シグネチャに'%0'を忘れていませんか? – arrowd
また、Emscriptenで生成されたコードの品質を向上させるため、これについては不思議です。 関連するLLVM最適化パスが削除されたコミットは次のとおりです。http://llvm.org/viewvc/llvm-project?view=revision&revision=129314 –