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 功能
    依赖 Linux diff 工具生成差异(若无 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 开发