因为之前的两篇博文前瞻-全时优化和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最近几年发表的文章:
- “Making Context-sensitive Points-to Analysis with Heap Cloning Practical For The Real World”
PLDI 2007, San Diego, CA, June 2007。 - “Macroscopic Data Structure Analysis and Optimization”
Ph.D. Thesis, Computer Science Dept., University of Illinois at Urbana-Champaign, May 2005. - “Automatic Pool Allocation: Improving Performance by Controlling Data Structure Layout in the Heap”
PLDI 2005, Chicago, IL, June 2005.
PLDI’05 Best paper award. - “Transparent Pointer Compression for Linked Data Structures”
MSP 2005, Chicago, IL, June 2005.
基本也没有太多触及LLVM整体架构的。
另外,Chris Lattener在近几年的几个邀请报告上也简明扼要的讲解了LLVM的架构。
- “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. - “Introduction to the LLVM Compiler System”
Plenary Talk, ACAT 2008: Advanced Computing and Analysis Techniques in Physics Research, Erice, Sicily, Italy, November 2008. - “LLVM and Clang: Next Generation Compiler Technology”
BSDCan 2008, Ottawa, Canada, May 16-17, 2008. - “The LLVM Compiler System”
2007 O’Reilly Open Source Convention, Portland, OR, July 2007. - “LLVM 2.0 and Beyond!”
Google Tech Talk, Mountain View, CA, July 25, 2007. - “LLVM in OpenGL and for Dynamic Languages” (and several others)
LLVM Developer Meeting, Cupertino, CA, May 2007. - “The LLVM Compiler System”
2007 Bossa Conference on Open Source, Mobile Internet and Multimedia, Recife, Brazil, March 2007. - “Introduction to the LLVM Compiler Infrastructure”
2006 Itanium Conference and Expo, San Jose, California, April 2006.
对比一下Chris最近几年在不同的文献中,对LLVM的架构描述也是很有意思的。
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位系统.










最近老板让看LLVM的Paper,看了你的博文后对处于入门阶段的我帮助还是很多的。在此向你道谢~
不过我有一个问题,就是你所有LLVM的博文里的图片我都看不到。这是我个人的原因还是别的?
比如:http://www.lingcc.com/wp-content/uploads/2010/04/llvm-arch1-300×65.jpg
不是你的原因,是我的问题。编译点滴网站曾经做过一次服务器迁移,迁移过程中,所有图片都丢失了。某些历史文章的图片就没了。因为图片量比较大,就没能恢复。
很抱歉。文中的图片都来自网上的ppt、论文中的截图。你可以试着搜搜。
[...] 有了C++之类的语言保证,NaCl的应用的运行效率就有了保证。但还需要开发者预先跟据指令集的不同,编译得到不同的机器码,再根据访问者的CPU分发相应的机器码。问题可想而知:兼容性,可移植性不好。于是Google 想到了热火朝天的LLVM(关于LLVM:《前瞻-全时优化和LLVM-1》《前瞻-全时优化和LLVM-2》《前瞻-LLVM大事记(2004-2010)》).PNaCl就诞生了。 使用LLVM开发Nacl应用流程 [...]
[...] 前瞻-LLVM大事记(2004-2010) [...]
仔细阅读了博客上关于LLVM的2篇文章,大概有点了解了。thanks
@yajin, 不客气:) LLVM的优点在于他很年轻,到现在才开发了8年.架构和中间表示都比较符合潮流。GCC和Open64都已经很老了. 一个产品级支持多CPU的编译器架构需要很多年的调整才能成熟。 LLVM的中间表示偏低,而且看中优化模块的重用。因为比较年轻,编译器的编码结构很清晰,便于开发。 透明的机器代码生成和JIT解释执行也让它能很方便的debug。
以上仅仅是我的理解。呵呵
[...] 编译点滴 [...]
也就是说LLVM相比GCC性能还是弱。那么LLVM的优点到底在哪里?