1 cananian 1.1.2.2 package harpoon.Backend.CSAHack.FlowGraph; 2 cananian 1.1.2.2 3 cananian 1.1.2.2 import harpoon.Temp.TempList; 4 cananian 1.1.2.2 import harpoon.Temp.Temp; 5 cananian 1.1.2.2 import harpoon.Backend.CSAHack.Graph.NodeList; 6 cananian 1.1.2.2 import harpoon.Backend.CSAHack.Graph.Node; 7 cananian 1.1.2.1 8 cananian 1.1.2.1 /** 9 cananian 1.1.2.1 * A control flow graph is a directed graph in which each edge 10 cananian 1.1.2.1 * indicates a possible flow of control. Also, each node in 11 cananian 1.1.2.1 * the graph defines a set of temporaries; each node uses a set of 12 cananian 1.1.2.1 * temporaries; and each node is, or is not, a <strong>move</strong> 13 cananian 1.1.2.1 * instruction. 14 cananian 1.1.2.1 * 15 cananian 1.1.2.1 * @see AssemFlowGraph 16 cananian 1.1.2.1 */ 17 cananian 1.1.2.1 18 cananian 1.1.2.2 public abstract class FlowGraph extends harpoon.Backend.CSAHack.Graph.Graph { 19 cananian 1.1.2.1 /** 20 cananian 1.1.2.1 * The set of temporaries defined by this instruction or block 21 cananian 1.1.2.1 */ 22 cananian 1.1.2.1 public abstract TempList def(Node node); 23 cananian 1.1.2.1 24 cananian 1.1.2.1 /** 25 cananian 1.1.2.1 * The set of temporaries used by this instruction or block 26 cananian 1.1.2.1 */ 27 cananian 1.1.2.1 public abstract TempList use(Node node); 28 cananian 1.1.2.1 29 cananian 1.1.2.1 /** 30 cananian 1.1.2.1 * True if this node represents a <strong>move</strong> instruction, 31 cananian 1.1.2.1 * i.e. one that can be deleted if def=use. 32 cananian 1.1.2.1 */ 33 cananian 1.1.2.1 public abstract boolean isMove(Node node); 34 cananian 1.1.2.1 35 cananian 1.1.2.1 /** 36 cananian 1.1.2.1 * Print a human-readable dump for debugging. 37 cananian 1.1.2.1 */ 38 cananian 1.1.2.1 public void show(java.io.PrintStream out) { 39 cananian 1.1.2.1 for (NodeList p=nodes(); p!=null; p=p.tail) { 40 cananian 1.1.2.1 Node n = p.head; 41 cananian 1.1.2.1 out.print(n.toString()); 42 cananian 1.1.2.1 out.print(": "); 43 cananian 1.1.2.1 for(TempList q=def(n); q!=null; q=q.tail) { 44 cananian 1.1.2.1 out.print(q.head.toString()); 45 cananian 1.1.2.1 out.print(" "); 46 cananian 1.1.2.1 } 47 cananian 1.1.2.1 out.print(isMove(n) ? "<= " : "<- "); 48 cananian 1.1.2.1 for(TempList q=use(n); q!=null; q=q.tail) { 49 cananian 1.1.2.1 out.print(q.head.toString()); 50 cananian 1.1.2.1 out.print(" "); 51 cananian 1.1.2.1 } 52 cananian 1.1.2.1 out.print("; goto "); 53 cananian 1.1.2.1 for(NodeList q=n.succ(); q!=null; q=q.tail) { 54 cananian 1.1.2.1 out.print(q.head.toString()); 55 cananian 1.1.2.1 out.print(" "); 56 cananian 1.1.2.1 } 57 cananian 1.1.2.1 out.println(); 58 cananian 1.1.2.1 } 59 cananian 1.1.2.1 } 60 cananian 1.1.2.1 61 cananian 1.2 }