1 cananian 1.1.2.1 // SSIStats.java, created Mon Aug 30 16:56:03 1999 by cananian 2 cananian 1.1.2.1 // Copyright (C) 1999 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.1 import harpoon.ClassFile.HCode; 7 cananian 1.1.2.1 import harpoon.ClassFile.HCodeFactory; 8 cananian 1.1.2.1 import harpoon.ClassFile.HMethod; 9 cananian 1.1.2.1 import harpoon.IR.Quads.Quad; 10 cananian 1.1.2.1 import harpoon.Temp.Temp; 11 cananian 1.1.2.1 import harpoon.Util.Util; 12 cananian 1.1.2.1 13 cananian 1.1.2.1 import java.util.HashSet; 14 cananian 1.1.2.1 import java.util.Iterator; 15 cananian 1.1.2.1 import java.util.Set; 16 cananian 1.1.2.1 /** 17 cananian 1.1.2.1 * <code>SSIStats</code> is a class to provide counts of uses, definitions 18 cananian 1.1.2.1 * and variables in plain, SSA, and SSI forms. Primarily, its purpose 19 cananian 1.1.2.1 * is to generate numbers for papers which justify claims of algorithmic 20 cananian 1.1.2.1 * linearity. 21 cananian 1.1.2.1 * 22 cananian 1.1.2.1 * @author C. Scott Ananian <cananian@alumni.princeton.edu> 23 cananian 1.2 * @version $Id: SSIStats.java,v 1.2 2002/02/25 20:59:23 cananian Exp $ 24 cananian 1.1.2.1 */ 25 cananian 1.1.2.1 public class SSIStats { 26 cananian 1.1.2.1 /** How many variable definitions are in this code. */ 27 cananian 1.1.2.1 public final int uses; 28 cananian 1.1.2.1 /** How many variable uses are in this code. */ 29 cananian 1.1.2.1 public final int defs; 30 cananian 1.1.2.1 /** How many variables are in this code. */ 31 cananian 1.1.2.1 public final int vars; 32 cananian 1.1.2.1 /** How many statements are in this code. */ 33 cananian 1.1.2.1 public final int length; 34 cananian 1.1.2.1 35 cananian 1.1.2.1 /** Creates a <code>SSIStats</code>. */ 36 cananian 1.1.2.1 public SSIStats(harpoon.IR.Quads.Code c) { 37 cananian 1.1.2.1 Set v=new HashSet(); 38 cananian 1.1.2.1 int u=0,d=0,n=0; 39 cananian 1.1.2.1 for (Iterator it=c.getElementsI(); it.hasNext(); n++) { 40 cananian 1.1.2.1 Quad q=(Quad)it.next(); 41 cananian 1.1.2.1 Temp[] ut = q.use(), dt=q.def(); 42 cananian 1.1.2.1 for (int i=0; i<ut.length; i++) 43 cananian 1.1.2.1 u++; 44 cananian 1.1.2.1 for (int i=0; i<dt.length; i++) 45 cananian 1.1.2.1 d++; 46 cananian 1.1.2.1 for (int i=0; i<dt.length; i++) 47 cananian 1.1.2.1 v.add(dt[i]); 48 cananian 1.1.2.1 } 49 cananian 1.1.2.1 this.uses = u; 50 cananian 1.1.2.1 this.defs = u; 51 cananian 1.1.2.1 this.vars = v.size(); 52 cananian 1.1.2.1 this.length = n; 53 cananian 1.1.2.1 } 54 cananian 1.1.2.1 55 cananian 1.1.2.1 public static HCodeFactory codeFactory(final HCodeFactory hcf) { 56 cananian 1.1.2.1 return new HCodeFactory() { 57 cananian 1.1.2.1 final Set counted = new HashSet(); 58 cananian 1.1.2.1 public String getCodeName() { return hcf.getCodeName(); } 59 cananian 1.1.2.1 public void clear(HMethod m) { hcf.clear(m); } 60 cananian 1.1.2.1 public HCode convert(HMethod m) { 61 cananian 1.1.2.1 HCode c = hcf.convert(m); 62 cananian 1.1.2.1 if (!counted.contains(m)) { 63 cananian 1.1.2.1 counted.add(m); 64 cananian 1.1.2.1 SSIStats ss = new SSIStats((harpoon.IR.Quads.Code)c); 65 cananian 1.1.2.1 if (harpoon.Main.Options.statWriter!=null) 66 cananian 1.1.2.1 harpoon.Main.Options.statWriter.println 67 cananian 1.1.2.1 ("PHISIG "+ss.length+" "+ 68 cananian 1.1.2.1 ss.uses+" "+ss.defs+" "+ss.vars); 69 cananian 1.1.2.1 } 70 cananian 1.1.2.1 return c; 71 cananian 1.1.2.1 } 72 cananian 1.1.2.1 }; 73 cananian 1.1.2.1 } 74 cananian 1.2 }