2012-10-23 16 views
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 ')。

+0

'@ makeGenericStructOuter'シグネチャに'%0'を忘れていませんか? – arrowd

+2

また、Emscriptenで生成されたコードの品質を向上させるため、これについては不思議です。 関連するLLVM最適化パスが削除されたコミットは次のとおりです。http://llvm.org/viewvc/llvm-project?view=revision&revision=129314 –

答えて

1

最適化が行われるべきであると考えられる場合は、LLVM Bug Trackerのバグを報告してください。 LLVM開発者は、逃した最適化の機会を報告するとき、通常、非常に幸せで興味があります。

関連する問題