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 }