#pragma once #include "IR/IR_basic.h" #include "cfg.h" class ConfGraphNode { public: const static size_t kInf = (std::numeric_limits::max()) >> 2; std::vector var_ids; size_t color; size_t degree; bool is_binded_with_physical_reg; std::list neighbors; std::list move_neighbors; ConfGraphNode() = default; }; class ConfGraph { public: // available after construction std::unordered_map id_to_node; std::vector> nodes; std::unordered_map::iterator>> adj_table; // available during coloring std::vector stack; std::vector actual_spills; std::unordered_set low_degree_and_not_move_related; std::unordered_set low_degree_and_move_related; std::unordered_set high_degree_nodes; std::unordered_set pending_moves; std::unordered_set potential_moves; }; ConfGraph BuildConfGraph(CFGType &cfg); bool ConductColoring(std::shared_ptr src, CFGType &cfg, ConfGraph &confgraph);