主要观点:曾以为 Clang 向 LLVM 优化管道传递的 IR 与优化级别无关,后通过调查发现并非如此,且通过示例展示了不同优化级别下 IR 的差异。
关键信息:
- 调查了IR 发射代码路径,忽略了与特定语言和 ABI 相关的决策。
- 不同优化级别下的决策,如优化禁用时:添加
block.addr
栈槽等帮助调试的操作;优化启用时:各种与内置函数、虚拟表、常量存储等相关的操作。 - 示例Compiler Explorer 例子展示了-O0 和-O1 下 LLVM IR 的差异,主要差异为生命周期标记和基于类型的别名分析(TBAA)元数据,其中生命周期标记会重塑控制流。
重要细节: - 调查的 Clang 源代码提交为
7c4c72b52038810a8997938a2b3485363cd6be3a
(2024-08)。 - 示例中通过添加
-Xclang -disable-llvm-passes
让 Clang 生成未经过优化管道的 LLVM IR。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。