#pragma once #include "common.h" #include "llir_module.h" #include "machcode.h" // #define DEBUG_REGALLOC namespace CompSysY { class Pass { public: std::string pass_name; Pass(const std::string &name) : pass_name(name) {} virtual void run(const Module &module) = 0; }; class PassMem2Reg : public Pass { public: PassMem2Reg() : Pass("mem2reg") {} virtual void run(const Module &module) override; }; class PassBuildCFG : public Pass { public: PassBuildCFG() : Pass("build_cfg") {} virtual void run(const Module &module) override; }; class MCPass { public: std::string pass_name; MCPass(const std::string &name) : pass_name(name) {} virtual void run(const MCModule &module) = 0; }; class PassRegAlloc : public MCPass { public: PassRegAlloc() : MCPass("regalloc") {} virtual void run(const MCModule &module) override; const static int K = 32 - 5; // Not Allocate-able: x0, gp, tp; Reserve: sp, ra private: /*以下这些集合**各不相交** precolored:机器寄存器集合,每个寄存器都预先指派了一种颜色 initial:临时寄存器集合,其中的元素既没有预着色,也没有被处理 simplifyWorklist:低度数的传送无关的结点表。 freezeWorklist:低度数的传送有关的结点表。 spillWorklist:高度数的结点表。 spilledNodes:在本轮中要被溢出的结点集合,初始为空。 coalescedNodes:已合并的寄存器集合。当合并uV时,将y加人到这个集合中,w则被放回到某个工作表中(或反之)。 coloredNodes :已成功着色的结点集合。 selectstack:一个包含从图中删除的临时变量的栈 */ void reg_alloc(sptr(MFunction)); void build(sptr(MFunction)); void add_edge(const MOperand &u, const MOperand &v); void make_work_list(sptr(MFunction) func); bool move_related(const MOperand &n); std::set node_moves(const MOperand &n); std::set adjacent(const MOperand &n); void decrement_degree(const MOperand &m); void enable_moves(const MOperand &n); void simplify(); void coalesce(); void add_work_list(const MOperand &u); bool OK(const MOperand &t, const MOperand &r); bool conservative(const std::set &nodes); MOperand get_alias(MOperand n); void combine(const MOperand &u, const MOperand &v); void freeze(); void freeze_moves(const MOperand &u); void select_spill(); void assign_colors(sptr(MFunction) func); void rewrite_program(sptr(MFunction) func); std::map> adj_list; std::set> adj_set; std::map degree; std::map> move_list; std::map color; std::map alias; std::set initial; std::set simplify_worklist; std::set freeze_worklist; std::set spill_worklist; std::set spilled_nodes; std::set coalesced_nodes; std::set colored_nodes; std::vector select_stack; std::set coalesced_moves; std::set constrained_moves; std::set frozen_moves; std::set worklist_moves; std::set active_moves; void clear(); }; } // namespace CompSysY