051、从SCF到CFG(控制流图)的转换

发布时间:2026/7/23 2:38:18
051、从SCF到CFG(控制流图)的转换 051、从SCF到CFG(控制流图)的转换一个让我熬夜到凌晨三点的bug去年做AI推理引擎的编译后端时,遇到一个诡异的crash。模型推理到一半,内存访问越界,core dump里堆栈信息支离破碎。我盯着反汇编看了两个小时,发现循环展开后的控制流完全不对——本该顺序执行的循环体,跳转到了完全无关的地址。问题出在哪?MLIR的SCF(Structured Control Flow)在降级到LLVM IR之前,必须经过SCF到CFG的转换。这个转换看似简单,但稍有不慎就会把结构化控制流打散成一团乱麻。那天晚上我反复检查了三次LowerSCFToCFG的pass,最后发现是某个if-else的region合并时,block的终结符(terminator)没有正确更新。从那以后,我每次写SCF到CFG的转换代码,都会在心里默念:终结符是灵魂,block是骨架,region是血肉。SCF是什么?CFG又是什么?SCF(Structured Control Flow)是MLIR里一套“有教养”的控制流操作。它保留了高级语言的结构化特征:scf.for、scf.if、scf.while。这些操作的特点是——你一眼就能看出循环的边界、条件分支的走向。编译器可以安全地做循环展开、循环融合、循环向量化,因为结构信息完整。CFG(Control Flow Graph)则是“野蛮生长”的