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 }