RegBankSelect¶
此 pass 约束通用指令的通用虚拟寄存器操作数到某些寄存器组。
它迭代地将指令映射到一组每个操作数银行分配。可能的映射由目标提供的 RegisterBankInfo 确定。然后应用映射,如果必要,可能会引入 COPY
指令。
它自顶向下遍历 MachineFunction
,以便在分析指令时所有操作数都已被映射。
当有利时,此 pass 还可以重新映射特定于目标的指令。将来,这可以取代 ExeDepsFix pass,因为我们可以直接为可在多个银行上使用的指令选择最佳变体。
API: RegisterBankInfo¶
RegisterBankInfo
类描述了寄存器组的多个方面。
银行:
addRegBankCoverage
— 哪个寄存器组覆盖每个寄存器类。跨银行复制:
copyCost
— 从一个银行复制到另一个银行的成本。默认映射:
getInstrMapping
— 给定指令的默认银行分配。替代映射:
getInstrAlternativeMapping
— 给定指令的其他可能的银行分配。
TODO
: 所有这些信息最终应该是静态的,并由 TableGen 生成,主要使用现有信息并辅以银行描述。
TODO
: getInstrMapping
目前与 getInstrAlternativeMapping
分开,因为后者更昂贵:当我们转向静态映射信息时,这两种方法都应该是免费的,我们应该合并它们。
RegBankSelect 模式¶
RegBankSelect
目前有两种模式
快速 — 对于每条指令,选择目标提供的“默认”银行分配。这是 -O0 时的默认设置。
贪婪 — 对于每条指令,从几个目标提供的银行分配备选项中选择最便宜的。
我们打算最终引入一种额外的优化模式
全局 — 在多条指令中,选择最便宜的银行分配组合。
NOTE
: 在 AArch64 上,我们正在考虑即使在 -O0(或可能在后端 -O1)也使用贪婪模式:因为低级类型不区分浮点标量和整数标量,加载和存储的默认分配是整数银行,从而在大多数浮点运算上引入跨银行复制。