因为之前的两篇博文前瞻-全时优化和LLVM-1前瞻-全时优化和LLVM-2都是基于Chris Lattner 2004年发表在CGO的文章写的。所以需要介绍一下LLVM从2004到2010这六年的变化,LLVM的开发社区很活跃。

从2004年三月到2010年4月,LLVM共发布了1.2-1.9,2.0-2.7,16个版本,至少每年发布两个版本。详细的历史发布版本和release都能从这里找到。

  • 1.2增加了调试信息支持,
  • 1.3增加精确垃圾收集功能,
  • 1.4增加PowerPC JIT支持,增加通用的编译驱动器和连接器;
  • 1.5增加针对Alpha,IA-64和SPARC-V8的代码生成器,新的指令选择机制;
  • 1.6指令选择能从机器模型中生成,指令调度支持,支持子目标机代码生成器;
  • 1.7向量支持,新的GCC4.0 C/C++前端,Objective C/C++支持,汇编内联支持;
  • 1.8DWARF调试支持,循环优化改进;
  • 1.9新的X86-64后端,连接时优化能和本机连接器交互;
  • 2.0中间表示更新(整型完全无符号化,任意长度位的整型支持),代码生成器更新(软浮点支持),X86,ARM,PowerPC代码生成改进;
  • 2.1.gcc-4.2前端,Fortran,Ada和OpenMP支持,MIPS后端支持;
  • 2.2 Clang启动,CellSPU后端支持,精确垃圾收集代码重构;
  • 2.3, 不再支持gcc4.0前端,vmkit启动(用LLVM实现JVM和CLI),多返回值支持,llvmc重构,连接时优化起结构重写
  • 2.4,增加优化,并缩短O0编译时间,PIC16微处理器支持
  • 2.5,启动Pure,LLVM D Compiler,Roadsend PHP;XCore后端支持
  • 2.6,启动compiler-rt,KLEE,machine code toolkit,开优化时调试信息行号支持,新MSP430,SystemZ和Blackin后端支持,Gold连接器插件支持
  • 2.7,启动LLVM新logo,MicroBlaze后端支持。

以上就是从04年到10年LLVM每次发行新版本中给出的最要新特性.可以看出,几乎和普通的编译器没有什么两样。所做的无非在增加新前端,编译更多的语言,支持新后端,可以在更多的处理器上运行。增加中间优化,调bug。

LLVM近几年的发展路线已经越来越像一个标准的,前端+后端+优化的编译器。运行时的优化也大部分集中在JIT上,反馈制导优化也没有涉及。

Chris Lattener最近几年发表的文章:

  1. Making Context-sensitive Points-to Analysis with Heap Cloning Practical For The Real World
    PLDI 2007, San Diego, CA, June 2007。
  2. Macroscopic Data Structure Analysis and Optimization
    Ph.D. Thesis, Computer Science Dept., University of Illinois at Urbana-Champaign, May 2005.
  3. Automatic Pool Allocation: Improving Performance by Controlling Data Structure Layout in the Heap
    PLDI 2005, Chicago, IL, June 2005.
    PLDI’05 Best paper award.
  4. Transparent Pointer Compression for Linked Data Structures
    MSP 2005, Chicago, IL, June 2005.

基本也没有太多触及LLVM整体架构的。

另外,Chris Lattener在近几年的几个邀请报告上也简明扼要的讲解了LLVM的架构。

  1. State of Clang” (shared talk) and several other pieces of the meeting, such as the introduction, open discussion forum, etc.
    LLVM Developer Meeting, Cupertino, CA, Oct 2009.
  2. Introduction to the LLVM Compiler System
    Plenary Talk, ACAT 2008: Advanced Computing and Analysis Techniques in Physics Research, Erice, Sicily, Italy, November 2008.
  3. LLVM and Clang: Next Generation Compiler Technology
    BSDCan 2008, Ottawa, Canada, May 16-17, 2008.
  4. The LLVM Compiler System
    2007 O’Reilly Open Source Convention, Portland, OR, July 2007.
  5. LLVM 2.0 and Beyond!
    Google Tech Talk, Mountain View, CA, July 25, 2007.
  6. LLVM in OpenGL and for Dynamic Languages” (and several others)
    LLVM Developer Meeting, Cupertino, CA, May 2007.
  7. The LLVM Compiler System
    2007 Bossa Conference on Open Source, Mobile Internet and Multimedia, Recife, Brazil, March 2007.
  8. Introduction to the LLVM Compiler Infrastructure
    2006 Itanium Conference and Expo, San Jose, California, April 2006.

对比一下Chris最近几年在不同的文献中,对LLVM的架构描述也是很有意思的。

llvm-02 from Chris M.S. Thesis 2002

LLVM CGO2004

LLVM 06 Link-Time Optimization

LLVM 06 Code Generator

LLVM 08

LLVM始终坚持的是LLVM代码在代码生成器,解释执行之间的透明性。重点突破的一直是过程间优化。但架构却基本上摒弃了全时优化,开始走经典的静态分析路线。和GCC、Open64相比,在目的上也没有差别了。
LLVM的性能方面,相比于GCC还逊色不少,和Open64就更没法比了.很遗憾,我没有找到将这三个编译器作性能对比的文章.已有的Open64的数据都是非常老的,没什么可比性。而且编译优化这个东西,差距很大。关键是看有没有人做,投入多大经历做,太老的数据没有什么对比意义。

但LLVM和GCC最新版的对比有, LLVM2.7和GCC 4.5的性能对比(图来自http://vmakarov.fedorapeople.org/spec/):

  • SPEC 2000 整点(-O2)

  • SPEC2000浮点(-O2)

  • SPEC 2000 整点(-O3)

  • SPEC 2000 浮点(-O3)

O2和O3优化下,GCC的性能平均都比LLVM 2.7要好大概2%-3%左右。浮点GCC的优势比整点要大.上面数据仅供参考:)

此外上面的网页中也对编译时间做了对比。LLVM比GCC要快30%左右。

以上数据测试平台:2.93Ghz Intel Core I7 with 8GB memory under Fedora Core10. X86 32位系统.

相关文章:

  8 Responses to “前瞻-LLVM大事记(2004-2010)”

  1. 最近老板让看LLVM的Paper,看了你的博文后对处于入门阶段的我帮助还是很多的。在此向你道谢~

    不过我有一个问题,就是你所有LLVM的博文里的图片我都看不到。这是我个人的原因还是别的?

    比如:http://www.lingcc.com/wp-content/uploads/2010/04/llvm-arch1-300×65.jpg

    • 不是你的原因,是我的问题。编译点滴网站曾经做过一次服务器迁移,迁移过程中,所有图片都丢失了。某些历史文章的图片就没了。因为图片量比较大,就没能恢复。
      很抱歉。文中的图片都来自网上的ppt、论文中的截图。你可以试着搜搜。

  2. [...] 有了C++之类的语言保证,NaCl的应用的运行效率就有了保证。但还需要开发者预先跟据指令集的不同,编译得到不同的机器码,再根据访问者的CPU分发相应的机器码。问题可想而知:兼容性,可移植性不好。于是Google 想到了热火朝天的LLVM(关于LLVM:《前瞻-全时优化和LLVM-1》《前瞻-全时优化和LLVM-2》《前瞻-LLVM大事记(2004-2010)》).PNaCl就诞生了。 使用LLVM开发Nacl应用流程 [...]

  3. [...] 前瞻-LLVM大事记(2004-2010) [...]

  4. 仔细阅读了博客上关于LLVM的2篇文章,大概有点了解了。thanks

    • @yajin, 不客气:) LLVM的优点在于他很年轻,到现在才开发了8年.架构和中间表示都比较符合潮流。GCC和Open64都已经很老了. 一个产品级支持多CPU的编译器架构需要很多年的调整才能成熟。 LLVM的中间表示偏低,而且看中优化模块的重用。因为比较年轻,编译器的编码结构很清晰,便于开发。 透明的机器代码生成和JIT解释执行也让它能很方便的debug。
      以上仅仅是我的理解。呵呵

  5. 也就是说LLVM相比GCC性能还是弱。那么LLVM的优点到底在哪里?

 Leave a Reply

(required)

(required)

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

   
2009-2011© 编译点滴 Suffusion theme by Sayontan Sinha

无觅相关文章插件,快速提升流量