我假设在汇编器发出代码之前,编译器后端将有一个步骤将基于图的机器码IR转换为序列化的机器码。
但是这一步叫什么呢?我认为这一步可能是微不足道的,但为了提高性能,在这一步中,似乎有必要重新排列MC基本块,让一些分支失效,而不是跳来跳去。但我在这方面发现的信息很少。
我找到了术语“跟踪调度”和“分支折叠”。它们似乎是有某种关系的。
发布于 2014-05-13 10:45:28
一般的术语是指令调度。LLVM的back-end documentation将线性化步骤称为“调度和形成”。
调度阶段从选择阶段取得目标指令的DAG并分配顺序。调度器可以根据机器的各种约束来选择顺序(即最小寄存器压力的顺序或尝试覆盖指令延迟)。一旦建立了订单,DAG就会转换为MachineInstrs列表,并销毁SelectionDAG。
请注意,此阶段在逻辑上独立于指令选择阶段,但在代码中与其紧密相关,因为它在SelectionDAG上操作。
正如文档所说,选择的顺序通常是为了性能的某个方面。除了寄存器压力和指令等待时间之外,不同类型的指令(例如,整数和浮点数学)可被交织以保持所有处理器的功能单元被利用,或者指令/块可被重新排序以在优化代码大小时移除分支或允许使用更紧凑的“短跳”指令。不幸的是,对于编译器编写者(和用户)来说,指令选择、指令调度和寄存器分配以复杂的方式交互,因此生成“最佳”代码即使对于小段代码也是不可行的。
https://stackoverflow.com/questions/23554949
复制相似问题