LLVM有哪些类型的优化?它的前端自身需要实现哪些类型的优化? [英] What kinds of optimization LLVM does and what kinds of optimizations its frontends have to implement themselves?

查看:17
本文介绍了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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆