编译原理lxy第11章
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
其DAG图如下: DAG图如下 图如下:
第17页
编译原理
第18页
编译原理
用DAG把其改写为G‘: DAG把其改写为 把其改写为G T2:= T3:= T1:= T4:=
C+D E-T2 E-T2 A+B -T3 T1-T3
设R0和R1是两个可使用的寄存器,T4是基本块出口之后的活跃变量, 是两个可使用的寄存器,T4是基本块出口之后的活跃变量, ,T 则生成的目标代码如下: 则生成的目标代码如下:
第12页
编译原理 各中间代码对应的目标代码
第13页
编译原理 11.4 寄存器分配
如何更有效的分配寄存器。 如何更有效的分配寄存器。
指令执行代价: 指令执行代价:
每条指令的执行代价=每条指令访问主存单元次数+1 每条指令的执行代价=每条指令访问主存单元次数+
对下循环程序段设R0、R1、R2江固定分给某三个变量使用,下面确定这 江固定分给某三个变量使用, 对下循环程序段设 、 、 江固定分给某三个变量使用 三个变量并生成该循环的目标代码。 三个变量并生成该循环的目标代码。
第7页
编译原理
考察基本块: 考察基本块: T:=A-B U:=A-C V:=T+U W:=V+U W是基本块出口的活跃变量,则有下表
设
第8页
编译原理 符号表中的待用及活跃信息
第9页
编译原理
第10页
编译原理
寄存器描述和地址描述 寄存器描述数组RVALUE动态记录个寄存器信息。 RVALUE动态记录个寄存器信息 寄存器描述数组RVALUE动态记录个寄存器信息。 变量地址描述数组AVALUE AVALUE动态记录各变量现行值的 变量地址描述数组AVALUE动态记录各变量现行值的 存放位置。 存放位置。
第19页
编译原理
第20页
第14页Baidu Nhomakorabea
编译原理
第15页
编译原理
第16页
编译原理 11.5 DAG的目标代码 的目标代码
为生成更有效的目标代码,对基本块中间代码序列,应按怎样的次序生成 为生成更有效的目标代码,对基本块中间代码序列, 器目标代码 例: 基本块中间代码序列为G: 基本块中间代码序列为G: T1:= A+B T2:= C+D E-T2 T3:= E-T2 -T3 T4:= T1-T3
代码生成算法 假设中间代码形为: 假设中间代码形为: A:=B op C 基本块代码生成算法:对每个中间代码依次执行: 基本块代码生成算法:对每个中间代码依次执行: 315页 (见P315页)
第11页
编译原理 目标代码: 目标代码:
对例11.1假设只有 和R1是可用寄存器,用上算法生成的目标代码和相 假设只有R0和 是可用寄存器 是可用寄存器, 对例 假设只有 应的RVALUE和AVALUE如下表: 如下表: 应的 和 如下表
编译原理
第十一章
目标代码生成
编译原理 目标代码的形式
机器语言代码 所有地址已定位,可立即执行 所有地址已定位, 待装配的机器语言模块 汇编语言代码
代码生成考虑(执行速度): 代码生成考虑(执行速度): 如何使生成的代码较短 如何利用计算机的寄存器, 如何利用计算机的寄存器,减少目标代码中访问存储单元的 次数
目标指令
第6页
编译原理
待用信息 计算变量待用信息算法 1、开始,将基本块中各变量的符号表登记项中的待用信息栏填为“非待 用”,并根据该变量在基本块出口之后是否活跃填写活跃信息栏。 2、从基本块出口到基本块入口由后往前依次处理各中间代码,对每一中间 代码 i:A:=B op C 依次执行: a)将符号表中变量A的待用信息和活跃信息附加到中间代码i上; b)将符号表中变量A的待用信息和活跃信息分别置为“非待用”和 “非活跃”; c)将符号表中变量B和C的待用信息和活跃信息附加到中间代码i上; d)将符号表中变量B和C的待用信息均置为i,活跃信息均置为“活 跃”。 注意:次序不可颠倒。 如果中间代码形式为 A:= op B 或 A:= B 除 不涉及C外步骤完全相同。
第2页
编译原理 11.1
代码生成器的输入
基本问题
目标程序
指令选择寄存器分配
计算顺序选择
第3页
编译原理 11.2 目标机器模型
假设目标计算机有下列指令形式
第4页
编译原理 指令的意义: 指令的意义:
第5页
编译原理 11.3 一个简单的代码生成器
将每条中间代码变换成目标代码,并在一个基本块范围内考虑充分利用寄存器问题。 将每条中间代码变换成目标代码, 并在一个基本块范围内考虑充分利用寄存器问题。 A:=(B+C)*D+E 例: 高级语言 中间代码 T1:=B+C T2:=T1*D A:=T2+E (1) LD ) R,B (2) ADD R,C (3) ST R,T1 (4) LD R,T1 (5) MUL R,D (6) ST R,T2 (7) LD R,T2 (8) ADD R,E R,A (9)ST 优化: (1) 优化: ) (2) (3) 3 ( 4) (5) LD ADD MUL ADD ST R,B R,C R,D R,E R,A