The Decaf Book
  • Introduction
  • 语言规范
  • Java 框架分阶段指导
    • 本章导引
    • PA1-A:语法分析器的自动构造
      • 阶段任务
      • 词法分析
      • 抽象语法树
      • 文法分析
    • PA1-B:基于 LL(1) 的语法分析器半自动构造
      • 阶段任务
      • LL(1) 文法分析
      • 错误恢复
    • PA2:语义分析
      • 阶段任务
      • 类型、符号和作用域
      • 访问者模式
      • 符号表构建
      • 类型检查
    • PA3:中间代码生成
      • 阶段任务
      • TAC 程序
      • 面向对象机制
      • 控制流的翻译
    • PA4:中间代码优化
      • 实验内容
      • 基本块
      • 数据流分析概述
      • 数据流优化概述
      • 公共表达式提取
      • 复写传播
      • 常量传播
      • 死代码消除
  • Scala 框架分阶段指导
    • 本章导引
    • PA1:语法分析器的自动构造
      • 阶段任务
      • 词法分析
      • 抽象语法树
      • 文法分析
      • 访问者模式
    • PA2:语义分析
      • 阶段任务
      • 类型、符号和作用域
      • 符号表构建
      • 类型检查
    • PA3:中间代码生成
      • 阶段任务
      • TAC 程序
      • 面向对象机制
      • 控制流的翻译
    • PA3-JVM:JVM 字节码生成
      • 阶段任务
      • JVM 字节码简介
      • 翻译过程
    • PA4:中间代码优化
      • 实验内容
      • 基本块
      • 数据流分析概述
      • 数据流优化概述
      • 公共表达式提取
      • 复写传播
      • 常量传播
      • 死代码消除
  • Rust 框架分阶段指导
    • 本章导引
    • PA1-A:语法分析器的自动构造
      • 实验内容
      • lalr1使用指导
        • 编写lexer
        • impl块的可选属性
        • 产生式和语法动作
        • 解决冲突
        • 一个完整的例子
      • 抽象语法树
      • 框架中部分实现的解释
      • 文件结构
    • PA1-B:基于 LL(1) 的语法分析器半自动构造
      • 实验内容
      • lalr1使用指导
      • 错误恢复
      • 文件结构
    • PA2:语义分析
      • 实验内容
      • 语义分析
      • 符号表
      • visitor模式
    • PA3:中间代码生成
      • 实验内容
      • 中间代码
      • 中间代码中的类型信息
      • 运行时存储布局
      • 面向对象机制
      • tacvm简述
    • PA4:中间代码优化
      • 基本块
      • 数据流分析概述
      • 数据流优化概述
      • 公共表达式提取
      • 复写传播
      • 常量传播
      • 死代码消除
    • PA5:寄存器分配
      • 实验内容
      • 图着色基本原理
      • 着色算法
      • 预着色节点
      • 干涉图节点合并
      • 调用约定
Powered by GitBook
On this page

Was this helpful?

  1. Rust 框架分阶段指导
  2. PA5:寄存器分配

预着色节点

如之前展示的例子所示,指令选择中虽然基本上都使用虚拟寄存器,但是也有部分指令需要用到机器寄存器,机器寄存器的出现意味着平台相关信息,例如:

  • mips调用约定中,$v0和$v1用于存放返回值;x86调用约定中,eax用于存放返回值

  • 部分指令只能用特定的寄存器作为操作数,例如x86中的idiv reg指令,使用edx:eax作为被除数,源操作数reg作为除数,除法结果存放于eax中,模结果存放于edx中

  • 函数调用需要使用指定的寄存器传递参数,例如mips调用约定中,$a0-3用于存放前四个参数,后续的参数则利用$sp通过栈传递

如果只允许生成只包含虚拟寄存器的汇编代码,是无法正确描述这些信息的。

汇编指令中的机器寄存器在干涉图中对应于一个预着色节点。与普通节点类似,它也会因为冲突而其他节点连边,特殊之处在于预着色节点间一定两两冲突。这就让着色算法没有必要从图中删除预着色节点:如果它的度数小于KKK,那么只能是K−1K - 1K−1,邻居只有其它预着色节点,把它删掉不会对图的其他部分的着色有任何贡献。

此外,George认为预着色节点可能与很多节点冲突(至少预着色节点间两两冲突),为效率起见,不显式构造预着色节点的边列表。

Previous着色算法Next干涉图节点合并

Last updated 5 years ago

Was this helpful?