GCEmptyBasicBlocks

从字面意思上看很简单,就是删除空的 MachineBasicBlock,代码也就 99 行。
但是我们可以深究下 LLVM 为什么会产生空的 MBB。

  1. 可能是如下的情况,和中端类似:
bb1:
  br bb2
  1. LLVM 某些控制流构造 pass 会临时生成空块作为跳转目标或占位符,且后续优化没有及时回收它们。
  2. 异常处理/调试信息相关块,本身没有真正执行语义。
  3. 后端的 ISel、RA、Spill 会插入一些辅助基本块,有时后续优化会合并他们或者消除,但是并不清理块。

其代码也是之前说的,明确只保留真的有“可执行”语义的指令的基本块,其他的就认为是“可安全清除”的空壳。

// Skip blocks with real code.
bool HasAnyRealCode = llvm::any_of(*MBB, [](const MachineInstr &MI) {
  return !MI.isPosition() && !MI.isImplicitDef() && !MI.isKill() &&
         !MI.isDebugInstr();
});