1 cananian 1.1.2.1 // RSSxToNoSSA.java, created Thu Feb 10 13:58:12 2000 by root
  2 cananian 1.1.2.3 // Copyright (C) 2000 Brian Demsky <bdemsky@mit.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.IR.Quads;
  5 cananian 1.1.2.1 
  6 cananian 1.1.2.1 import harpoon.IR.LowQuad.LowQuadVisitor;
  7 cananian 1.1.2.1 import harpoon.IR.LowQuad.LowQuadFactory;
  8 cananian 1.1.2.1 import harpoon.IR.LowQuad.PCALL;
  9 cananian 1.1.2.1 import harpoon.ClassFile.HClass;
 10 cananian 1.1.2.1 import harpoon.ClassFile.HCode;
 11 cananian 1.1.2.1 import harpoon.Temp.CloningTempMap;
 12 cananian 1.1.2.1 import harpoon.Temp.Temp;
 13 cananian 1.1.2.1 import harpoon.Temp.TempMap;
 14 cananian 1.3     import net.cscott.jutil.WorkSet;
 15 cananian 1.1.2.1 
 16 cananian 1.1.2.1 import harpoon.Analysis.AllocationInformationMap;
 17 cananian 1.1.2.1 import harpoon.Analysis.Maps.AllocationInformation;
 18 cananian 1.1.2.1 
 19 cananian 1.1.2.1 import java.util.HashMap;
 20 cananian 1.1.2.1 import java.util.Iterator;
 21 cananian 1.1.2.1 import java.util.Set;
 22 cananian 1.1.2.1 import java.util.Map;
 23 cananian 1.1.2.1 
 24 cananian 1.1.2.1 /**
 25 cananian 1.1.2.5  * <code>RSSxToNoSSA</code> converts "relaxed-ssx" form into quads without
 26 cananian 1.1.2.5  * phi or sigma functions.
 27 cananian 1.1.2.1  * 
 28 cananian 1.1.2.3  * @author  Brian Demsky <bdemsky@mit.edu>
 29 cananian 1.3      * @version $Id: RSSxToNoSSA.java,v 1.3 2004/02/08 01:55:25 cananian Exp $
 30 cananian 1.1.2.1  */
 31 cananian 1.1.2.1 public class RSSxToNoSSA {
 32 cananian 1.1.2.1     QuadFactory newQF;
 33 cananian 1.1.2.1     Code code;
 34 cananian 1.1.2.1     private CloningTempMap ctm;
 35 cananian 1.1.2.1     private Quad header;
 36 cananian 1.1.2.1     AllocationInformationMap newai;
 37 cananian 1.1.2.1     AllocationInformation oldai;
 38 cananian 1.1.2.1     HashMap quadmap;
 39 bdemsky  1.1.2.7     HashMap newtempmap;
 40 bdemsky  1.1.2.7 
 41 cananian 1.1.2.1     
 42 cananian 1.1.2.1     /** Creates a <code>RSSxToNoSSA</code>. */
 43 cananian 1.1.2.1     public RSSxToNoSSA(QuadFactory newQF, Code code) {
 44 cananian 1.1.2.1         this.newQF=newQF;
 45 cananian 1.1.2.1         this.code=code;
 46 cananian 1.1.2.1         ctm=new CloningTempMap(code.qf.tempFactory(),newQF.tempFactory());
 47 cananian 1.1.2.1         this.oldai=code.getAllocationInformation();
 48 cananian 1.1.2.1         if (oldai!=null)
 49 cananian 1.1.2.1             this.newai=new AllocationInformationMap();
 50 cananian 1.1.2.1         else
 51 cananian 1.1.2.1             this.newai=null;
 52 bdemsky  1.1.2.7         this.newtempmap=new HashMap();
 53 cananian 1.1.2.1         this.header=translate();
 54 cananian 1.1.2.1     }
 55 cananian 1.1.2.1     public Quad getQuads() { return header; }
 56 cananian 1.1.2.1 
 57 cananian 1.1.2.1     public AllocationInformation getAllocationInfo() {return newai;}
 58 cananian 1.1.2.1 
 59 cananian 1.1.2.1     public TempMap tempMap() {
 60 cananian 1.1.2.1         return ctm;
 61 cananian 1.1.2.1     }
 62 cananian 1.1.2.1 
 63 cananian 1.1.2.1     public Map quadMap() {
 64 cananian 1.1.2.1         return quadmap;
 65 cananian 1.1.2.1     }
 66 cananian 1.1.2.1 
 67 bdemsky  1.1.2.7     public Map newTempMap() {
 68 bdemsky  1.1.2.7         return newtempmap;
 69 bdemsky  1.1.2.7     }
 70 bdemsky  1.1.2.7 
 71 cananian 1.1.2.1     private Quad translate() {
 72 cananian 1.1.2.1         quadmap=new HashMap();
 73 cananian 1.1.2.1         for (Iterator qiter=code.getElementsI();
 74 cananian 1.1.2.1              qiter.hasNext();) {
 75 cananian 1.1.2.1             Quad q=(Quad)qiter.next();
 76 cananian 1.1.2.1             try {
 77 cananian 1.1.2.1                 Quad qc=(Quad)q.clone(newQF,ctm);
 78 cananian 1.1.2.1                 if ((newai!=null)&&((q instanceof harpoon.IR.Quads.NEW)||
 79 cananian 1.1.2.1                 (q instanceof harpoon.IR.Quads.ANEW))) {
 80 cananian 1.1.2.1                     newai.transfer(qc,q,ctm, oldai);
 81 cananian 1.1.2.1                 }
 82 cananian 1.1.2.1                 quadmap.put(q, qc);
 83 cananian 1.1.2.1             } catch (Exception e) {
 84 cananian 1.1.2.1                 e.printStackTrace();
 85 cananian 1.1.2.1                 System.out.println(((CALL)q).method());
 86 cananian 1.1.2.1                 System.out.println(q);
 87 cananian 1.1.2.1                 System.out.println(newQF);
 88 cananian 1.1.2.1                 System.exit(1);
 89 cananian 1.1.2.1             }
 90 cananian 1.1.2.1         }
 91 cananian 1.1.2.1         for (Iterator qiter=code.getElementsI();
 92 cananian 1.1.2.1              qiter.hasNext();) {
 93 cananian 1.1.2.1             Quad q=(Quad)qiter.next();
 94 cananian 1.1.2.1             for (int i=0;i<q.nextLength();i++) {
 95 cananian 1.1.2.1                 Quad.addEdge((Quad)quadmap.get(q),i,
 96 cananian 1.1.2.1                              (Quad)quadmap.get(q.next(i)),q.nextEdge(i).which_pred());
 97 cananian 1.1.2.1             }
 98 cananian 1.1.2.1         }
 99 cananian 1.1.2.1         Quad newRoot=(Quad)quadmap.get(code.getRootElement());
100 cananian 1.1.2.1         WorkSet todo=new WorkSet(),done=new WorkSet();
101 cananian 1.1.2.1         todo.push(newRoot);
102 bdemsky  1.1.2.7         Remover v=new Remover(done,newtempmap);
103 cananian 1.1.2.1         while (!todo.isEmpty()) {
104 cananian 1.1.2.1             Quad q=(Quad)todo.pop();
105 cananian 1.1.2.1             done.add(q);
106 cananian 1.1.2.1             for(int i=0;i<q.nextLength();i++)
107 cananian 1.1.2.1                 if (!done.contains(q.next(i)))
108 cananian 1.1.2.1                     todo.push(q.next(i));
109 cananian 1.1.2.1             q.accept(v);
110 cananian 1.1.2.1         }
111 cananian 1.1.2.1         return newRoot;
112 cananian 1.1.2.1     }
113 cananian 1.1.2.1     static class Remover extends LowQuadVisitor {
114 cananian 1.1.2.1         Set done;
115 bdemsky  1.1.2.7         Map newtempmap;
116 bdemsky  1.1.2.7         public Remover(Set done, Map newtempmap) {
117 cananian 1.1.2.1             super(false/*non-strict*/);
118 bdemsky  1.1.2.7             this.done=done;
119 bdemsky  1.1.2.7             this.newtempmap=newtempmap;
120 bdemsky  1.1.2.7         }
121 cananian 1.1.2.5 
122 cananian 1.1.2.5 
123 cananian 1.1.2.5         private static Edge addAt(Edge e, Quad q) { return addAt(e, 0, q, 0); }
124 cananian 1.1.2.5         private static Edge addAt(Edge e,
125 cananian 1.1.2.5                                   int which_pred, Quad q, int which_succ) {
126 cananian 1.1.2.5             Quad frm = (Quad) e.from(); int frm_succ = e.which_succ();
127 cananian 1.1.2.5             Quad to  = (Quad) e.to();   int to_pred = e.which_pred();
128 cananian 1.1.2.5             Quad.addEdge(frm, frm_succ, q, which_pred);
129 cananian 1.1.2.5             Quad.addEdge(q, which_succ, to, to_pred);
130 cananian 1.1.2.5             return to.prevEdge(to_pred);
131 cananian 1.1.2.5         }
132 cananian 1.1.2.5         private Edge addMoveAt(Edge e, Quad source, Temp dst, Temp src)
133 cananian 1.1.2.5         {
134 cananian 1.1.2.5             MOVE m = new MOVE(source.getFactory(), source, dst, src);
135 cananian 1.1.2.5             done.add(m);
136 cananian 1.1.2.5             return addAt(e, m);
137 cananian 1.1.2.5         }
138 cananian 1.1.2.1         public void fixsigma(SIGMA q) {
139 cananian 1.1.2.1             for (int i=0;i<q.numSigmas();i++)
140 cananian 1.1.2.5                 for (int j=0;j<q.arity();j++)
141 cananian 1.1.2.5                     // XXX: can there be conflicts in sigma functions?
142 cananian 1.1.2.5                     addMoveAt(q.nextEdge(j), q, q.dst(i,j), q.src(i));
143 cananian 1.1.2.1         }
144 cananian 1.1.2.1         public void fixphi(PHI q) {
145 cananian 1.1.2.5             for (int i=0;i<q.numPhis();i++) {
146 cananian 1.1.2.5                 Temp Tt = new Temp(q.dst(i));
147 bdemsky  1.1.2.7                 newtempmap.put(Tt, q.dst(i));
148 cananian 1.1.2.5                 addMoveAt(q.nextEdge(0), q, q.dst(i), Tt);
149 cananian 1.1.2.5                 for (int j=0;j<q.arity();j++)
150 cananian 1.1.2.5                     addMoveAt(q.prevEdge(j), q, Tt, q.src(i, j));
151 cananian 1.1.2.5             }
152 cananian 1.1.2.1         }
153 cananian 1.1.2.1         public void visit(Quad q) {}
154 cananian 1.1.2.1         
155 cananian 1.1.2.1         public void visit(CALL q) {
156 cananian 1.1.2.1             fixsigma(q);
157 cananian 1.1.2.1             CALL nc= new CALL(q.getFactory(), q, q.method(), q.params(),
158 cananian 1.1.2.1                               q.retval(),
159 cananian 1.1.2.1                               q.retex(), q.isVirtual(), q.isTailCall(),
160 cananian 1.1.2.1                               new Temp[0]);
161 cananian 1.1.2.4             Quad.replace(q, nc);
162 cananian 1.1.2.1             done.add(nc);
163 cananian 1.1.2.1         }
164 cananian 1.1.2.1 
165 cananian 1.1.2.1         public void visit(PCALL q) {
166 cananian 1.1.2.1             fixsigma(q);
167 cananian 1.1.2.1             PCALL nc= new PCALL((LowQuadFactory)q.getFactory(), q, q.ptr(), 
168 cananian 1.1.2.1                                 q.params(),
169 cananian 1.1.2.1                                 q.retval(), q.retex(), new Temp[0],
170 cananian 1.1.2.1                                 q.isVirtual(), q.isTailCall());
171 cananian 1.1.2.4             Quad.replace(q, nc);
172 cananian 1.1.2.1             done.add(nc);
173 cananian 1.1.2.1         }
174 cananian 1.1.2.1 
175 cananian 1.1.2.1         public void visit(CJMP q) {
176 cananian 1.1.2.1             fixsigma(q);
177 cananian 1.1.2.1             CJMP nc= new CJMP(q.getFactory(), q,q.test(),
178 cananian 1.1.2.1                               new Temp[0]);
179 cananian 1.1.2.4             Quad.replace(q, nc);
180 cananian 1.1.2.1             done.add(nc);
181 cananian 1.1.2.1         }
182 cananian 1.1.2.1 
183 cananian 1.1.2.1         public void visit(SWITCH q) {
184 cananian 1.1.2.1             fixsigma(q);
185 cananian 1.1.2.1             SWITCH ns= new SWITCH(q.getFactory(), q, q.index(), q.keys(),
186 cananian 1.1.2.1                                   new Temp[0]);
187 cananian 1.1.2.4             Quad.replace(q, ns);
188 cananian 1.1.2.1             done.add(ns);
189 cananian 1.1.2.1         }
190 cananian 1.1.2.1 
191 cananian 1.1.2.1         public void visit(TYPESWITCH q) {
192 cananian 1.1.2.1             fixsigma(q);
193 cananian 1.1.2.1             TYPESWITCH nts = new TYPESWITCH(q.getFactory(), q, q.index(),
194 cananian 1.1.2.2                                             q.keys(), new Temp[0],
195 cananian 1.1.2.2                                             q.hasDefault());
196 cananian 1.1.2.1             Quad.replace(q, nts);
197 cananian 1.1.2.1             done.add(nts);
198 cananian 1.1.2.1         }
199 cananian 1.1.2.1 
200 cananian 1.1.2.1         public void visit(LABEL q) {
201 cananian 1.1.2.1             fixphi(q);
202 cananian 1.1.2.1             LABEL np=new LABEL(q.getFactory(),q,q.label(),
203 cananian 1.1.2.1                                new Temp[0], q.arity());
204 cananian 1.1.2.4             Quad.replace(q, np);
205 cananian 1.1.2.1             done.add(np);
206 cananian 1.1.2.1         }
207 cananian 1.1.2.1         public void visit(PHI q) {
208 cananian 1.1.2.1             fixphi(q);
209 cananian 1.1.2.1             PHI np=new PHI(q.getFactory(),q,new Temp[0], q.arity());
210 cananian 1.1.2.4             Quad.replace(q, np);
211 cananian 1.1.2.1             done.add(np);
212 cananian 1.1.2.1         }
213 cananian 1.1.2.1     }
214 cananian 1.1.2.1 }
215 cananian 1.2