MachineLateInstrsCleanup
该 Pass 用于在机器代码阶段删除完全相同的延迟(late)指令,特别是移除由重计算(rematerialization)或框架索引消除后产生的冗余立即数或地址加载指令,从而精简最终生成的机器指令。
“完全相同的延迟指令”:“延迟指令” 指的是这些指令不是在最初阶段生成的,而是在寄存器分配之后或 FrameIndex 消解阶段才生成的“后期指令(late instructions)”
Rematerialization(重构/重建/重计算)是 LLVM 在 寄存器分配时的一种策略,“与其从栈中 reload 某个值,不如干脆重新 计算/加载 这个值”。目的是:
避免使用太多物理寄存器;
减少 spill & reload(存回 + 加载);
利用立即数或简单可重构值的 cheap cost。
举个例子,假设在两个基本块中都有同一地址计算指令:
# 基本块 A
t0 = LEA addr(base, offset)
...
# 基本块 B(与 A 共享出口)
t1 = LEA addr(base, offset)
. ...