#ifndef RISCV64_PASSES_H #define RISCV64_PASSES_H #include "RISCv64LLIR.h" namespace sysy { /** * @class BackendPass * @brief 所有优化Pass的抽象基类 (可选,但推荐) * * 定义一个通用的接口,所有优化都应该实现它。 */ class BackendPass { public: virtual ~BackendPass() = default; virtual void runOnMachineFunction(MachineFunction* mfunc) = 0; }; // --- 寄存器分配前优化 --- /** * @class PreRA_Scheduler * @brief 寄存器分配前的指令调度器 * * 在虚拟寄存器上进行操作,此时调度自由度最大, * 主要目标是隐藏指令延迟,提高流水线效率。 */ class PreRA_Scheduler : public BackendPass { public: void runOnMachineFunction(MachineFunction* mfunc) override; }; /** * @class CalleeSavedHandler * @brief 处理被调用者保存寄存器(Callee-Saved Registers)的Pass。 * * 这个Pass在寄存器分配之后运行。它的主要职责是: * 1. 扫描整个函数,找出所有被使用的 `s` 系列寄存器。 * 2. 在函数序言中插入 `sd` 指令来保存这些寄存器。 * 3. 在函数结尾(ret指令前)插入 `ld` 指令来恢复这些寄存器。 * 4. 正确计算因保存这些寄存器而需要的额外栈空间,并更新StackFrameInfo。 */ class CalleeSavedHandler : public BackendPass { public: void runOnMachineFunction(MachineFunction* mfunc) override; }; // --- 寄存器分配后优化 --- /** * @class PeepholeOptimizer * @brief 窥孔优化器 * * 在已分配物理寄存器的指令流上,通过一个小的滑动窗口来查找 * 并替换掉一些冗余或低效的指令模式。 */ class PeepholeOptimizer : public BackendPass { public: void runOnMachineFunction(MachineFunction* mfunc) override; }; /** * @class PostRA_Scheduler * @brief 寄存器分配后的局部指令调度器 * * 主要目标是优化寄存器分配器插入的spill/fill代码(lw/sw), * 尝试将加载指令提前,以隐藏其访存延迟。 */ class PostRA_Scheduler : public BackendPass { public: void runOnMachineFunction(MachineFunction* mfunc) override; }; } // namespace sysy #endif // RISCV64_PASSES_H