注意:我注意到this question与这个问题有很大关系,所以如果你对我的问题感兴趣,你绝对应该阅读另一个问题及其答案。
我能想到OOP语言前端可以做的一些优化,比如创建临时变量来保存顺序调用的const方法的值,而不需要对相关对象的中间非常量调用,以切断函数调用,但我想不到更多。我想请大家创建一个更长的示例列表。
我问这个是因为我想创建一个小的语言作为一个宠物项目,但我不确定如何很好地研究这个主题。也许这是一个社区维基的案例?LLVM后端做的和前端应该自己做的优化的综合列表,你认为呢?
哦,我知道不同的前端可能有非常不同的需求,但我的重点是过程化/OOP语言。
发布于 2011-09-06 03:54:37
这可能会因语言的不同而有很大不同。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是对优化器有很大帮助的一件事,尽管它本身并不是真正的优化。
发布于 2011-09-07 03:44:11
有很多很多的优化,它们只需要LLVM使用的SSA form中保存的信息。SSA提供了从控制流、数据流的角度进行分析的许多可能性。
另一方面,LLVM语言是RISC语言,因此丢失了大量的高层信息。
所以answer是这样的:前端能够进行优化,这些优化需要在转换为后丢失的信息。我脑海中浮现的例子如下:
的executed)
按指数增长的
时应该由前端做出决定
这些只是一些想法,一个希望,显示出可能涉及的某种乐观情绪。
https://stackoverflow.com/questions/7311012
复制相似问题