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

时间:2016-05-28 03:24:26

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

从这个简单的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
}

IR

问题:使用O3认为最高级别的优化,为什么 nothing功能已被淘汰-code?

1 个答案:

答案 0 :(得分:18)

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

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