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'結構不透明')。
難道你忘記'@ makeGenericStructOuter'簽名中的'%0'嗎? – arrowd
我也想知道這一點,因爲它會在幾種情況下提高Emscripten生成的代碼的質量。 以下是刪除相關LLVM優化傳遞的提交:http://llvm.org/viewvc/llvm-project?view=revision&revision=129314 –