首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >LLVM做了什么样的优化,它的前端需要自己实现什么样的优化?

LLVM做了什么样的优化,它的前端需要自己实现什么样的优化?
EN

Stack Overflow用户
提问于 2011-09-06 01:15:06
回答 2查看 1.4K关注 0票数 8

注意:我注意到this question与这个问题有很大关系,所以如果你对我的问题感兴趣,你绝对应该阅读另一个问题及其答案。

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

我问这个是因为我想创建一个小的语言作为一个宠物项目,但我不确定如何很好地研究这个主题。也许这是一个社区维基的案例?LLVM后端做的和前端应该自己做的优化的综合列表,你认为呢?

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 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是对优化器有很大帮助的一件事,尽管它本身并不是真正的优化。

票数 7
EN

Stack Overflow用户

发布于 2011-09-07 03:44:11

有很多很多的优化,它们只需要LLVM使用的SSA form中保存的信息。SSA提供了从控制流、数据流的角度进行分析的许多可能性。

另一方面,LLVM语言是RISC语言,因此丢失了大量的高层信息。

所以answer是这样的:前端能够进行优化,这些优化需要在转换为后丢失的信息。我脑海中浮现的例子如下:

  • 首选分支优化,一些例子是
    • lang。像声明首选分支这样的扩展(在Linux内核中,一些分支被标记为几乎总是抛出并捕获exceptions
    • co-routines实现和依赖项information

的executed)

  • implementation

按指数增长的

  • optimisations (如循环-取消切换增长代码大小),可能需要根据高级信息应用于特定位置。-可能来自源代码(front-end).
  • language特性(可能是反射或其他东西),这些特性被转换为“多指针”(比如指向指针的指针...)互连结构,这在低级可能很难猜测-就像在低级,所有看起来都像数组访问,而它可能在高层有一些限制,这可能有助于optimisations.
  • complex函数的实现,这取决于可用的硬件。让我们举几个例子:矩阵乘法,FFT变换(压缩和解压缩算法),大数算术等等。根据底层硬件的不同,它的实现方式可能会有所不同,以实现最高性能。在将东西转换成LLVM之后,可能会非常-非常-非常昂贵(在计算复杂性方面)更改实现,使其更适合于可用的硬件。这就是为什么在编译成lower-level.

时应该由前端做出决定

这些只是一些想法,一个希望,显示出可能涉及的某种乐观情绪。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7311012

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档