注意:我注意到this question与此问题有很多关系,所以如果你对我的问题感兴趣,你一定要读到其他人及其答案。
我可以想到OOP语言前端可以做的一些优化,例如创建临时变量来保存来自顺序调用的const方法调用的值,而不需要对相关对象进行中间非常量调用,以切断函数调用,但我想不出更多。我想请人们创建一个更长的例子列表。
我问这个是因为我想创建一个小语言作为宠物项目,我不知道如何很好地学习这个主题。也许这是社区维基的案例?一个完整的LLVM后端优化列表以及前端应该自己完成,你怎么看?
哦,我知道不同的前端可能有不同的需求,但我的重点是程序/ OOP语言。
答案 0 :(得分: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是有助于优化器的一件事,尽管它本身并不是一个优化。
答案 1 :(得分:2)
有许多优化需要的信息与LLVM使用的SSA form中保存的信息一样多。 SSA在控制流,数据流方面提供了很多分析的可能性。
另一方面,LLVM语言为RISC,因此丢失了许多高级信息。
所以回答是:前端能够进行优化,需要在转换为SSA后丢失的信息。我想到的例子:
这只是一些想法,一种希望,显示出可能涉及的一些优化。