到目前为止讨论的所有优化都可以应用于程序的高级结构,而无需考虑特定的目标机器。低级优化更多地从底层机器的特性角度进行思考和优化,实践案例:# 针对LLVM的RISCV后端的的codesize优化 (BLT to BLEZ)。窥孔优化窥视孔优化是指非常狭隘地关注一小部分代码(可能只是两到三个指令)并在该部分内进行安全、集中的更改的任何优化。这些优化在编译的最后阶段很容易实现,但总体效果有限。冗余负载消除是一种常见的窥孔优化。修改和使用同一变量的表达式序列很容易导致两条相邻指令将寄存器保存到内存中,然后立即再次加载相同的值:// Before
MOVQ %R8, x
MOVQ x, %R8
// After
MOVQ %R8, x一个细微的变化是,对不同寄存器的加载可以转换为寄存器之间的直接移动,从而节省不必要的加载和管道停顿:// Before
MOVQ %R8, x
MOVQ x, %R9
// After
MOVQ %R8, x
MOVQ %R8, %R9指令选择在某些简单的代码生成方法中,其中 AST(或 DAG)的每个节点都被至少一条指令(在某些情况下,多条指令)替换。在丰富的 CISC 指令集中,单个指令可以轻松组合多个操作,例如取消引用指针、访问内存以及执行算术运算。为了利用这些强大的指令,我们可以使用通过树覆盖来选择指令的技术。这个想法是首先将架构中的每个可能的指令
...
继续阅读
(38)