为什么在 LLVM IR 中没有将空函数作为死代码删除?

Why empty functions aren't removed as dead code in LLVM IR?

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

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

我的pass输出如下:
注: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() 的可能性。因此无法删除。它最多能做的就是优化它的调用,但是函数本身必须保留,并且它的符号必须导出以供可能的外部使用。

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