LLVM做了哪些优化以及它们的前端需要实现哪些优化?

Gui*_*ira 7 llvm compiler-optimization

注意:我注意到这个问题这个问题有很大关系,所以如果你对我的问题感兴趣,你一定要读到其他问题及其答案.

我可以想一下OOP语言前端可以做的一些优化,例如创建临时变量来保存从顺序调用的const方法调用中的值,而不需要对相关对象进行中间非常量调用,以切断函数调用,但我可以再想想更多.我想请人们创建一个更长的例子清单.

我问这个因为我想创建一个小语言作为宠物项目,我不知道如何很好地学习这个主题.也许这是社区维基的案例?LLVM后端的优化列表以及前端应该自行完成,您如何看待?

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

ser*_*rvn 6

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

编辑:实际上,考虑一下,我只记得一个更重要的优化clang为C++做的事情:clang知道一些技巧来躲避C++中的复制构造函数(google for NRVO).

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

通常,在代码具有无法编码到IR中的属性(例如,C++对象具有常量vtable指针)时,在前端实现优化通常才有用.实际上,您最有可能希望首先实现哑代码生成,并查看是否存在未优化的重要案例.优化器可以进行一些令人惊讶的复杂转换.

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