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      }