为什么LLVM IR中的空函数不被作为死代码移除?

13

从这个简单的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 函数没有被消除作为死代码?


4
从生成的 .obj 文件中没有导出任何内容,因此它无法被消除。 - user4003407
1
@PetSerAl,抱歉,我不明白“从生成的 .obj 文件中导出”是什么意思。 - Ahmed Ghoneim
1个回答

22

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

通过将nothing定义为static,您赋予它内部链接,这意味着编译器可以假定nothing在当前代码之外是无法访问的。这允许进行优化,例如选择不同的更高效的调用约定,或者在您的情况下,完全消除该函数。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接