-[UD 链(Use-Define Chain)与 DU 链(Definition-Use Chain)](#ud-链use-define-chain与-du-链definition-use-chain)
-[Mem2Reg](#mem2reg)
-[1.2 注册及运行 Mem2Reg Pass](#12-注册及运行-mem2reg-pass)
-[注册 Pass](#注册-pass)
-[运行 Pass](#运行-pass)
-[1.3 实验任务](#13-实验任务)
-[思考题](#思考题)
-[2. 提交要求](#2-提交要求)
-[2.1 目录结构](#21-目录结构)
-[2.2 提交要求和评分标准](#22-提交要求和评分标准)
## 0. 前言
在 lab3 中,我们通过访问者模式遍历抽象语法树,实现了一个中间代码自动生成工具。在 lab4,我们将对 lab3 生成的 IR 进行优化。本次实验是一个预热实验,为下一阶段编写优化方案提供必要的基础知识:SSA 格式的 IR ,以及优化 Pass 的概念。
## 1. 实验内容
### 1.1 阅读相关材料与代码
#### 1.1.1 SSA IR 材料阅读
Static single-assignment form(静态单赋值形式,通常缩写为SSA形式)是 IR 的一个属性,它要求每个变量在使用前被精确赋值一次并被定义。对原有变量的多次赋值会被分割成不同*版本*,这样每个定义都有自己的版本。SSA 形式下,[UD 链](#ud-链use-define-chain与-du-链definition-use-chain)是显式的,并且只含有一个元素。
观察下面的 `cminus` 程序,局部变量 `a` 经历了多次赋值。
```c
intmain(void){
inta;
a=1+2;
a=a*4;
return0;
}
```
如下 IR 由 lab3 的中间代码生成器得出。虽然该段 IR 中的虚拟寄存器仅被赋值一次,属于 SSA 格式,但该 `cminus` 程序对局部变量`a`的多次赋值,在 IR 中仍以多次冗余的访存体现,存在不必要的 `alloca\load\store` 指令。这些指令会严重影响程序性能,所以我们需要移除这些冗余指令。
###### UD 链(Use-Define Chain)与 DU 链(Definition-Use Chain)
Pass 在对指令进行替换与修改时,需要查找相关变量的定义和使用。在这里,我们引入UD 链(Use-Define Chain)与 DU 链(Definition-Use Chain)的概念。UD链描述了一个变量的使用(use)和其所有定义(def),DU链描述了一个变量的所有定义(def)和该定义能到达的所有使用(use)。在我们的框架中,UD 链和 DU 链的实现可以阅读`LightIR`中的[LightIR核心类介绍.md](../common/LightIR.md)中的User类的`operands_`成员,Value类的`use_list_`成员。