ExpandPostRAPesudos

此 Pass 在寄存器分配(RA)阶段之后,将 Machine IR 中的伪指令(如 COPYSUBREG_TO_REG)展开为目标机器指令,以便生成真正的物理寄存器操作。
该 Pass 的代码量很少,但涉及一些概念:

  • 伪指令(Pseudo instructions):在后端生成机器码前使用的占位符指令,不一定直接对应目标指令集,需要在合适阶段“展开”或“下沉”成真实指令
  • 寄存器分配(Register Allocation):将 IR 中的虚拟寄存器映射到物理寄存器;完成后,所有指令的寄存器操作都已固定为物理寄存器
  • 子寄存器(Subregister)操作:在部分体系结构中,一个物理寄存器可以拆分为若干子寄存器(如 x86 的 EAXAXAL 都是 %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 等寄存器移动指令。