用途:把触发 noir-ssa 管线 bug 的 SSA 文件最小化为尽可能小的复现用例,通常在 bisect-ssa-pass 已定位出问题 pass 后使用。
准备:用调试构建编译 CLI(cargo build -p noir_ssa_cli),始终使用 target/debug/noir-ssa,因为不少 SSA 不变量检查由 #[cfg(debug_assertions)] 保护、在 release 构建中被编译掉。需从二分阶段收集输入文件、触发 bug 的 pass(破坏 pass 与检测 pass)和 stderr 错误模式。
主要能力与用法:
- 精简 pass 管线:逐个移除检测 pass 之外的 pass,用 noir-ssa transform --source-path input.ssa --ssa-pass ... -o /dev/null 测试;若某 pass 输出有效,可将其结果烘焙进输入以同时缩小输入与管线。
- 复现脚本:使用 $SKILL_DIR/scripts/reproduce_crash.sh,多 pass 模式设置 SSA_PASSES 与 DETECTION_PASS,单 pass 模式只设 DETECTION_PASS;脚本会校验输入可解析、检测 pass 单独成功(多 pass 模式)以及完整管线崩溃。检测 pass 可用 Simplifying 或 Inlining Brillig Calls 等轻量选项。
- 自动化缩减:在同一目录运行 reduce_instructions.py(删除结果未被引用的指令)和 reduce_branches.py(把 jmpif 折叠为 jmp),两者都需 --passes 与 --error-pattern;随后可依次尝试 Simplifying、Mem2Reg、Dead Instruction Elimination 清理并反复迭代。
- 人工简化:先画 CFG 图,再逐个尝试折叠 jmp 链、去除嵌套层级、令 jmpif 两支收敛、删除未用全局/函数、简化常量、缩小循环边界、移除函数参数与返回值、去除函数属性,每次改动后都运行 reproduce_crash.sh 验证。
完成标准与限制:自动化 reducer 与清理 pass 均无进展、人工简化已尝试、最小 SSA 已小到可读时结束。注意 --ssa-pass 使用子串匹配且只匹配第一个同名 pass;可用 noir-ssa check 规范化输出(打印到 stdout)。资料未提供该技能的收费、平台或性能信息。