Lec 6 编译器能做什么,不能做什么
在Lec 5 我们介绍了从C语言如何经过LLVM IR生成汇编语言的,这节我们将探讨LLVM IR 和汇编的

总览
编译器优化
- 优化标量
- 优化结构体
- 优化函数调用
- 优化循环
故障诊断
编译器优化
我们为什么要研究编译器优化? 或者说有什么好处?
- 编译器对软件性能有很大影响。
- 编译器可以为你节省性能工程的工作量。
- 编译器有助于确保简单、可读且可维护的代码运行快速。
- 你可以理解源代码与中间表示(IR)或汇编代码之间的差异。
- 编译器可能会出错。
- 理解编译器可以帮助你更有效地使用它们。
进行优化的编译器会对代码执行一系列转换过程
每个转换过程都会分析并编辑代码,以尝试优化代码的性能。
一个转换过程可能会运行多次。
转换过程按照预定的顺序运行,这个顺序在大多数情况下都能很好地工
编译器报告
Clang/LLVM 可以为许多转换过程生成报告,不仅限于向量化:
-Rpass=<string>:生成匹配<string>的优化成功的报告。-Rpass-missed=<string>:生成匹配<string>的优化未成功的报告。-Rpass-analysis=<string>:生成匹配<string>的优化执行的分析报告。
<string> 参数是一个正则表达式。要查看完整的报告,可以使用 ".*" 作为参数。
示例

好消息:编译器可以告诉你很多关于它正在做什么的信息。
- LLVM 中的许多转换过程可以报告它们成功转换代码的地方。
- 许多转换过程还可以报告它们分析得出的结论。
坏消息:这些报告可能难以理解。
- 报告可能很长,并且使用 LLVM 的术语。
- 并非所有转换过程都会生成报告。
- 报告并不总能讲清楚全部情况。
我们需要上下文来理解这些报告。