MIR(Machine IR)是LLVM后端中贴近机器码的中间表示,以文本化MachineInstr序列呈现,兼具可读性与目标相关性;它跳过前端和IR优化,直接用于调试指令选择、寄存器分配等后端Pass,支持手写、导出和单Pass验证。

什么是MIR,为什么测试要用它
MIR(Machine IR)是LLVM后端中一个关键的中间表示,形态上是文本化的MachineInstr序列,比SelectionDAG更贴近最终机器码,但又保留了可读性和可编辑性。它不像汇编那样依赖具体目标的编码规则,也不像IR那样完全目标无关——这使得MIR成为调试指令选择、寄存器分配、指令调度等Pass最直接的切入点。
用MIR测试的核心优势在于:你可以手写或导出一段MIR,跳过前端(Clang)、IR优化、指令选择前的Legalization等环节,直接喂给后端流水线,观察某一个Pass(比如RegAlloc或PostRA-Scheduler)对MachineInstr的具体变换效果。
怎么生成MIR文件用于测试
最常用方式是用llc加-march和-stop-after生成中间MIR:
- 先有合法的
.ll(LLVM IR),例如test.ll - 运行:
llc -march=amdgpu -stop-after=instruction-selection test.ll -o test.mir→ 输出的是经过指令选择后的MIR - 若想看寄存器分配前的状态,改用:
-stop-after=regalloc;想看调度后,用-stop-after=postra-scheduler - 注意:
-stop-after指定的Pass名必须准确匹配后端注册的名称,常见值包括instruction-selection、regalloc、post-RA-scheduler、asm-printer
生成的test.mir里会包含define块、bb.基本块、%0:sgpr = COPY %1:vgpr这类MachineInstr行,以及显式的liveins、successors等元信息——这些正是你后续手动修改或断点调试的依据。
怎么在MIR上运行单个Pass并验证输出
有了MIR文件,就可以绕过IR输入,直接驱动后端Pass:
- 用
llc加载MIR并运行后续Pass:llc -march=amdgpu -run-pass=regalloc test.mir -o test-after-regalloc.mir - 若要只运行某个特定Pass(比如自定义的
MyCustomPass),需确保它已注册为MachineFunctionPass,并在命令中写全名:-run-pass=my-custom-pass - 想对比前后差异?用
diff看test.mir和test-after-regalloc.mir中MachineInstr的变化,重点关注%vreg→%vgpr映射、spill/reload指令插入、implicit-def新增等 - 调试时建议配合
-debug-only=regalloc或-print-machineinstrs,它们会把Pass内部决策(如选哪个物理寄存器、为何溢出)打到stderr
注意:-run-pass只接受MachineFunctionPass子类,不支持FunctionPass;且MIR文件必须语法合法(比如liveins格式错会导致llc直接abort,错误信息是error: expected 'liveins:')。
容易忽略的MIR调试陷阱
MIR看似简单,但几个细节不处理好,测试就失效:
-
target字段必须匹配:MIR文件顶部要有--- |开头的YAML头,其中target需与-march一致,例如target: amdgpu-mesa-mesa3d,否则llc会拒绝加载 - 寄存器类(
sgpr/vgpr)不能乱写:AMDGPU后端中%0:vgpr和%0:sgpr是不同类,类型错会导致RegAlloc崩溃,错误提示常为Cannot allocate to register class VGPR_32 - 不要手动删
liveins或successors:即使你只关心一条指令,MIR解析器仍依赖这些元信息做CFG验证;缺失会触发Broken function found, compilation aborted! - TableGen生成的指令模式没生效?检查
def是否被正确include进AMDGPUGenInstrInfo.inc,否则SelectCode找不到匹配项,llc会报Failed to select并abort
真正卡住的时候,往往不是Pass逻辑错了,而是MIR格式或目标配置没对齐——先确认llc -march=xxx -mcpu=yyy --version能正常跑通,再动MIR。

















