llvm - LLVM 做了哪些类型的优化以及它的前端必须自行实现哪些类型的优化?

标签 llvm compiler-optimization

注意:我注意到 this question与这个问题有很大关系,所以如果您对我的问题感兴趣,那么您一定要阅读另一个问题及其答案。

我可以想到一些 OOP 语言前端可以做的优化,例如创建临时变量来保存来自按顺序调用的 const 方法调用的值,而不需要对相关对象进行中间非常量调用,以切断函数调用,但我可以想多了。我想请人们创建更长的示例列表。

我问这个是因为我想创建一个小语言作为一个宠物项目,我不知道如何很好地研究这个主题。也许这是社区维基的一个案例? LLVM 后端所做的优化以及前端应该自己做的优化的完整列表,您怎么看?

哦,我知道不同的前端可能有很大不同的需求,但我的重点是过程/OOP 语言。

最佳答案

这可能因语言而异……clang (C/C++) 在前端优化方面做得很少。我能想到的唯一优化是针对生成的代码的性能进行的,clang 在前端对 C++ 方法进行了一些去虚拟化。 clang 还做了一些其他优化,比如常量折叠和死代码消除,但这主要是为了加快编译时间,而不是为了生成代码的性能。

编辑:实际上,再仔细想想,我只记得 clang 对 C++ 所做的一个更重要的优化:clang 知道一些在 C++ 中省略复制构造函数的技巧(谷歌为 NRVO)。

在某些情况下,特定于语言的 IR 优化传递可能很有用。有一个 SimplifyLibCalls channel ,它知道如何优化对 C 标准库的调用。对于新的 Objective-C ARC 语言功能,clang 将一些特定于 ARC 的传递放入管道;这些优化了对各种 Objective-C 运行时函数的调用。

一般来说,只有在代码具有无法编码到 IR 中的属性时(例如 C++ 对象具有常量 vtable 指针),在前端实现优化通常才有帮助。而在实践中,你很可能想先实现哑代码生成,看看是否有没有优化的重要案例。优化器可以执行一些令人惊讶的复杂转换。

另见 http://llvm.org/docs/tutorial/LangImpl7.html ;适本地使用 alloca 是一件事,可以极大地帮助优化器,尽管它本身并不是真正的优化。

关于llvm - LLVM 做了哪些类型的优化以及它的前端必须自行实现哪些类型的优化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7311012/

相关文章:

c++ - g++ 内联 asm 无法按预期使用优化标志

llvm - TableGen 语言中的模式支持是什么

macos - clang 插件编译错误: undefined symbol llvm::Registry<clang::PluginASTAction,llvm::RegistryTraits<clang::PluginASTAction>>

objective-c - 在 Xcode 项目目标build设置中,什么是 Mach-O 类型?

c++ - 有没有办法关闭 C++ 和 Rust 编译的循环优化?

c# - C# 编译器是否计算常数的数学?

c++ - 我可以在 VS 中使用 GCC/LLVM 的 STL header 吗?

syntax - 了解最简单的 LLVM IR

assembly - 是 mov rax,0x12345678; jmp rax 仍然会杀死分支预测吗?

c# - 即使未使用变量,是否始终会执行局部变量赋值?