后端Pass简介-——ExpandPostRAPesudos
ExpandPostRAPesudos
此 Pass 在寄存器分配(RA)阶段之后,将 Machine IR 中的伪指令(如 COPY、SUBREG_TO_REG)展开为目标机器指令,以便生成真正的物理寄存器操作。
该 Pass 的代码量很少,但涉及一些概念:
- 伪指令(Pseudo instructions):在后端生成机器码前使用的占位符指令,不一定直接对应目标指令集,需要在合适阶段“展开”或“下沉”成真实指令。
- 寄存器分配(Register Allocation):将 IR 中的虚拟寄存器映射到物理寄存器;完成后,所有指令的寄存器操作都已固定为物理寄存器。
- 子寄存器(Subregister)操作:在部分体系结构中,一个物理寄存器可以拆分为若干子寄存器(如 x86 的
EAX、AX、AL都是%RAX的不同子部分),需要专门的指令来插入或抽取子寄存器。
该 Pass 本质还是 Lowering 的一种。
假设有这样一条伪指令:
/// %rax = SUBREG_TO_REG 0, killed %eax, 3它的含义是:把 %eax 的内容插入到 %rax 的第 3 号子寄存器(对应低 32 位),并标记 %eax 为被“杀死”后续不再使用。
- 如果目标机器可以直接用一条“子寄存器写入”指令,那么
expandPostRAPseudo可以让目标自己实现。 - 否则,默认会被 LowerSubregToReg 转换为一个物理寄存器拷贝:
COPY %sub_rax, %eax 同时在必要时插入对 %rax 的“隐式定义”,并删除原伪指令。
在代码上,该 Pass 会重置 CFG、MachineLoopAnalysis、MachineDominatorAnalysis,但是不依赖于任何分析 Pass。
其实其就是靠 Switch 处理以下两种指令:
- SUBREG_TO_REG
- COPY:对于 Copy,要生成如 mov 等寄存器移动指令。
评论






