MachineCombiner
一个基于机器级 trace 度量,将多条指令合并为更高效指令序列的 LLVM 机器指令合并优化 Pass。对应的中端 Pass 就是 InstCombiner。但是该 Pass 的逻辑比较简单,只有六百多行。
基本概念如下:
目标:在不延长关键路径、不增加资源压力(或优化代码体积)的前提下,将可组合的指令序列(如 MUL+ADD)替换为单条复合指令(如 MADD),以提高生成代码的执行效率或减小代码体积。
依赖分析:利用 MachineTraceMetrics 提供的“深度(Depth)”、“延迟(Latency)”和“Slack”信息,评估新旧指令序列对关键路径的影响。
资源分析:基于调度模型(TSchedModel)和硬件资源模型,比较合并前后资源使用长度(Resource Length)。
启发式:优先尝试减少关键路径深度,再尝试减少资源长度;在代码大小优化模式下,只要新序列短即替换;在循环中若检测到吞吐模式也可替换。
最简单的例子就是一个 FMA 指令:
; 原始序列
MUL r1, r2, r3 ; 乘法
ADD r4, ...