后端Pass简介——MachineCopyPropagation
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);
}
评论