我想知道为什么 LLVM 无法优化以下 IR 代码(使用优化设置为“3”的 PassManagerBuilder,还使用 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不透明')。