Skip to content

Lec 6 编译器能做什么,不能做什么

在Lec 5 我们介绍了从C语言如何经过LLVM IR生成汇编语言的,这节我们将探讨LLVM IR 和汇编的

image-20240928133326478

总览

  • 编译器优化

    • 优化标量
    • 优化结构体
    • 优化函数调用
    • 优化循环
  • 故障诊断

编译器优化

我们为什么要研究编译器优化? 或者说有什么好处?

  • 编译器对软件性能有很大影响。
  • 编译器可以为你节省性能工程的工作量。
  • 编译器有助于确保简单、可读且可维护的代码运行快速。
  • 你可以理解源代码与中间表示(IR)或汇编代码之间的差异。
  • 编译器可能会出错。
  • 理解编译器可以帮助你更有效地使用它们。

进行优化的编译器会对代码执行一系列转换过程

  • 每个转换过程都会分析并编辑代码,以尝试优化代码的性能。

  • 一个转换过程可能会运行多次。

  • 转换过程按照预定的顺序运行,这个顺序在大多数情况下都能很好地工

编译器报告

Clang/LLVM 可以为许多转换过程生成报告,不仅限于向量化:

  • -Rpass=<string>:生成匹配 <string> 的优化成功的报告。
  • -Rpass-missed=<string>:生成匹配 <string> 的优化未成功的报告。
  • -Rpass-analysis=<string>:生成匹配 <string> 的优化执行的分析报告。

<string> 参数是一个正则表达式。要查看完整的报告,可以使用 ".*" 作为参数。

示例

image-20240928134458312

好消息:编译器可以告诉你很多关于它正在做什么的信息。

  • LLVM 中的许多转换过程可以报告它们成功转换代码的地方。
  • 许多转换过程还可以报告它们分析得出的结论。

坏消息:这些报告可能难以理解。

  • 报告可能很长,并且使用 LLVM 的术语。
  • 并非所有转换过程都会生成报告。
  • 报告并不总能讲清楚全部情况。

我们需要上下文来理解这些报告。

编译器优化分类

循环