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

时间:2011-10-09 16:56:29

标签: optimization llvm

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

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

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

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

2 个答案:

答案 0 :(得分:6)

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

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

答案 1 :(得分:0)

LLVM具有内置的优化过程,因此您可以使用API​​实现类似O3的优化。