LLVM 如何将"irregular"大小的虚拟寄存器分配给物理寄存器?



我刚开始学习LLVM,有一个关于寄存器分配过程的问题。

到目前为止我所了解的:

  • LLVM中定义的寄存器被认为是";虚拟的";寄存器,并且可以超过也可以不超过机器具有的物理寄存器的数量
  • 当为特定的机器体系结构编译LLVM程序集时,寄存器分配过程会确定哪些虚拟寄存器可以映射到物理寄存器,哪些可能需要在堆栈上加载和卸载(理想情况下,此分配过程通过最小化内存访问来优化性能(

为了这个问题的目的,让我们假设一个";常规的"-大小虚拟寄存器是与物理寄存器大小相同的寄存器;不规则的"-大小虚拟寄存器是比物理寄存器更小或更大的寄存器。LLVM如何分配这些";不规则的"-大小的虚拟寄存器?

更具体地说:

  • 如果我有多个大小不规则的虚拟寄存器,它们比物理寄存器小,LLVM可以将它们分配到同一个物理寄存器吗?例如,如果一台机器有64位寄存器,但我有3个i8虚拟寄存器,它们能在同一个物理寄存器中使用吗?这篇博客文章中的图片似乎表明他们可以,但我不确定我是否正确解读了这篇文章。如果虚拟寄存器共享一个物理寄存器,是否存在任何性能或功能限制
  • 如果我有一个大小不规则的虚拟寄存器,它比物理寄存器大,LLVM可以将它们拆分到多个物理寄存器中吗?还是会被迫使用堆栈?例如,如果一台机器有64位寄存器,但我有一个i72虚拟寄存器,那么它可以拆分为两个物理寄存器吗?这是否有任何性能或能力限制
  • 假设以上两个问题的答案是";是";,较小的虚拟寄存器是否可以与";溢出";更大的虚拟寄存器的一部分

后端中有一个专用进程,称为"合法化";。基本上,对于给定目标来说不合法的类型/操作会转化为目标本身支持的类型/运算。

有多种合法化方法:

  • 根据其他方面实现操作(有时甚至执行库函数调用(
  • 将类型提升为更大的类型
  • 将类型拆分为更小的部分

或者目标可以选择以某种自定义方式降低特定操作。

注意,";寄存器分配";不是";将物理寄存器分配给LLVM IR值";(最好考虑不在这里注册的值,因为值只分配了一次,不能在LLVM IR中重新定义它(。相反,寄存器分配过程对已经合法化的值进行操作。因此,它在输入中已经有了一组大小合适的值及其有效范围。

最新更新