MachineCopyPropagation

MachineCopyPropagation 是一个 LLVM 后端优化 Pass,用于删除冗余的寄存器 COPY 指令并尝试用原始源寄存器替换目标寄存器,从而提升机器码质量和执行效率。

COPY 指令:即 %r1 = COPY %r0,表示将一个寄存器的值复制到另一个寄存器,常由寄存器分配后插入。

还有一些概念如下:

  • 冗余 COPY:当一个 COPY 的目的寄存器没被改变,可以直接使用源寄存器替代。
  • 前向传播(forward propagation):用 COPY 的源替换其目的的使用点。
  • 后向传播(backward propagation):将使用者的定义替换为 COPY 中的目的。

下面来举个例子(前向传播):

%r1 = COPY %r0
...
%r2 = ADD %r1, %r3

直接优化为:

%r2 = ADD %r0, %r3

例子 2(冗余 copy 删除)

%r1 = COPY %r0
...
%r0 = COPY %r1  ; 冗余的 COPY

在保证 %r0 未被其他指令修改的前提下,第二条 COPY 可被移除。

该 Pass 有一千余行代码,核心入口就是:

for (MachineBasicBlock &MBB : MF) {  
  if (isSpillageCopyElimEnabled)  
    EliminateSpillageCopies(MBB);  
  BackwardCopyPropagateBlock(MBB);  
  ForwardCopyPropagateBlock(MBB);  
}