1 cananian 1.1.2.1 // QuadInterferenceGraph.java, created Thu Nov 23 13:14:33 2000 by cananian 2 cananian 1.1.2.1 // Copyright (C) 2000 C. Scott Ananian <cananian@alumni.princeton.edu> 3 cananian 1.1.2.1 // Licensed under the terms of the GNU GPL; see COPYING for details. 4 cananian 1.1.2.1 package harpoon.Analysis.Quads; 5 cananian 1.1.2.1 6 cananian 1.1.2.2 import harpoon.Analysis.InterferenceGraph; 7 cananian 1.1.2.1 import harpoon.Analysis.Liveness; 8 cananian 1.2.2.1 import harpoon.ClassFile.HCodeElement; 9 cananian 1.1.2.1 import harpoon.IR.Quads.Code; 10 cananian 1.1.2.1 import harpoon.IR.Quads.Quad; 11 cananian 1.1.2.1 import harpoon.Temp.Temp; 12 cananian 1.4 import net.cscott.jutil.AggregateSetFactory; 13 cananian 1.4 import net.cscott.jutil.GenericMultiMap; 14 cananian 1.4 import net.cscott.jutil.MultiMap; 15 cananian 1.1.2.1 import harpoon.Util.Grapher; 16 cananian 1.1.2.1 17 cananian 1.1.2.1 import java.util.Collection; 18 cananian 1.1.2.2 import java.util.Collections; 19 cananian 1.1.2.1 import java.util.Iterator; 20 cananian 1.1.2.2 import java.util.List; 21 cananian 1.1.2.1 import java.util.Set; 22 cananian 1.1.2.1 /** 23 cananian 1.1.2.1 * <code>QuadInterferenceGraph</code> constructs a variable-liveness 24 cananian 1.1.2.1 * interference graph from a <code>Quad.Code</code>. There is an 25 cananian 1.1.2.1 * edge between <code>Temp</code> <code>t1</code> and 26 cananian 1.1.2.1 * <code>Temp</code> <code>t2</code> if <code>t1</code> and 27 cananian 1.1.2.1 * <code>t2</code> are ever live at the same point. 28 cananian 1.1.2.1 * <p> 29 cananian 1.1.2.1 * <code>QuadInterferenceGraph</code> is a <code>Grapher</code> 30 cananian 1.1.2.1 * for <code>Temp</code>s. 31 cananian 1.1.2.1 * 32 cananian 1.1.2.1 * @author C. Scott Ananian <cananian@alumni.princeton.edu> 33 cananian 1.5 * @version $Id: QuadInterferenceGraph.java,v 1.5 2004/02/08 03:20:10 cananian Exp $ 34 cananian 1.1.2.1 */ 35 cananian 1.1.2.2 public class QuadInterferenceGraph implements InterferenceGraph { 36 cananian 1.2.2.1 private final MultiMap<Temp,Temp> mm; 37 cananian 1.1.2.1 38 cananian 1.1.2.1 /** Creates a <code>QuadInterferenceGraph</code>. */ 39 cananian 1.1.2.1 public QuadInterferenceGraph(Code code) { 40 cananian 1.1.2.1 this(code, new QuadLiveness(code)); 41 cananian 1.1.2.1 } 42 cananian 1.2.2.1 public QuadInterferenceGraph(Code code, Liveness<Quad> live) { 43 cananian 1.2.2.1 this.mm=new GenericMultiMap<Temp,Temp>(new AggregateSetFactory<Temp>()); 44 cananian 1.2.2.1 for (Iterator<Quad> it=code.getElementsI(); it.hasNext(); ) { 45 cananian 1.2.2.1 Quad q = it.next(); 46 cananian 1.5 for (Temp t : live.getLiveOut(q)) { 47 cananian 1.5 for (Temp d : q.defC()) { 48 cananian 1.1.2.1 if (!t.equals(d)) { 49 cananian 1.1.2.1 mm.add(t, d); 50 cananian 1.1.2.1 mm.add(d, t); 51 cananian 1.1.2.1 } 52 cananian 1.1.2.1 } 53 cananian 1.1.2.1 } 54 cananian 1.1.2.1 } 55 cananian 1.1.2.1 } 56 cananian 1.1.2.2 /** unimplemented. always returns 1. */ 57 cananian 1.1.2.2 public int spillCost(Temp t) { return 1; } 58 cananian 1.1.2.2 /** unimplemented. always returns 0-element list. */ 59 cananian 1.2.2.1 public List<HCodeElement> moves() { return Collections.EMPTY_LIST; } 60 cananian 1.1.2.2 61 cananian 1.2.2.1 public boolean isEdge(Temp from, Temp to) { 62 cananian 1.1.2.1 return mm.contains(from, to); 63 cananian 1.1.2.1 } 64 cananian 1.2.2.1 public Set<Temp> succSet(Temp node) { 65 cananian 1.2.2.1 return (Set<Temp>) mm.getValues(node); 66 cananian 1.2.2.1 } 67 cananian 1.2.2.1 public Set<Temp> predSet(Temp node) { 68 cananian 1.2.2.1 return (Set<Temp>) mm.getValues(node); 69 cananian 1.2.2.1 } 70 cananian 1.2 }