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

时间:2011-09-05 17:15:06

标签: llvm compiler-optimization

注意:我注意到this question与此问题有很多关系,所以如果你对我的问题感兴趣,你一定要读到其他人及其答案。

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

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

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

2 个答案:

答案 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后丢失的信息。我想到的例子:

  • 首选分支优化,一些例子
    • 琅。像声明首选分支的扩展(在Linux内核中,一些分支被标记为几乎总是被执行)
    • 实施抛出和捕获异常
    • 协同例程实现和依赖性信息
  • 指数级增长的优化(如loop-unswitch增长代码大小)可能需要根据高级别信息应用于特定位置。 - 可能来自源代码(前端)。
  • 语言特征(可能是反射或其他)被转换为“多指针”(如指针指针......)相互关联的结构,在低级别上可能难以猜测 - 如在低级别上,所有这些都可能看起来像数组访问,而它可能在高级别上有一些约束,可能有助于优化。
  • 根据可用的硬件,可能会以不同的方式实现复杂功能。让我们举几个例子:矩阵乘法,FFT变换(压缩和解压缩算法),大数字算法等等......根据底层硬件,它可能以不同的方式实现,以实现最大性能。在将内容翻译成LLVM之后,可能非常非常昂贵(在计算复杂性方面)更改实现更适合于可用硬件。这就是为什么在编译到较低级别时应该由前端做出决定。

这只是一些想法,一种希望,显示出可能涉及的一些优化。