这是Fred chow 在德拉华大学所讲的open64课程讲稿的翻译。若需要原文ppt,请发邮件向我索取。
转载请注明出处: http://lingcc.com
Fred Chow 原版幻灯片见最后一页
1,历史:
1980-83 斯坦福大学RISC编译器研究
1987 MIPS Ucode编译器(R2000) -O2下的全局优化
1991 MIPS UCode编译器(R4000) -O3下的循环优化
另外:
1989 Cydrome Cydra5编译器 软流水优化
1994 SGI Ragnarok编译器(R8000) 浮点性能优化(Floating-pt performance?)
1997年SGI将上面两个分支连同斯坦福SUIF的工作,Rice的IPA整合在一起发布MIPSpro编译器(R10000)
2000年Pro64/Open64编译器(安腾)诞生
2,Open64大事记:
1994:MIPS R10000编译器开发工作开始
1996 :SGI MIPSpro 编译器合并
1998:开始移植后端到安腾,并将前段变更为gcc/g++
2000: Pro64编译器通过GPL协议开源
2001:SGI放弃支持,德拉华大学将编译器重新命名为open64
2001-2004: 计算所和Intel开始合作开展针对安腾的ORC
2003:PathScale开始支持x86后端的移植工作
2004:四月PathScale X86编译器合并
3,Open64的重要特性
在当今的产品级编译器中是最先进的设计
架构设计的重点放在优化实现上
1996年作为产品级编译器,2000年开源
兼容gcc/g++并能和其交互工作,包括源码结构,命令行,ABI和装载
易扩展和增强
易移植到新处理器
被广泛使用在当今的很多优化研究中
适合小团队的开发环境
4,PathScale编译器的重要贡献
移植到X86/X86-64
从2004年开始一直是x86 64位中性能最好的
在GNU和Open64之间建立了桥梁,以便方便的跟随GNU的发布
拥有OpenMP运行时库的专利权
质量评价和编译机制
5,Open64总体设计
全范围优化兼容的编译器架构
重要组成—-一个通用的中间表示WHIRL:
a,支持多前端的独立后端
b,一种中间表示,多层表示
c,编译处理过程即为中间表示不断降低的过程。
给予优化范围的特定成分:
a,LNO:Loop-oriented,基于数据依赖的优化
b,WOPT:基于SSA的全局范围优化
c,IPA:inter-procedural,过程间优化,需要对整个程序的分析
d,CG:代码生成,依赖于目标机
在不同阶段之间无重复工作:
a,所有阶段都可调用WHIRL简化函数
b,共享的分析结果
c,彼此调用来完成工作
6,编译器中中间表示(IR)的角色
支持多前端
支持多处理器
进行优化变换的中介
各个阶段间的通用接口
促进编译器设计中的模块化
减少多余功能
现代编译器中的关键设施
7,IR的语法层次:
从高到低,高层次靠近源程序,低此次接近机器指令
在较高层次中:
a,较多样的组成
b,较短的代码序列
c,较多的程序信息表示
d,分层次的结构
e,不能进行很多优化
在较低层次中:
a,较少的程序信息
b,较少的结构种类
c,较长的代码序列
d,较平坦的结构
e,所有的优化都能进行
8,Open64的WHIRL IR
WHIRL由SGI的Open64小组开发:
a,一种IR,多层表示
b,编译过程即不断降低表示层次的过程
c,每个优化都有其最适合做的表示层
d,共享分析结果
e,阶段之间没有冗余操作
9.编译过程:
源码->前段(FE)->高层优化(VHO)->过程间优化(IPA)->循环嵌套优化(LNO)->全局优化(WOPT)->代码生成(CG)->汇编码输出
对应中间表示:
源码->非常高层WHIRL->高层WHIRL->中间层次WHIRL->较低层WHIRL->目标机指令->汇编码输出
10,优化设计的总原则
在能榨取转换机会的最高层次做优化,即在尽可能高层次做优化
a,有更多能协助分析的源程序信息
b,需要操作的代码序列较短
c,对于相同的计算,变更最少
将使得:
a,实现代价较小
b,更快更高效的优化
c,更稳定(便于测试和debug)
11,阶段次序设计原则
较低层处理的需求:在较低层次暴露的优化机会需要在较晚时做
能暴露优化机会的较早的阶段:内联(Inline),常数传播,循环合并
能为较后阶段计算有利信息的阶段:别名和指针冲突消除,使用-定义关系,数据依赖
能规范代码的较早阶段:相比其他阶段对代码的变动较小的,不能提高程序性能de,依赖较后阶段清理操作的
会被使用多次的小代价优化
将破坏源程序信息的优化尽可能的放在后面
12,WHIRL的设计
可执行代码的WHIRL树节点:
a,WHIRL节点在common/com/wn_core.h文件中被定义
b.每个函数体被一个大树表示
用于定义的WHIRL符号表:
a,不同的表用于表示不同的声明结构
b,参见common/com/symtab*.h文件
最小的WHIRL节点是24字节
使用了域压缩来节省空间
二进制读写—WHIRL文件是ELF文件格式的
不同的阶段有唯一的WHIRL文件后缀:
a,前端:.B
b,IPA/内联器: .I
c,LNO: .N
d.WOPT: .O
ASCII 翻译器
13,重要的WHIRL概念
operator:操作的名称
desc:操作数的机器类型(标量)
rtype:结果数的机器类型(标量)
opcode:三元组(operator,rtype,desc)
symbol table index:一个源码中符号对应的唯一标识符
high level type:和源码声明相同的类型结构–对实现ANSI别名规则很重要(?)
field-id:在一个结构体或union中唯一的标识符,较新的为X86 MMX/SSE定义的128-位SIMD机器类型
14,优化中的WHIRL概念
语句节点是序列点(? Statement nodes are sequence points)
a,仅在语句边界可能有副作用
b,有副作用的语句有:Stores(存储),Calls(调用),asms(汇编?)
表达式节点不是序列点
表达式执行无副作用的计算–允许激进的表达式转换
源码位置信息(为了调试需要)仅应用于语句节点
15.WHIRL 映射(?)
注释型WHIRL节点有附加信息
解决WHIRL节点大小固定问题
对临时信息很有用
WHIRL节点归类
Map_id存储在每个WHIRL节点中–同一类中map_id唯一
信息存储在map 表中,并以map_id作为索引
16,更高层WHIRL(Very High WHIRL)
维持源码中的抽象表示
能在损失较少语义的情况下转回C/F90
最初被使用于FORTRAN 90,随后扩展到C/C++中
尽在VH WHIRL中允许的结构:逗号操作符,嵌套函数调用,C选择符(?和:),F90中的triplet,arrayexp,arrsection,where
内联器能够工作在此层
17,高层WHIRL
支持循环级优化的结构
固定的控制流(虽然还不精确)
关键结构:ARRAY(数组,数据依赖分析和向量化),DO循环,IF语句,FORTRAN I/O语句
IPA,PREOPT和LNO工作在此层
能转换回源语言—允许用户看到内联和LNO的效果
18,中间层WHIRL
一对一映射到RISC指令
通过jumps(跳转)实现精确的控制流
地址计算暴露出来(因为无ARRAY了?)
位域访问暴露
复数被扩展为浮点数操作
WOPT在此层工作—统一的表示提升了优化的机会
19,低层WHIRL
为了便于在CG转换为机器指令而出现的最后的WHIRL形式
一些内在intrinsics(?)使用calls(调用)代替
遵循连接协议的形式暴露(?)
数据布局结束
整个Open64课程系列的文章包括以下,请阅读中指正
Open64课程-简介,概述和中间表示
Open64课程- 编译过程
Open64课程-内联
Open64 课程–全局标量优化(WOPT I) part 1
Open64 课程–全局标量优化(WOPT I) part II
Open64 课程–全局标量优化(WOPT II)
open64课程–过程间分析优化(IPA)
Open64课程—代码生成(CG)
————————————————————
以上是Fred Chow在德拉华大学所讲课程的第一讲 Section A Introduction ,Overview and IR的内容翻译所成的。
转载请著名出处: http://lingcc.com
PS:感谢Grey兄的指正:)

真有耐心,顶~
Pingback: Open64课程-结语 « 编译点滴
Pingback: Open64课程-内联 « 编译点滴
Pingback: Open64 课程–全局标量优化(WOPT I) part II « 编译点滴
Pingback: Open64 课程–全局标量优化(WOPT II) « 编译点滴
Pingback: open64课程–过程间分析优化(IPA) « 编译点滴
Pingback: Open64课程-循环嵌套优化(LNO) « 编译点滴
Pingback: Open64课程–反馈指导优化(FDO) « 编译点滴
16,较高层WHIRL(VH WHIRL)
应该是very high whirl吧,不应该是较高层啊
14.在语句边界可能有副作用吧??我也不知道
1,翻译的时候,因为已经把High WHIRL翻译成了高层WHIRL,所以Very High WHIRL就不知道怎么翻译好,修改成了更高层WHIRL,后面括号里加了(VH WHIRL)的缩写。 表述的有点不清楚。
2,我翻译错误,原文是“Side effects only possible at statement boundaries”.应该翻译成只可能在语句边界有副作用。 谢谢你的指正。
另外,对这句话不是很理解。什么是语句边界?还请解释一下,谢谢。
Pingback: 《编译点滴》半年记 « 编译点滴
您好,我想看看原文ppt,可以没有找到您的邮件. 另外,这个课程有video record吗?