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     }