1 bdemsky 1.1.2.1 // MyLowQuadSSI.java, created Fri Jul 9 14:13:48 1999 by root 2 bdemsky 1.1.2.1 // Copyright (C) 1999 Brian Demsky <bdemsky@mit.edu> 3 bdemsky 1.1.2.1 // Licensed under the terms of the GNU GPL; see COPYING for details. 4 bdemsky 1.1.2.1 package harpoon.Analysis.LowQuad.Loop; 5 bdemsky 1.1.2.1 6 cananian 1.1.2.7 import harpoon.Analysis.Maps.Derivation; 7 cananian 1.5 import harpoon.Analysis.Maps.Derivation.DList; 8 cananian 1.1.2.6 import harpoon.ClassFile.HClass; 9 cananian 1.1.2.6 import harpoon.ClassFile.HCode; 10 cananian 1.1.2.11 import harpoon.ClassFile.HCodeAndMaps; 11 cananian 1.1.2.6 import harpoon.ClassFile.HCodeElement; 12 cananian 1.1.2.6 import harpoon.ClassFile.HMethod; 13 bdemsky 1.1.2.1 import harpoon.IR.LowQuad.Code; 14 cananian 1.1.2.8 import harpoon.IR.LowQuad.LowQuadSSI; 15 bdemsky 1.1.2.1 import harpoon.IR.Quads.Quad; 16 bdemsky 1.1.2.1 import harpoon.Temp.Temp; 17 bdemsky 1.1.2.1 import harpoon.Temp.TempMap; 18 bdemsky 1.1.2.1 import harpoon.Util.Util; 19 bdemsky 1.1.2.1 20 bdemsky 1.1.2.1 import java.util.Map; 21 bdemsky 1.1.2.1 import java.util.HashMap; 22 bdemsky 1.1.2.1 import java.util.Iterator; 23 bdemsky 1.1.2.1 24 bdemsky 1.1.2.1 /** 25 bdemsky 1.1.2.1 * <code>MyLowQuadSSI</code> 26 bdemsky 1.1.2.1 * 27 bdemsky 1.1.2.1 * @author Brian Demsky <bdemsky@mit.edu> 28 cananian 1.5 * @version $Id: MyLowQuadSSI.java,v 1.5 2003/03/11 18:22:36 cananian Exp $ 29 bdemsky 1.1.2.1 */ 30 bdemsky 1.1.2.1 31 cananian 1.1.2.10 public class MyLowQuadSSI extends harpoon.IR.LowQuad.LowQuadSSI 32 cananian 1.5 implements Derivation<Quad> 33 cananian 1.1.2.10 /* ergh. implementing Derivation directly is bad. bdemsky should fix. */ 34 cananian 1.1.2.10 { 35 cananian 1.5 HashMap<Temp,DList> dT; 36 cananian 1.5 HashMap<Temp,HClass> tT; 37 bdemsky 1.1.2.1 public static final String codename = "low-quad-ssa"; 38 cananian 1.5 Derivation<Quad> parentDerivation; 39 cananian 1.5 Map<Quad,Quad> quadmap; 40 bdemsky 1.1.2.1 TempMap tempMap; 41 cananian 1.5 Map<Quad,Quad> quadmapchanges; 42 bdemsky 1.1.2.1 43 cananian 1.1.2.8 MyLowQuadSSI(final LowQuadSSI code) { 44 bdemsky 1.1.2.1 super(code.getMethod(),null); 45 cananian 1.1.2.10 parentDerivation=code.getDerivation(); 46 cananian 1.1.2.12 47 cananian 1.5 HCodeAndMaps<Quad> hcam = cloneHelper(code, this); 48 cananian 1.1.2.12 quadmap=hcam.elementMap(); 49 cananian 1.1.2.12 tempMap=hcam.tempMap(); 50 cananian 1.1.2.12 51 cananian 1.5 dT=new HashMap<Temp,DList>(); 52 cananian 1.5 tT=new HashMap<Temp,HClass>(); 53 cananian 1.5 quadmapchanges=new HashMap<Quad,Quad>(); 54 bdemsky 1.1.2.1 buildmaps(code); 55 cananian 1.1.2.10 setDerivation(this); 56 bdemsky 1.1.2.1 } 57 bdemsky 1.1.2.1 58 cananian 1.5 private void buildmaps(final HCode<Quad> code) { 59 cananian 1.5 Iterator<Quad> iterate=code.getElementsI(); 60 bdemsky 1.1.2.1 while (iterate.hasNext()) { 61 cananian 1.5 Quad q=iterate.next(); 62 bdemsky 1.1.2.1 Temp[] defs=q.def(); 63 bdemsky 1.1.2.1 for(int i=0;i<defs.length;i++) { 64 cananian 1.1.2.10 Derivation.DList parents=parentDerivation.derivation(q, defs[i]); 65 bdemsky 1.1.2.1 if (parents!=null) { 66 bdemsky 1.1.2.13 //System.out.print("MySSI: "+q+","+defs[i]+"->"+quadmap.get(q)+","+tempMap.tempMap(defs[i])+" "+parents); 67 cananian 1.1.2.3 dT.put(tempMap.tempMap(defs[i]),Derivation.DList.rename(parents,tempMap)); 68 bdemsky 1.1.2.13 //System.out.println(dT.get(tempMap.tempMap(defs[i]))); 69 bdemsky 1.1.2.1 tT.put(tempMap.tempMap(defs[i]), 70 bdemsky 1.1.2.13 null); 71 bdemsky 1.1.2.1 } else 72 cananian 1.1.2.10 tT.put(tempMap.tempMap(defs[i]),parentDerivation.typeMap(null,defs[i])); 73 bdemsky 1.1.2.1 } 74 bdemsky 1.1.2.1 } 75 bdemsky 1.1.2.1 } 76 bdemsky 1.1.2.1 77 bdemsky 1.1.2.1 private MyLowQuadSSI(HMethod method, Quad quads) { 78 bdemsky 1.1.2.1 super (method, quads); 79 cananian 1.5 dT=new HashMap<Temp,DList>(); 80 cananian 1.5 tT=new HashMap<Temp,HClass>(); 81 cananian 1.5 quadmapchanges=new HashMap<Quad,Quad>(); 82 cananian 1.1.2.10 setDerivation(this); 83 bdemsky 1.1.2.1 } 84 bdemsky 1.1.2.1 85 bdemsky 1.1.2.1 public Quad quadMap(Quad q) { 86 bdemsky 1.1.2.1 if (quadmapchanges.containsKey(q)) 87 cananian 1.5 return quadmapchanges.get(q); 88 bdemsky 1.1.2.1 else 89 cananian 1.5 return quadmap.get(q); 90 bdemsky 1.1.2.1 } 91 bdemsky 1.1.2.1 92 bdemsky 1.1.2.1 public void addQuadMapping(Quad oldquad, Quad newquad) { 93 bdemsky 1.1.2.1 quadmapchanges.put(oldquad, newquad); 94 bdemsky 1.1.2.1 } 95 bdemsky 1.1.2.1 96 bdemsky 1.1.2.1 public Temp tempMap(Temp t) { 97 bdemsky 1.1.2.1 return tempMap.tempMap(t); 98 bdemsky 1.1.2.1 } 99 bdemsky 1.1.2.1 100 bdemsky 1.1.2.1 public void addDerivation(Temp t, Derivation.DList dlist) { 101 bdemsky 1.1.2.1 dT.put(t, dlist); 102 bdemsky 1.1.2.1 } 103 bdemsky 1.1.2.1 104 cananian 1.5 public Derivation.DList derivation(Quad hce, Temp t) { 105 cananian 1.3.2.1 assert hce!=null && t!=null; 106 cananian 1.5 return dT.get(t); 107 bdemsky 1.1.2.1 } 108 bdemsky 1.1.2.1 109 bdemsky 1.1.2.1 110 cananian 1.5 public void addType(Temp t, HClass type) { 111 bdemsky 1.1.2.1 tT.put(t, type); 112 bdemsky 1.1.2.1 } 113 bdemsky 1.1.2.1 114 cananian 1.5 public HClass typeMap(Quad hce, Temp t) { 115 cananian 1.3.2.1 assert t!=null; 116 cananian 1.5 HClass type = tT.get(t); 117 bdemsky 1.1.2.13 // if (type==null) 118 bdemsky 1.1.2.13 // System.out.println("TYPE UNKNOWN for :"+hce+","+t+"in MyLowQuadSSI"); 119 cananian 1.5 return type; 120 bdemsky 1.1.2.1 } 121 bdemsky 1.1.2.1 122 cananian 1.5 public HCodeAndMaps<Quad> clone(HMethod newMethod) { 123 bdemsky 1.1.2.1 MyLowQuadSSI lqs=new MyLowQuadSSI(newMethod, null); 124 cananian 1.5 HCodeAndMaps<Quad> hcam = cloneHelper(lqs); 125 cananian 1.1.2.10 lqs.parentDerivation=this.getDerivation(); 126 cananian 1.1.2.11 lqs.quadmap = hcam.elementMap(); 127 cananian 1.1.2.11 lqs.tempMap = hcam.tempMap(); 128 bdemsky 1.1.2.1 lqs.buildmaps(this); 129 cananian 1.1.2.11 return hcam; 130 bdemsky 1.1.2.1 } 131 bdemsky 1.1.2.1 132 bdemsky 1.1.2.1 public String getName() { 133 bdemsky 1.1.2.1 return codename; 134 bdemsky 1.1.2.1 } 135 cananian 1.2 }