LLVM有哪些类型的优化?它的前端自身需要实现哪些类型的优化? [英] What kinds of optimization LLVM does and what kinds of optimizations its frontends have to implement themselves?
本文介绍了LLVM有哪些类型的优化?它的前端自身需要实现哪些类型的优化?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
注意:我注意到this question与这个问题有很大关系,所以如果您对我的问题感兴趣,您一定也应该阅读另一个问题及其答案。
我能想到OOP语言前端可以做的一些优化,比如创建临时变量来保存顺序调用的const方法调用的值,而不需要对相关对象的中间非常数调用,以切断函数调用,但我想不到更多了。我想请人们创建一个更长的示例列表。
我问这个问题是因为我想创建一个宠物项目来创建一种小型语言,但我不确定如何很好地学习这门学科。也许这是社区维基的案例?LLVM后端进行以及前端应该自己进行的优化的综合列表,您认为如何?
哦,我知道不同的前端可能有非常不同的需求,但我的重点是过程化/面向对象语言。
推荐答案
这可能因语言而异.Clang(C/C++)只需在前端做很少的优化就可以逃脱惩罚。我能想到的唯一针对生成代码的性能进行的优化是clang在前端对C++方法进行了一些去虚拟化。Clang执行其他一些优化,比如常量折叠和死代码消除,但这主要是为了加快编译时间,而不是为了提高生成的代码的性能。
edit:实际上,再想一想,我刚刚想起了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是对优化器有很大帮助的一件事,尽管它本身并不是真正的优化。
这篇关于LLVM有哪些类型的优化?它的前端自身需要实现哪些类型的优化?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文