直接使用LLVM实现-O3优化级别容易吗?

5

LLVM能够轻松实现高度优化吗?

举个具体的例子,假设我有一种简单的语言,想要为其编写编译器。

  • 简单函数
  • 简单结构体
  • 表格
  • 指针(带算术运算)
  • 控制结构
  • 等等。

我可以很容易地创建一个编译到C后端,并依赖clang -O3进行优化。使用LLVM API是否也同样容易呢?

2个回答

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. 您可能会访问更广泛的功能,或者至少更容易获得它们(即无需合并#define,模糊的pragma,指令或命令行选项)。我说的是像向量,保证的(好吧,比在C中更多-据我所知,一些代码生成器忽略它们)尾调用,纯/只读函数,更多对内存布局和类型转换的控制(例如零扩展与符号扩展)。当然,您可能不需要其中大多数。

有没有办法获取在O3上确切启用的所有优化列表? - Łukasz Lew
@ŁukaszLew:最可靠的来源应该是查看Clang的源代码。 - user395760

0
LLVM内置了优化传递,使您可以使用API实现类似O3级别的优化。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接