全局指令选择¶
警告
本文档尚在编写中。它反映了实现的当前状态,以及开放的设计和实现问题。
简介¶
GlobalISel 是一个框架,它提供了一组可重用的 Pass 和实用程序,用于指令选择——将 LLVM IR 转换为特定于目标的机器 IR (MIR)。
GlobalISel 旨在替代 SelectionDAG 和 FastISel,以解决三个主要问题
设计和实现参考¶
有关 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) 为了对不可预见的故障具有鲁棒性并能够进行迭代改进。