1 cananian 1.10.2.7 // Place.java, created Mon Jan 31 08:30:07 2000 by cananian 2 cananian 1.10.2.7 // Copyright (C) 2000 C. Scott Ananian <cananian@alumni.princeton.edu> 3 cananian 1.10 // Licensed under the terms of the GNU GPL; see COPYING for details. 4 cananian 1.1 package harpoon.Analysis; 5 cananian 1.1 6 cananian 1.10.2.1 import harpoon.ClassFile.HCodeElement; 7 cananian 1.10.2.7 import harpoon.ClassFile.HCode; 8 cananian 1.10.2.7 import harpoon.IR.Properties.CFGraphable; 9 cananian 1.10.2.13 import harpoon.IR.Properties.UseDefable; 10 cananian 1.1 import harpoon.Temp.Temp; 11 cananian 1.12 import net.cscott.jutil.WorkSet; 12 cananian 1.12 import net.cscott.jutil.BitSetFactory; 13 cananian 1.12 import net.cscott.jutil.GenericMultiMap; 14 cananian 1.12 import net.cscott.jutil.Factories; 15 cananian 1.12 import net.cscott.jutil.MultiMap; 16 cananian 1.10.2.4 17 cananian 1.10.2.7 import java.util.Collection; 18 cananian 1.10.2.4 import java.util.Iterator; 19 cananian 1.10.2.4 import java.util.Set; 20 cananian 1.1 /** 21 cananian 1.10.2.4 * <code>Place</code> determines the proper locations for phi/sigma 22 cananian 1.10.2.7 * functions. This is the placement algorithm detailed in my 23 cananian 1.10.2.7 * thesis. 24 cananian 1.1 * 25 cananian 1.1 * @author C. Scott Ananian <cananian@alumni.princeton.edu> 26 cananian 1.13 * @version $Id: Place.java,v 1.13 2004/02/08 03:19:12 cananian Exp $ 27 cananian 1.1 */ 28 cananian 1.10.2.7 public class Place { 29 cananian 1.10.2.7 private final MultiMap phis; 30 cananian 1.10.2.7 private final MultiMap sigmas; 31 cananian 1.10.2.4 32 cananian 1.1 /** Creates a <code>Place</code>. */ 33 cananian 1.10.2.7 public Place(HCode hc, Liveness live) { 34 cananian 1.10.2.7 // create SESE 35 cananian 1.10.2.7 SESE sese = new SESE(hc); 36 cananian 1.10.2.7 // collect all vars 37 cananian 1.10.2.7 Set vars = new WorkSet(); 38 cananian 1.10.2.7 for (Iterator it=hc.getElementsI(); it.hasNext(); ) 39 cananian 1.10.2.13 vars.addAll(((UseDefable)it.next()).defC()); 40 cananian 1.10.2.7 // create result multimaps 41 cananian 1.10.2.12 phis = new GenericMultiMap(new BitSetFactory(vars)); 42 cananian 1.10.2.12 sigmas = new GenericMultiMap(new BitSetFactory(vars)); 43 cananian 1.10.2.7 // for each variable v in G, do: 44 cananian 1.13 for (Object vO : vars) { 45 cananian 1.13 Temp v = (Temp) vO; 46 cananian 1.10.2.10 PlaceOne(sese.topLevel, v, live); // place phis and sigmas 47 cananian 1.1 } 48 cananian 1.4 } 49 cananian 1.10.2.10 private boolean PlaceOne(SESE.Region r, Temp v, Liveness live) 50 cananian 1.10.2.7 { 51 cananian 1.10.2.7 // post-order traversal. 52 cananian 1.10.2.7 boolean flag = false; 53 cananian 1.10.2.7 for (Iterator it=r.children().iterator(); it.hasNext(); ) 54 cananian 1.10.2.10 if (PlaceOne((SESE.Region)it.next(), v, live)) 55 cananian 1.10.2.7 flag = true; 56 cananian 1.10.2.7 for (Iterator it=r.nodes().iterator(); !flag && it.hasNext(); ) { 57 cananian 1.10.2.13 UseDefable n = (UseDefable) it.next(); 58 cananian 1.10.2.9 // we need phis for 'use-only' vars because the sigma is 59 cananian 1.10.2.9 // going to create a definition for them. Likewise we 60 cananian 1.10.2.9 // need sigmas for 'def-only' vars. [CSA] 61 cananian 1.10.2.9 if (n.defC().contains(v) || n.useC().contains(v)) 62 cananian 1.10.2.7 flag = true; 63 cananian 1.1 } 64 cananian 1.10.2.4 65 cananian 1.10.2.7 // add phis/sigmas to merges/splits where v may be live 66 cananian 1.10.2.7 if (flag) { 67 cananian 1.13 for (Object nO : r.nodes()) { 68 cananian 1.13 HCodeElement n = (HCodeElement) nO; 69 cananian 1.10.2.10 if (((CFGraphable)n).predC().size() > 1 && 70 cananian 1.10.2.7 live.getLiveIn(n).contains(v)) 71 cananian 1.10.2.7 phis.add(n, v); 72 cananian 1.10.2.10 if (((CFGraphable)n).succC().size() > 1 && 73 cananian 1.10.2.7 live.getLiveIn(n).contains(v)) 74 cananian 1.10.2.7 sigmas.add(n, v); 75 cananian 1.10.2.7 } 76 cananian 1.1 } 77 cananian 1.10.2.7 return flag; 78 cananian 1.1 } 79 cananian 1.1 80 cananian 1.10.2.7 public Temp[] phiNeeded(HCodeElement n) { 81 cananian 1.10.2.7 Collection c = phis.getValues(n); 82 cananian 1.10.2.7 return (Temp[]) c.toArray(new Temp[c.size()]); 83 cananian 1.1 } 84 cananian 1.10.2.7 public Temp[] sigNeeded(HCodeElement n) { 85 cananian 1.10.2.7 Collection c = sigmas.getValues(n); 86 cananian 1.10.2.7 return (Temp[]) c.toArray(new Temp[c.size()]); 87 cananian 1.1 } 88 cananian 1.1 }