全局指令选择

警告

本文档尚在编写中。它反映了实现的当前状态,以及开放的设计和实现问题。

简介

GlobalISel 是一个框架,它提供了一组可重用的 Pass 和实用程序,用于指令选择——将 LLVM IR 转换为特定于目标的机器 IR (MIR)。

GlobalISel 旨在替代 SelectionDAG 和 FastISel,以解决三个主要问题

  • 性能 — SelectionDAG 引入了一个专用的中间表示,这会带来编译时间成本。

    GlobalISel 直接操作代码生成器其余部分使用的后选择表示 MIR。它确实需要扩展该表示以支持任意输入 IR:通用机器 IR

  • 粒度 — SelectionDAG 和 FastISel 对单个基本块进行操作,从而失去了一些全局优化机会。

    GlobalISel 对整个函数进行操作。

  • 模块化 — SelectionDAG 和 FastISel 差别很大,共享的代码很少。

    GlobalISel 的构建方式能够实现代码重用。例如,优化选择器和快速选择器都共享核心管道,并且目标可以配置该管道以更好地满足其需求。

设计和实现参考

有关 GlobalISel 的设计和实现的更多信息,请参见以下部分。

有关特定 Pass 的更多信息,请参见以下部分

进度和未来工作

初始目标是在 AArch64 上替换 FastISel。下一步将是将 SelectionDAG 替换为优化的 ISel。

注意:在迭代 GlobalISel 时,我们努力避免影响 SelectionDAG、FastISel 或其他 MIR Pass 的性能。例如,通用虚拟寄存器的类型存储在 MachineRegisterInfo 中的单独表中,该表在InstructionSelect之后被销毁。

FastISel 替换

对于初始的 FastISel 替换,我们打算在选择失败时回退到 SelectionDAG。

目前,快速管道的编译时间在 FastISel 的 1.5 倍以内。我们乐观地认为可以达到 1.1/1.2 倍以内,但考虑到多 Pass 方法,击败 FastISel 将具有挑战性。尽管如此,支持所有 IR(通过完整的 Legalizer)并在最坏情况下避免回退到 SelectionDAG 应该能够实现比 SelectionDAG+FastISel 更好的平均性能。

注意:我们考虑过永远不回退到 SelectionDAG,而是尽早确定给定函数是否受 GlobalISel 支持。该决定将基于Legalizer 查询。我们放弃了这两个原因:a) 在 IR 输入上,我们需要基本上模拟IRTranslator;b) 为了对不可预见的故障具有鲁棒性并能够进行迭代改进。