1 cananian 1.1.2.1 // SSXReachingDefsImpl.java, created Tue Jun  6 22:28:11 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;
 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.HCodeElement;
 8 cananian 1.1.2.1 import harpoon.IR.Properties.UseDefer;
 9 cananian 1.1.2.1 import harpoon.Temp.Temp;
10 cananian 1.1.2.1 import harpoon.Util.Util;
11 cananian 1.1.2.1 
12 cananian 1.1.2.1 import java.util.Collections;
13 cananian 1.1.2.1 import java.util.HashMap;
14 cananian 1.1.2.1 import java.util.Iterator;
15 cananian 1.1.2.1 import java.util.Map;
16 cananian 1.1.2.1 import java.util.Set;
17 cananian 1.1.2.1 /**
18 cananian 1.1.2.1  * <code>SSxReachingDefsImpl</code> is a <code>ReachingDefs</code>
19 cananian 1.1.2.1  * implementation that works on codeviews in SSA or SSI form.  It
20 cananian 1.1.2.1  * is much more efficient (because of the SSx form) than the
21 cananian 1.1.2.1  * standard <code>ReachingDefsImpl</code>.
22 cananian 1.1.2.1  * 
23 cananian 1.1.2.1  * @author  C. Scott Ananian <cananian@alumni.princeton.edu>
24 cananian 1.6      * @version $Id: SSxReachingDefsImpl.java,v 1.6 2004/02/08 03:19:12 cananian Exp $
25 cananian 1.1.2.1  */
26 cananian 1.3.2.2 public class SSxReachingDefsImpl<HCE extends HCodeElement>
27 cananian 1.3.2.2     extends ReachingDefs<HCE> {
28 cananian 1.3.2.2     private final Map<Temp,HCE> m = new HashMap<Temp,HCE>();
29 cananian 1.1.2.1     /** Create an <code>SSxReachingDefs</code> using the default
30 cananian 1.1.2.1      *  <code>UseDefer</code>. */
31 cananian 1.3.2.2     public SSxReachingDefsImpl(HCode<HCE> hc) {
32 cananian 1.5             this(hc, (UseDefer<HCE>) UseDefer.DEFAULT);
33 cananian 1.3.2.2     }
34 cananian 1.1.2.1     /** Create an <code>SSxReachingDefs</code> for <code>hc</code>
35 cananian 1.1.2.1      *  using the specified <code>UseDefer</code>. */
36 cananian 1.3.2.2     public SSxReachingDefsImpl(HCode<HCE> hc, UseDefer<HCE> ud) {
37 cananian 1.1.2.1         super(hc);
38 cananian 1.3.2.2         for (Iterator<HCE> it = hc.getElementsI(); it.hasNext(); ) {
39 cananian 1.3.2.2             HCE hce = (HCE) it.next();
40 cananian 1.6                 for (Temp t : ud.defC(hce)) {
41 cananian 1.3.2.1                 assert !m.containsKey(t) : "not in SSA/SSI form!";
42 cananian 1.1.2.1                 m.put(t, hce);
43 cananian 1.1.2.1             }
44 cananian 1.1.2.1         }
45 cananian 1.1.2.1     }
46 cananian 1.3.2.2     public Set<HCE> reachingDefs(HCE hce, Temp t) {
47 cananian 1.1.2.2         if (!m.containsKey(t)) return Collections.EMPTY_SET;
48 cananian 1.1.2.1         return Collections.singleton(m.get(t));
49 cananian 1.1.2.1     }
50 cananian 1.2     }