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