2012-10-23 91 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 'as'結構不透明')。

+0

難道你忘記'@ makeGenericStructOuter'簽名中的'%0'嗎? – arrowd

+2

我也想知道這一點,因爲它會在幾種情況下提高Emscripten生成的代碼的質量。 以下是刪除相關LLVM優化傳遞的提交:http://llvm.org/viewvc/llvm-project?view=revision&revision=129314 –

回答

1

如果您認爲應該進行優化,請報告LLVM Bug Tracker中的錯誤。報告優化機會錯過時,LLVM開發人員通常非常高興和感興趣。