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