1 cananian 1.1.2.1 /*
 2 cananian 1.1.2.1  * RegAlloc/RegWork.java
 3 cananian 1.1.2.1  *  collections of sets used by the register allocator.
 4 cananian 1.1.2.1  *   
 5 cananian 1.1.2.1  * C. Scott Ananian, cananian@princeton.edu, COS320
 6 cananian 1.1.2.1  */
 7 cananian 1.1.2.1 
 8 cananian 1.1.2.2 package harpoon.Backend.CSAHack.RegAlloc;
 9 cananian 1.1.2.1 
10 cananian 1.1.2.2 import harpoon.Backend.CSAHack.Graph.Node;
11 cananian 1.1.2.2 import harpoon.Backend.CSAHack.Graph.NodeList;
12 cananian 1.1.2.2 import harpoon.Temp.TempList;
13 cananian 1.1.2.1 
14 cananian 1.1.2.1 import java.util.Hashtable;
15 cananian 1.1.2.1 import java.util.Stack;
16 cananian 1.1.2.1 
17 cananian 1.1.2.3 abstract class RegWork { // make all of these inner classes.
18 cananian 1.1.2.3 static class Worklist {
19 cananian 1.1.2.1   Set simplify  = new Set("simplifyWorklist");
20 cananian 1.1.2.1   Set freeze    = new Set("freezeWorklist");
21 cananian 1.1.2.1   Set spill     = new Set("spillWorklist");
22 cananian 1.1.2.1 }
23 cananian 1.1.2.1 
24 cananian 1.1.2.3 static class NodeSet {
25 cananian 1.1.2.1   Set precolored = new Set("precolored");
26 cananian 1.1.2.1   Set initial    = new Set("initial");
27 cananian 1.1.2.1   Worklist worklist = new Worklist();
28 cananian 1.1.2.1   Set spilled    = new Set("spilled");
29 cananian 1.1.2.1   Set coalesced  = new Set("coalesced");
30 cananian 1.1.2.1   Set colored    = new Set("colored");
31 cananian 1.1.2.1   Stack selectStack= new Stack();
32 cananian 1.1.2.1 
33 cananian 1.1.2.1   int correctsize;
34 cananian 1.1.2.1 
35 cananian 1.1.2.2   NodeSet(TempList registers, InterferenceGraph ig) {
36 cananian 1.1.2.1 //    precolored.live = initial.live = worklist.simplify.live =
37 cananian 1.1.2.1 //      worklist.freeze.live = worklist.spill.live = spilled.live = 
38 cananian 1.1.2.1 //      coalesced.live = colored.live = ig;
39 cananian 1.1.2.1     // initialize sets. (only precolored and initial are non-empty)
40 cananian 1.1.2.2     for (NodeList nl = ig.nodes(); nl!=null; nl=nl.tail)
41 cananian 1.1.2.1       initial.add(nl.head);
42 cananian 1.1.2.1     for ( ; registers!= null; registers=registers.tail) {
43 cananian 1.1.2.1       Node n = ig.tnode(registers.head);
44 cananian 1.1.2.1       if (n!=null) {
45 cananian 1.1.2.1         precolored.add(n);
46 cananian 1.1.2.1         initial.remove(n);
47 cananian 1.1.2.1       }
48 cananian 1.1.2.1     }
49 cananian 1.1.2.1     correctsize = size();
50 cananian 1.1.2.1   }
51 cananian 1.1.2.1 
52 cananian 1.1.2.1   int size() {
53 cananian 1.1.2.1     return precolored.size() + initial.size() + spilled.size() + coalesced.size() + colored.size() + selectStack.size() + worklist.simplify.size() + worklist.freeze.size() + worklist.spill.size();
54 cananian 1.1.2.1   }
55 cananian 1.1.2.1   void check() {
56 cananian 1.1.2.1     if (size() != correctsize) throw new Error("Size invariance violated");
57 cananian 1.1.2.1   }
58 cananian 1.1.2.1 }
59 cananian 1.1.2.1 
60 cananian 1.1.2.3 static class Moves { 
61 cananian 1.1.2.1   Set coalesced         = new Set("coalescedMoves");
62 cananian 1.1.2.1   Set constrained       = new Set("constrainedMoves");
63 cananian 1.1.2.1   Set frozen            = new Set("frozenMoves");
64 cananian 1.1.2.1   Set worklist          = new Set("worklistMoves");
65 cananian 1.1.2.1   Set active            = new Set("activeMoves");
66 cananian 1.1.2.1 
67 cananian 1.1.2.2   Moves(harpoon.Backend.CSAHack.FlowGraph.FlowGraph fg) {
68 cananian 1.1.2.1     for (NodeList nl = fg.nodes(); nl!=null; nl=nl.tail)
69 cananian 1.1.2.1       if (fg.isMove(nl.head))
70 cananian 1.1.2.1         worklist.add(nl.head);
71 cananian 1.1.2.1   }
72 cananian 1.1.2.1 }
73 cananian 1.1.2.3 
74 cananian 1.2     } // end RegWork