75 lines
2.1 KiB
C++
75 lines
2.1 KiB
C++
#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
|