




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1第九章代码生成本章内容一个简单的代码生成算法涉及存储管理,指令选择,寄存器分配和计算次序选择等基本问题前端代码优化器中间代码源程序代码生成器中间代码目标程序29.1代码生成器设计中的问题9.1.1目标程序可执行目标模块可重定位目标模块允许程序模块分别编译调用其它先前编译好的程序模块汇编语言程序免去编译器重复汇编器的工作从教学角度,增加可读性39.1代码生成器设计中的问题9.1.2指令的选择目标机器指令系统的性质决定了指令选择的难易程度指令系统的一致性和完备性是重要的因素指令的速度和机器特点是另一些重要的因素49.1代码生成器设计中的问题若不考虑目标程序的效率,指令的选择是直截了当的。如:三地址语句x:=y+z翻译成如下代码序列:(x,y和z都是静态分配)MOV y, R0 /*把y装入寄存器R0*/ADD z, R0 /*z加到R0上*/MOV R0, x /*把R0存入x中*/逐个语句地产生代码,常常得到低质量的代码59.1代码生成器的设计中的问题语句序列a:=b+c d:=a+e的代码如下MOV b, R0ADD c, R0MOV R0, a--若a不再使用,第三条也多余MOV a, R0 --多余的指令ADD e, R0 MOV R0, d 69.1代码生成器设计中的问题9.1.3寄存器分配 运算对象处于寄存器中的指令通常比运算对象处于内存的指令要短一些,执行也快一些寄存器分配 选择驻留在寄存器中的一组变量寄存器指派
挑选变量要驻留的具体寄存器79.1代码生成器设计中的问题9.1.4计算次序的选择某种计算次序可能会比其它次序需要较少的寄存器来保存中间结果选择最佳次序是一个NP完全问题89.2目标机器9.2.1目标机器的指令系统选择可作为几种微机代表的寄存器机器四字节组成一个字,有n个通用寄存器R0,R1,…,Rn-1。二地址指令:op 源,目的 MOV {将源移到目的中} ADD {将源加到目的中} SUB {在目的中减去源}99.3基本块和流图怎样为三地址语句序列生成目标代码?begin |(1) prod:=0 prod:=0; |(2) i:=1 i:=1; |(3) t1:=4*i dobegin |(4) t2:=a[t1] prod:=prod+a[i]*b[i];|(5) t3:=4*i i:=i+1 |(6) t4:=b[t3] endwhilei<=20 |(7) t5:=t2*t4
end |(8) t6:=prod+t5 |(9) prod:=t6 |(10) t7:=i+1 |(11) i:=t7
|(12)ifi<=20goto(3)109.3基本块和流图9.3.1基本块基本块:连续的语句序列,控制流从它的开始进入,并从它的末尾离开再用有向边表示基本块之间的控制流信息,就能得到程序的流图119.3基本块和流图将三地址语句序列划分成基本块首先确定所有的入口语句序列的第一个语句是入口语句能由条件转移语句或无条件转移语句转到的语句是入口语句紧跟在条件转移语句或无条件转移语句后面的语句是入口语句每个入口语句到下一个入口语句之前的语句序列构成一个基本块129.3基本块和流图(1) prod:=0(2) i:=1(3) t1:=4*i(4) t2:=a[t1](5) t3:=4*i(6) t4:=b[t3](7) t5:=t2*t4
(8) t6:=prod+t5(9) prod:=t6(10) t7:=i+1(11) i:=t7(12) ifi<=20goto(3)(1)prod:=0(2)i:=1(3)t1:=4*i(4)t2:=a[t1](5)t3:=4*I(6)t4:=b[t3](7)t5:=t2*t4(8)t6:=prod+t5(9)prod:=t6(10)t7:=i+1(11)i:=t7(12)ifi<=20goto(3)B1B2139.3基本块和流图9.3.2基本块的变换三地址语句x:=y+z引用y和z并对x定值一个名字的值在基本块的某一点以后还要引用的话,我们说这个名字在该点是活跃的基本块的等价两个基本块计算一组同样的表达式这些表达式的值分别代表同样的活跃名字的值有很多等价变换可用于基本块局部变换全局变换149.3基本块和流图公共子表达式删除 a:=b+c a:=b+c b:=ad b:=ad c:=b+c c:=b+c d:=ad d:=b无用代码删除定值x:=y+z以后不再引用,则称x为无用变量159.3基本块和流图语句交换 t1:=b
+c t2:=x
+y t2:=x
+y t1:=b
+c当且仅当x和y都不是t1,b和c都不是t2
代数变换 x:=x+0 可以删除
x:=x*1 可以删除
x:=y**2 改成x:=y*y169.3基本块和流图9.3.3流图 把控制流信息加到基本块集合,形成一个有向图来表示程序 首结点、前驱、后继179.3基本块和流图什么是循环?所有结点是强连通的唯一的循环入口外循环和内循环内循环不含其它循环prod:=0i:=1t1:=4*it2:=a[t1]t3:=4*It4:=b[t3]t5:=t2*t4t6:=prod+t5prod:=t6t7:=i+1i:=t7ifi<=20goto
B2B1B2189.3基本块和流图9.3.4下次引用信息 为每个三地址语句x:=yopz决定x、y和z的下次引用信息
i: x:=yopz ... 没有对x的赋值
j: …:=x…... 没有对x的赋值
k: …:=…x199.3基本块和流图9.3.4下次引用信息 为每个三地址语句x:=yopz决定x、y和z的下次引用信息
i: x:=yopz ... 没有对x的赋值
j: …:=x…... 没有对x的赋值
k: …:=…x209.3基本块和流图对每个基本块从最后一个语句反向扫描到第一个语句,可以得到下次引用信息
i: x:=yopz ... 没有对x的赋值
j: …:=x…... 没有对x的赋值
k: …:=…x219.3基本块和流图对每个基本块从最后一个语句反向扫描到第一个语句,可以得到下次引用信息
i: x:=yopz ... 没有对x的赋值
j: …:=x…...没有对x的赋值
k: …:=…x利用下次引用信息,可以压缩临时变量需要的空间229.4一个简单的代码生成器依次考虑基本块的每个语句,为其产生代码假定三地址语句的每种算符都有对应的目标机器算符假定计算结果留在寄存器中尽可能长的时间,
除非:该寄存器要用于其它计算,或者到基本块结束239.4一个简单的代码生成器在没有收集全局信息前,暂且以基本块为单位来生成代码prod:=0i:=1t1:=4*it2:=a[t1]t3:=4*It4:=b[t3]t5:=t2*t4t6:=prod+t5prod:=t6t7:=i+1i:=t7ifi<=20goto
B2B1B2249.4一个简单的代码生成器9.4.1寄存器描述和地址描述例:对a:=b+c如果寄存器Ri含b,Rj含c,且b此后不再活跃产生ADDRj,Ri,结果a在Ri中如果Ri含b,但c在内存单元,b仍然不再活跃产生ADDc,Ri,或者MOVc,Rj ADDRj,Ri若c的值以后还要用,第二种代码比较有吸引力259.4一个简单的代码生成器在代码生成过程中,需要跟踪寄存器的内容和名字的地址寄存器描述符记录每个寄存器当前存的是什么在任何一点,每个寄存器保存若干个(包括零个)名字的值名字的地址描述符记录运行时每个名字的当前值存放的一个或多个位置该位置可能是寄存器、栈单元、内存地址或者是它们的某个集合这些信息可以存放在符号表中这两个描述符在代码生成过程中是变化的。269.4一个简单的代码生成器9.4.2代码生成算法对每个三地址语句x:=yopz调用函数getreg决定放yopz的计算结果的位置L查看y的地址描述符以确定y值当前的一个位置y.如果y的值还不在L中,产生指令MOVy,L
产生指令op
z,L,其中z是z的当前位置之一如果y和/或z的当前值不再引用,在块的出口也不活跃,并且还在寄存器中,则修改寄存器描述符279.4一个简单的代码生成器9.4.3寄存器选择函数函数getreg返回保存x:=yopz的x值的位置L如果名字y在R中,且R不含其它名字的值,并且在执行x:=yopz后y不再有下次引用,那么返回R作为L。否则,返回一个空闲寄存器,如果有的话否则,如果x在块中有下次引用,或者op是必须用寄存器的算符,则找一个已被占用的寄存器R(可能产生MOVR,M指令,并修改M的地址描述符)否则,如果x在基本块中不再引用,或者找不到适当的被占用寄存器,则选择x的内存单元作为L。289.4一个简单的代码生成器赋值语句d:=(ab)+(ac)+(ac)编译产生的三地址语句序列为: t1:=ab t2:=ac t3:=t1+t2 d:=t3+t2
9.4一个简单的代码生成器语句生成的代码寄存器描述符名字地址描述符寄存器空t1:=ab
MOVa,R0SUBb,R0
R0含t1
t1在R0中
t2:=acMOVa,R1SUBc,R1R0含t1R1含t2t1在R0中t2在R1中t3:=t1+t2
ADDR1,R0
R0含t3
R1含t2
t3在R0中t2在R1中
d:=t3+t2
ADDR1,R0
R0含dd在R0中
MOVR0,d
d在R0和内存中
309.4一个简单的代码生成器前三条指令可以修改,使执行代价降低MOVa,R0 MOVa,R0SUBb,R0 MOVR0,R1MOVa,R
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 第一课《了解真实的自己》(教案)-南大版心理健康五年级
- 全国浙教版信息技术八年级上册第一单元第5课《在线应用的实践》教学设计
- 2025年高考语文纸卷真题及答案
- 五年级信息技术下册 第十二课学当节目主持人1说课稿 华中师大版
- 2025年10月“江南十校”高三阶段检测 化学(A卷)含答案
- 私人订制星空泡泡浴创新创业项目商业计划书
- 老年智能跌倒检测设备创新创业项目商业计划书
- 绿色香料替代品企业制定与实施新质生产力项目商业计划书
- 红外热疗仪行业跨境出海项目商业计划书
- 绘画围裙行业跨境出海项目商业计划书
- 2024年河北邢台市广宗县招聘事业单位人员考试真题
- 第三单元第2课时儿童乐园(教学设计)数学北师大版二年级上册2025
- 建设用地审查报批课件
- 2025年企业首席质量官培训考核试题(含答案)
- 中国沈阳铁路局劳动合同8篇
- MOOC 跨文化交际通识通论-扬州大学 中国大学慕课答案
- (新版标准日本语初级下册)第25课 教学课件 知识点+练习
- 德国企业的共同治理模式
- 集成电路器件与SPICE模型9
- 民宿经营管理培训教材
- 住院医师规范化培训临床实践能力结业考核专科技能操作评分表(皮肤科)真菌镜检
评论
0/150
提交评论