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
感兴趣
我是初学者,刚刚学习了编译器的基础知识。
在研究 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