# 面向目标机器的代码优化

1. 面向目标机器的代码优化，优化生成的机器代码与机器无关的优化不同，这一层级的信息是 IR 层无法获取的，难以跨机器架构复用，难以跨语言复用

2. 面向目标机器的代码优化种类
   - 减少操作数量：算术操作、内存访问
   - 用代价小的操作替换代价高的操作
   - 降低缓存缺失：覆盖数据和指令
   - 并行计算：线程

3. 指令调度
   - 由于处理器流水线并行机制，指令的执行顺序对性能有较大影响
   - 重排机器代码指令，旨在最小化执行特定指令序列所需的时钟周期数
   - 任意编译器均支持指令调度
   - 一些指令有依赖关系，任何转换必须保留依赖关系以维护被调度代码的逻辑

4. 三种数据依赖关系
   - 写后读
   - 读后写
   - 写后写

5. 指令数据依赖图
   - 每个节点表示单个机器指令
   - 每条边表示两条指令间存在数据依赖
   - 依赖图是一个 DAG
   - 合法的指令调度要求一条指令不能先于祖先节点执行，需要对依赖图进行拓扑排序
   - 同一个数据依赖图可能有许多有效的拓扑排序，可以考虑加权调整 (边权为指令等待时间)

6. 现代优化编译器可以进行更积极的调度，比如循环展开
   - 一次展开多个循环迭代
   - 可以在循环迭代中找到流水线级并行性