1 cananian 1.1.2.1 // SimpleConstMap.java, created Wed Nov 14 15:10:19 2001 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.1 import harpoon.Analysis.Maps.ConstMap;
 7 cananian 1.1.2.1 import harpoon.ClassFile.HCode;
 8 cananian 1.1.2.1 import harpoon.ClassFile.HCodeElement;
 9 cananian 1.1.2.1 import harpoon.IR.Quads.CONST;
10 cananian 1.1.2.1 import harpoon.IR.Quads.Quad;
11 cananian 1.1.2.1 import harpoon.IR.Quads.QuadSSA;
12 cananian 1.1.2.1 import harpoon.IR.Quads.QuadSSI;
13 cananian 1.1.2.1 import harpoon.IR.Quads.QuadVisitor;
14 cananian 1.1.2.1 import harpoon.Temp.Temp;
15 cananian 1.1.2.1 import harpoon.Util.Util;
16 cananian 1.1.2.1 
17 cananian 1.1.2.1 import java.util.HashMap;
18 cananian 1.1.2.1 import java.util.Iterator;
19 cananian 1.1.2.1 import java.util.Map;
20 cananian 1.1.2.1 /**
21 cananian 1.1.2.1  * <code>SimpleConstMap</code> is a very simple implementation of
22 cananian 1.1.2.1  * <code>ConstMap</code> that reports whether a given
23 cananian 1.1.2.1  * <code>Temp</code> is defined by a <code>CONST</code> quad.
24 cananian 1.1.2.1  * Although simple, this is sufficient if an <code>SCCOptimize</code>
25 cananian 1.1.2.1  * pass has been run on the code factory at some point -- the
26 cananian 1.1.2.1  * <code>SCCOptimize</code> transformation will turn more complicated
27 cananian 1.1.2.1  * constant expressions into the simple ones that
28 cananian 1.1.2.1  * <code>SimpleConstMap</code> detects.
29 cananian 1.1.2.1  * 
30 cananian 1.1.2.1  * @author  C. Scott Ananian <cananian@alumni.princeton.edu>
31 cananian 1.4      * @version $Id: SimpleConstMap.java,v 1.4 2002/04/10 03:00:59 cananian Exp $
32 cananian 1.1.2.1  */
33 cananian 1.1.2.1 public class SimpleConstMap implements ConstMap {
34 cananian 1.1.2.1     final SSIToSSAMap ssi2ssa;
35 cananian 1.1.2.1     final Map constMap = new HashMap();
36 cananian 1.1.2.1     public boolean isConst(HCodeElement hce, Temp t) {
37 cananian 1.1.2.1         return constMap.containsKey(map(t));
38 cananian 1.1.2.1     }
39 cananian 1.1.2.1     public Object constMap(HCodeElement hce, Temp t) {
40 cananian 1.1.2.1         if (!isConst(hce, t)) throw new Error("not constant");
41 cananian 1.1.2.1         return constMap.get(map(t));
42 cananian 1.1.2.1     }
43 cananian 1.1.2.1     private Temp map(Temp t) {
44 cananian 1.1.2.1         return ssi2ssa==null ? t : ssi2ssa.tempMap(t);
45 cananian 1.1.2.1     }
46 cananian 1.1.2.1     
47 cananian 1.1.2.1     /** Creates a <code>SimpleConstMap</code> which provides information
48 cananian 1.1.2.1      *  about <code>HCode</code> <code>hc</code>. */
49 cananian 1.1.2.1     public SimpleConstMap(HCode hc) {
50 cananian 1.3.2.1         assert hc.getName().equals(QuadSSI.codename) ||
51 cananian 1.3.2.1                     hc.getName().equals(QuadSSA.codename);
52 cananian 1.1.2.1         this.ssi2ssa = hc.getName().equals(QuadSSI.codename) ?
53 cananian 1.1.2.1             new SSIToSSAMap(hc) : null;
54 cananian 1.1.2.1         QuadVisitor qv = new QuadVisitor() {
55 cananian 1.1.2.1                 public void visit(Quad q) { /* do nothing */ }
56 cananian 1.1.2.1                 public void visit(CONST q) {
57 cananian 1.1.2.1                     constMap.put(map(q.dst()), q.value());
58 cananian 1.1.2.1                 }
59 cananian 1.1.2.1             };
60 cananian 1.1.2.1         for (Iterator it=hc.getElementsI(); it.hasNext(); )
61 cananian 1.1.2.1             ((Quad)it.next()).accept(qv);
62 cananian 1.1.2.1         // done!
63 cananian 1.1.2.1     }
64 cananian 1.2     }