使用LLVM直接实现-O3级优化是否容易?

Łuk*_*Lew 5 optimization llvm

使用LLVM实现高水平的优化是否容易?

举一个具体的例子,让我们假设我有一个简单的语言,我想编写一个编译器.

  • 简单的功能
  • 简单的结构
  • 指针(带算术)
  • 控制结构
  • 等等

我可以很容易地创建compilation-to-C后端并依赖clang -O3.为此目的使用LLVM API是否容易?

小智 6

除了一些高级别(例如,知道高级语言特性或未在LLVM IR中编码的细节)优化之外,Clang的后端仅仅生成简单的IR并运行一些LLVM优化传递.它.opt当使用构建所有LLVM工具的C++库时,所有这些(或至少大多数)都应该通过命令以及API调用可用.有关简单示例,请参阅教程.我看到了几个优点:

  1. LLVM IR远比C简单,并且已经有一个方便的API用于以编程方式生成它.要生成C,您要么拥有大量难看且不可靠的字符串,要么必须自己为C语言构建AST.或两者.
  2. 您可以自己选择一组优化(Clang的传递集很可能不适合语言支持的代码和编译器生成的IR表示).这也意味着您可以在开发期间运行通过检查IR良好性能(更快地发现编译器错误).您可以复制Clang的传球顺序,但如果您愿意,也可以进行实验.
  3. 它将允许更好的编译时间.Clang对于C编译器来说很快,但是你会增加不必要的开销:你生成C代码,然后Clang解析它,将它转换为IR,然后继续做你能做的事情.
  4. 您可以访问更广泛的功能,或者至少您可以更轻松地使用它们(即无需使用#defines,模糊的pragma,instrincts或命令行选项)来提供它们.我正在谈论像向量,保证(好吧,比在C中更多 - AFAIK,一些代码生成器忽略它们)尾调用,纯/只读函数,对内存布局和类型转换的更多控制(例如零扩展与符号扩展).当然,你可能不需要大部分.