全局指令选择¶
警告
本文档是一个正在进行中的工作。它反映了当前实现的state,以及开放的设计和实现问题。
简介¶
GlobalISel 是一个框架,它为指令选择提供了一组可重用的passes和实用程序 — 从 LLVM IR 转换为目标特定的 Machine IR (MIR)。
GlobalISel 旨在替代 SelectionDAG 和 FastISel,以解决三个主要问题
性能 — SelectionDAG 引入了一个专用的中间表示,这带来了编译时成本。
GlobalISel 直接在代码生成器的其余部分使用的 post-isel 表示 MIR 上操作。它确实需要扩展该表示以支持任意传入的 IR:通用机器 IR。
粒度 — SelectionDAG 和 FastISel 在单个基本块上操作,失去了一些全局优化机会。
GlobalISel 在整个函数上操作。
模块化 — SelectionDAG 和 FastISel 截然不同,并且共享的代码非常少。
GlobalISel 的构建方式使其能够实现代码重用。例如,优化和快速选择器都共享 核心管道,并且目标可以配置该管道以更好地满足其需求。
设计和实现参考¶
有关 GlobalISel 的设计和实现的更多信息,请参见以下部分。
有关特定passes的更多信息,请参见以下部分
进展和未来工作¶
最初的目标是在 AArch64 上替换 FastISel。下一步将是替换 SelectionDAG 作为优化的 ISel。
NOTE
:在我们迭代 GlobalISel 时,我们努力避免影响 SelectionDAG、FastISel 或其他 MIR passes的性能。例如,通用虚拟寄存器的类型存储在 MachineRegisterInfo
中的一个单独的表中,该表在 InstructionSelect 之后被销毁。
FastISel 替换¶
对于最初的 FastISel 替换,我们打算在选择失败时回退到 SelectionDAG。
目前,快速管道的编译时在 FastISel 的 1.5 倍以内。我们乐观地认为我们可以达到 1.1/1.2 倍以内,但考虑到多pass方法,击败 FastISel 将具有挑战性。尽管如此,支持所有 IR(通过完整的 legalizer)并在最坏的情况下避免回退到 SelectionDAG 应该能够实现比 SelectionDAG+FastISel 更好的摊销性能。
NOTE
:我们考虑过永远不回退到 SelectionDAG,而是尽早决定给定的函数是否受 GlobalISel 支持。该决定将基于 Legalizer 查询。我们放弃了这一点有两个原因:a) 在 IR 输入上,我们基本上需要模拟 IRTranslator;b) 为了对不可预见的故障具有鲁棒性并实现迭代改进。