LLVM IR 是图表吗?

HJL*_*HJL 2 llvm compiler-optimization llvm-ir

我正在开始编译器优化领域的新研究。首先,我正在研究几篇相关的不同论文,并遇到了一些不同的优化技术。

我目前正在研究的一件主要事情是编译器的技术,它将输入源代码转换为图形(例如控制流、数据流、链表等),然后对图形执行优化并生成机器代码。代码到图形到代码。例如,JavaScript引擎中的JIT编译器,即V8、ChakraCore等。

然后,我遇到了 LLVM IR。由于之前的搜索,我对代码优化的印象是在上面解释的图表上进行的。然而,我不认为 LLVM 是这种情况,但我也不确定。我发现有一些工具可以从 LLVM IR 生成控制流图,但这并不意味着它正在优化该图。

所以,我的问题是“LLVM IR 是图表吗?” 如果不是,它如何优化代码?直接代码到代码?

yug*_*ugr 6

LLVM IR(及其后端形式,机器 IR)是传统的三地址代码 IR,因此从技术上讲,它不是某种意义上的图 IR,例如节点海 IR。但它包含几个图结构:基本块图(控制流图)和数据依赖图(SSA def-use 链),用于简化优化。此外,在后端的指令选择阶段,原始 LLVM IR 会暂时转换为真实的图 IR - SelectionDAG

  • 很好的答案。只需要补充一件事:如何优化代码是每次传递的问题。LLVM 一般不会回答这个问题,而是将其留给每一次传递。大多数pass使用输入代码和一个或多个支持数据结构的组合,它们可以自己构建,[从“分析pass”获取](https://llvm.org/doxygen/classllvm_1_1Pass.html#a4863e5e463fb79955269fbf7fbf52b80)或如果传递特定于特定前端,则来自前端。 (4认同)