Pass简介——AnalysisPass
print-changed
1. 核心功能
(1) 基本行为
-
默认模式 (
-print-changed
无参数):- 打印 初始 IR(优化前)。
- 仅打印 被修改后的 IR(如果某个 pass 未改变 IR,则仅报告
"PassName did not change the IR"
)。 - 比
-print-after-all
更精简,避免输出未变化的 IR。
-
示例输出:
*** IR Dump At Start *** define void @foo() { ret void } *** IR Dump After InlinePass (modified) *** define void @foo() { call void @bar() ret void } *** IR Dump After DeadCodeElimination (no changes) ***
(2) 子选项:输出格式控制
通过附加参数指定不同的输出格式:
选项值 | 用途 |
---|---|
quiet |
仅打印 真正发生变化的 IR(不报告未修改的 pass) |
diff |
以 类 git-diff 格式 展示变更(- 表示删除,+ 表示新增) |
diff-quiet |
diff 的安静模式(仅显示变化的 diff) |
cdiff |
彩色 diff(需终端支持 ANSI 颜色) |
cdiff-quiet |
彩色 diff 的安静模式 |
dot-cfg |
生成 图形化变更网站(需 Graphviz 支持) |
dot-cfg-quiet |
图形化变更的安静模式 |
示例 (diff 模式): |
*** IR Dump After InlinePass (modified) ***
- define void @foo() {
- ret void
- }
+ define void @foo() {
+ call void @bar()
+ ret void
+ }
(3) 过滤功能
结合其他选项进一步过滤输出:
-filter-passes=Pass1,Pass2
仅关注特定 pass 的变更(其他 pass 标记为filtered out
)。-filter-print-funcs=foo,bar
仅打印特定函数的变更。-print-module-scope
以模块为单位输出变更(而非单个函数)。
示例:
opt -passes=inline,dce -print-changed=diff -filter-passes=inline -filter-print-funcs=foo
→ 只显示 inline
pass 对函数 foo
的 diff 变更。
2. 技术实现依赖
- Diff 功能:
依赖 Linuxdiff
工具生成差异(若无diff
,会回退到简单文本对比)。 - 彩色输出:
需终端支持 ANSI 颜色转义码。 - 图形化 (
dot-cfg
):
需 Graphviz 生成控制流图(CFG)并启动本地 Web 服务器展示。
3. 典型使用场景
(1) 快速定位优化效果
opt -O2 -print-changed=diff -filter-print-funcs=main
→ 直接查看 main
函数在 -O2
优化后的具体变更。
(2) 调试单个 Pass
opt -passes=inline -print-changed=cdiff
→ 高亮显示内联优化引入的变更。
(3) 生成可视化报告
opt -O3 -print-changed=dot-cfg
→ 生成 HTML 报告,用图形展示 IR 变化(适合复杂优化分析)。
4. 与其他选项的对比
选项 | 输出量 | 关注点 | 适用场景 |
---|---|---|---|
-print-after-all |
极大(所有 pass 的完整 IR) | 完整日志 | 深度调试 |
-print-before/after |
中等(指定 pass 的 IR) | 特定 pass | 局部调试 |
-print-changed |
较小(仅变化部分) | 变更追踪 | 高效分析 |
-debug-only=PassName |
不定(Pass 内部日志) | 内部状态 | Pass 开发 |
评论