RISC-V 中的 LLVM 指令调度

LLVM Instruction Scheduling in RISC-V

我正在研究用于 RISC-V 后端的 LLVM 中的指令调度。我知道有两种调度方式(ScheduleDAGRRList 和 MachineScheduler)。从调试日志我可以 RISC-V 使用 ScheduleDAGRRList 方法。

MachineScheduler 比 ScheduleDAGRRList 好吗?如果是这样,我如何为 RISC-V 启用 MachineScheduler ?

我尝试了 llc -enable-misched file.ll,但没有成功。

RISC-V 后端在 LLVM 版本 10.0 中添加了对机器调度程序 (MISched) 的支持。

https://releases.llvm.org/10.0.0/docs/ReleaseNotes.html

RISCVSchedRocket64.td 中的 TableGen SchedMachineModel 描述将其描述为有序处理器。

// Rocket machine model for scheduling and other instruction cost heuristics.
def Rocket64Model : SchedMachineModel {
  let MicroOpBufferSize = 0; // Explicitly set to zero since Rocket is in-order.
  let IssueWidth = 1;        // 1 micro-ops are dispatched per cycle.
  let LoadLatency = 3;
  let MispredictPenalty = 3;
}

您可以通过以下方式为 rocket-rv64 启用机器调度:

-O3 -mllvm -enable-misched -mllvm -enable-post-misched -mcpu=rocket-rv64