【问题标题】:Why empty functions aren't removed as dead code in LLVM IR?为什么空函数不会作为 LLVM IR 中的死代码被删除?
【发布时间】:2016-09-26 11:11:05
【问题描述】:

从这个简单的 C 程序开始:

void nothing(void) {}
int main() {
  int i;
  for (i = 0; i < 10; ++i) {
    nothing();
  }
  return 0;
}

我的通行证输出如下:
注意:IR 语句为绿色。

; Function Attrs: nounwind readnone ssp uwtable
define void @nothing() #0 {
entry:
  ret void
}

; Function Attrs: nounwind readnone ssp uwtable
define i32 @main() #0 {
entry:
  ret i32 0
}

问题:使用被认为是最高级别优化的O3为什么nothing函数没有作为死代码被淘汰?

【问题讨论】:

  • nothing 是从生成的.obj 文件中导出的,因此无法消除。
  • @PetSerAl,对不起,我不明白,“从生成的 .obj 文件中导出”

标签: c clang llvm-clang llvm-ir llvm-codegen


【解决方案1】:

编译器必须考虑存在另一个翻译单元想要调用nothing() 的可能性。因此无法删除。它最多只能优化它的调用,但函数本身必须保留,并且它的符号导出以供可能的外部使用。

通过将nothing 定义为static,你给它internal linkage,这意味着编译器可以假设nothing 在它看到的代码之外是不可访问的。这允许进行优化,例如选择不同的性能更高的调用约定,或者在您的情况下完全消除该函数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-13
    • 1970-01-01
    相关资源
    最近更新 更多