LLVM结构返回优化

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不透明').

Paw*_*ica 1

如果您认为应该进行优化,请在LLVM Bug Tracker中报告错误。当 LLVM 开发人员报告错过的优化机会时,通常会非常高兴和感兴趣。