#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 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