LLVM IR验证报错“指令未支配所有使用”问题排查求助
排查LLVM IR "Instruction does not dominate all uses!" 错误的关键点
- 跨函数依赖的支配性漏洞:单个函数验证正常但模块级出错,大概率是
calc.1引用了其他函数中定义在条件分支后的变量。比如某函数里的指令仅在if块内生成值,但calc.1直接使用这个值,而调用calc.1的路径可能没经过该if块。lli运行时刚好走了有定义的路径所以没崩,但验证器会严格检查所有可能路径的支配性。 - SSA规则的跨函数违反:LLVM的SSA要求所有值的定义必须覆盖其所有使用场景。如果你的IR手动构造了跨函数的局部值引用——比如
calc.1用了另一个函数里仅在特定基本块才会生成的值,就会触发这个错误。 - 函数克隆后的引用混乱:
calc.1这类带后缀的函数名通常是LLVM自动克隆生成的,克隆过程中如果没把原函数内部的引用全部同步到新函数,就会导致calc.1错误引用原函数中未支配的定义,单独看每个函数没问题,合在一起就触发验证错误。 - PassManager的验证逻辑差异:虽然用的是
legacy::FunctionPassManager,但createVerifierPass会做模块级的跨函数检查,不会只局限于单个函数的内部逻辑,所以单个函数验证过不了模块级的关。
具体排查步骤
- 用
opt -verify -debug运行你的IR模块,拿到具体触发错误的指令和对应的被引用值,定位该值的定义位置。 - 检查
calc.1的所有外部引用,确认每个值的定义路径是否覆盖了所有调用calc.1的入口。 - 核对函数克隆/生成逻辑,确保
calc.1的所有内部引用都指向自身函数内的基本块,没有残留对原函数的引用。 - 逐步删减模块中的函数,找到和
calc.1组合后触发错误的函数,缩小问题范围。
内容的提问来源于stack exchange,提问作者user14749247
相关产品推荐
相关产品推荐

