gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 16:46:34 27 4
gpt4 key购买 nike

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

IR

问题:使用O3考虑了最高级别的优化,为什么没有nothing功能作为死代码被淘汰?

最佳答案

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

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

关于c - 为什么在 LLVM IR 中没有将空函数作为死代码删除?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37494874/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com