Ste*_*oss 9 optimization return-value llvm
我想知道为什么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)
Run Code Online (Sandbox Code Playgroud)
预期的代码是:
%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)
Run Code Online (Sandbox Code Playgroud)
目前没有优化可用于处理此案例吗?或者我没有制作(这个代码是从我正在开发的前端产生的)正确的IR,它将允许优化?
在建议之前,我不能生成按值返回的代码,因为这些函数必须可以从不知道'GenericStruct'的大小或内容的其他模块/库中调用(并且它们会在本地声明'TestClass'为'struct不透明').