后端Pass简介——GCEmptyBasicBlocks
GCEmptyBasicBlocks
从字面意思上看很简单,就是删除空的 MachineBasicBlock,代码也就 99 行。
但是我们可以深究下 LLVM 为什么会产生空的 MBB。
- 可能是如下的情况,和中端类似:
bb1:
br bb2
- LLVM 某些控制流构造 pass 会临时生成空块作为跳转目标或占位符,且后续优化没有及时回收它们。
- 异常处理/调试信息相关块,本身没有真正执行语义。
- 后端的 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();
});
评论