From 089fa632aa4c0ae7bc55fa583497699f99e6ca89 Mon Sep 17 00:00:00 2001 From: chenlida <ChenLD3124@163.com> Date: Fri, 19 Aug 2022 16:29:37 +0800 Subject: [PATCH] regalloc spill --- src/backend/color.cpp | 16 ++++++++-------- src/backend/color.hpp | 23 +++++++++++++++++++++-- src/main.cpp | 12 +++++++----- 3 files changed, 36 insertions(+), 15 deletions(-) diff --git a/src/backend/color.cpp b/src/backend/color.cpp index 5396006..c36fcae 100644 --- a/src/backend/color.cpp +++ b/src/backend/color.cpp @@ -5,7 +5,7 @@ void COL_result::makeWorklist() { for (auto& node : ig->mynodes) { if (node.isreg()) continue; if (node.degree() >= REGNUM) { - SpillWorklist.insert(node.mykey); + SpillWorklist.insert(node.mykey,node.degree()); } else if (!node.mv_adj.empty()) { CombineWorklist.insert(node.mykey); } else { @@ -29,12 +29,12 @@ void COL_result::changeWorklist(int node) { if (SimplifyWorklist.count(node)) { if (ig->mynodes[node].degree() >= REGNUM) { SimplifyWorklist.erase(node); - SpillWorklist.insert(node); + SpillWorklist.insert(node,ig->mynodes[node].degree()); } } else if (CombineWorklist.count(node)) { if (ig->mynodes[node].degree() >= REGNUM) { CombineWorklist.erase(node); - SpillWorklist.insert(node); + SpillWorklist.insert(node,ig->mynodes[node].degree()); } else if (ig->mynodes[node].mv_adj.empty()) { CombineWorklist.erase(node); SimplifyWorklist.insert(node); @@ -42,7 +42,7 @@ void COL_result::changeWorklist(int node) { } else if (FreezeWorklist.count(node)) { if (ig->mynodes[node].degree() >= REGNUM) { FreezeWorklist.erase(node); - SpillWorklist.insert(node); + SpillWorklist.insert(node,ig->mynodes[node].degree()); } else if (ig->mynodes[node].mv_adj.empty()) { FreezeWorklist.erase(node); SimplifyWorklist.insert(node); @@ -117,10 +117,10 @@ void COL_result::freeze() { } void COL_result::selectSpill() { int tnode = -1; - for (auto node : SpillWorklist) { - if (stkuse->count(ig->mynodes[node].nodeTemp())) continue; - assert(!ig->mynodes[node].isreg()); - tnode = node; + for (auto denode : SpillWorklist.degree2node) { + if (stkuse->count(ig->mynodes[denode.second].nodeTemp())) continue; + assert(!ig->mynodes[denode.second].isreg()); + tnode = denode.second; break; } assert(tnode != -1); diff --git a/src/backend/color.hpp b/src/backend/color.hpp index 575a5c3..51d84cd 100644 --- a/src/backend/color.hpp +++ b/src/backend/color.hpp @@ -25,7 +25,7 @@ public: REGNUM = 13; Precolored = std::set<Temp_Temp>({0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 12, 14}); } - SpillWorklist = std::set<int>(); + SpillWorklist = SpillSet(); SimplifyWorklist = std::set<int>(); CombineWorklist = std::set<int>(); FreezeWorklist = std::set<int>(); @@ -40,7 +40,26 @@ public: private: int REGNUM; std::set<Temp_Temp> Precolored; - std::set<int> SpillWorklist; + struct SpillSet{ + std::map<int,int> node2degree; + std::set<std::pair<int,int>> degree2node; + void insert(int node,int degree){ + node2degree.insert({node,-degree}); + degree2node.insert({-degree,node}); + } + void erase(int node){ + int degree=node2degree.at(node); + degree2node.erase({degree,node}); + node2degree.erase(node); + } + int count(int node){ + return node2degree.count(node); + } + bool empty(){ + return node2degree.empty(); + } + }; + SpillSet SpillWorklist; std::set<int> SimplifyWorklist; std::set<int> CombineWorklist, FreezeWorklist; std::stack<int> SelectStack; diff --git a/src/main.cpp b/src/main.cpp index 37843b5..836bad1 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -182,7 +182,7 @@ int main(int argc, char** argv) { bool ismain = funcname == "main"; // do ssa in this place SSA::SSAIR* ssa = new SSA::SSAIR(blocks); - for (int i = 0; i < 5; i++) { + for (int i = 0; i < 6; i++) { ssa->opt.deadCodeElimilation(); ssa->opt.constantPropagation(); ssa->opt.combExp(); @@ -196,12 +196,14 @@ int main(int argc, char** argv) { ssa->opt.deadCodeElimilation(); ssa->mergeNode(); bool cc = ssa->loops.loopUnroll(); + if (cc) i -= 5; ssa->opt.constantPropagation(); ssa->opt.deadCodeElimilation(); - // ssa->opt.strengthReduction(); - ssa->opt.constantPropagation(); - ssa->opt.deadCodeElimilation(); - if (cc) i -= 5; + if (i == 0) { + ssa->opt.strengthReduction(); + ssa->opt.constantPropagation(); + ssa->opt.deadCodeElimilation(); + } } blocks = ssa->ssa2ir(); ir = CANON::traceSchedule(blocks); -- GitLab