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