Clang 中依赖优化的 IR 决策

主要观点:曾以为 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。
阅读 13
0 条评论