9

我想知道为什么 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不透明')。

4

1 回答 1

1

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

于 2013-12-27T00:24:17.010 回答