LLVM 是如何进行 Liveness Analysis 的?

How does LLVM perform Liveness Analysis?

我是初学者,刚刚学习了编译器的基础知识。

在研究 LLVM 时,我不确定到哪里查找活性分析部分。

按我的理解,转成LLVM IR的程序转成DAG,再转成MIR。

这个slides介绍了liveness tracking,我假设liveness分析发生在MIR。

所以我正在查看 LiveVariables.cpp、LiveIntervalAnalysis.cpp 等源代码,但我不确定代码在哪里定义 def、kill、imp-use 等内容。

谁能告诉我在哪里可以找到这些代码以及如何在此过程中转储信息?

谢谢,

杰克

LLVM 使用 SSA 形式的中间表示。 SSA 形式的 IR 意味着每个变量都只定义一次,并且每次使用都由其定义支配。支配是图论中的一个概念,本质上意味着控制流图中的每条使用路径都必须通过它的定义。网上有很多关于 SSA 以及如何从传统 IR 构建 SSA 的信息。

在实践中,这种选择使得基于数据流方程的传统活性分析变得不必要。 SSA 编译器不是计算每个基本块的实时集合,而是仅提供一个函数来回答问题 "is this variable live at this location?"

LLVM 用于寄存器分配的活性分析是在目标独立代码生成器中完成的,这意味着大部分代码都可以在 lib/CodeGen 目录中找到。特别是您可能对 MachineBasicBlock::computeRegisterLiveness 以及 lib/CodeGen/LiveVariables.cpp

感兴趣