1 bdemsky 1.1.2.1 // ThreadInliner.java, created Mon Jun 12 13:38:59 2000 by root 2 cananian 1.1.2.4 // Copyright (C) 2000 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.IR.Quads; 5 bdemsky 1.1.2.1 6 bdemsky 1.1.2.1 7 bdemsky 1.1.2.2 import harpoon.Analysis.Maps.AllocationInformation; 8 bdemsky 1.1.2.2 import harpoon.Analysis.AllocationInformationMap; 9 bdemsky 1.1.2.2 10 bdemsky 1.1.2.1 import harpoon.ClassFile.HCode; 11 cananian 1.1.2.3 import harpoon.ClassFile.HCodeAndMaps; 12 bdemsky 1.1.2.1 import harpoon.ClassFile.HCodeFactory; 13 bdemsky 1.1.2.1 import harpoon.ClassFile.HClass; 14 bdemsky 1.1.2.1 import harpoon.ClassFile.HMethod; 15 bdemsky 1.1.2.1 import harpoon.Temp.TempMap; 16 cananian 1.1.2.3 import harpoon.Util.Util; 17 bdemsky 1.1.2.1 import java.util.Map; 18 bdemsky 1.1.2.1 import java.util.Set; 19 bdemsky 1.1.2.1 import java.util.Iterator; 20 bdemsky 1.1.2.1 21 bdemsky 1.1.2.1 22 bdemsky 1.1.2.1 /** 23 bdemsky 1.1.2.1 * <code>ThreadInliner</code> 24 bdemsky 1.1.2.1 * 25 cananian 1.1.2.4 * @author Brian Demsky <bdemsky@mit.edu> 26 cananian 1.4 * @version $Id: ThreadInliner.java,v 1.4 2002/04/10 03:05:19 cananian Exp $ 27 bdemsky 1.1.2.1 */ 28 bdemsky 1.1.2.1 public class ThreadInliner { 29 bdemsky 1.1.2.1 /** Creates a <code>ThreadInliner</code>. */ 30 bdemsky 1.1.2.1 31 bdemsky 1.1.2.1 /** Returns a <code>HCodeFactory</code> that uses <code>LoopOptimize</code>. */ 32 bdemsky 1.1.2.1 public static HCodeFactory codeFactory(final HCodeFactory parent, final Set startset, final Set joinset) { 33 bdemsky 1.1.2.1 return new HCodeFactory() { 34 bdemsky 1.1.2.1 public HCode convert(HMethod m) { 35 bdemsky 1.1.2.1 HCode hc = parent.convert(m); 36 bdemsky 1.1.2.1 if (hc!=null) { 37 bdemsky 1.1.2.1 return makeswaps(hc,startset,joinset); 38 bdemsky 1.1.2.1 } else 39 bdemsky 1.1.2.1 return hc; 40 bdemsky 1.1.2.1 } 41 bdemsky 1.1.2.1 public String getCodeName() { return parent.getCodeName(); } 42 bdemsky 1.1.2.1 public void clear(HMethod m) { parent.clear(m); } 43 bdemsky 1.1.2.1 }; 44 bdemsky 1.1.2.1 } 45 bdemsky 1.1.2.1 46 bdemsky 1.1.2.1 public static HCode makeswaps(HCode hc,final Set startset,final Set joinset) { 47 cananian 1.1.2.3 HCodeAndMaps hcam = null; 48 cananian 1.1.2.3 try /* I hate having to explicitly check this exception */ 49 cananian 1.1.2.3 { hcam = hc.clone(hc.getMethod()); } 50 cananian 1.3.2.1 catch (CloneNotSupportedException ex) { assert false : ex; } 51 cananian 1.1.2.3 QuadNoSSA qns = (QuadNoSSA) hcam.hcode(); 52 cananian 1.1.2.3 Map quadMap = hcam.elementMap(); 53 cananian 1.1.2.3 TempMap tempMap = hcam.tempMap(); 54 cananian 1.1.2.3 55 bdemsky 1.1.2.2 AllocationInformation old=((Code)hc).getAllocationInformation(); 56 bdemsky 1.1.2.2 AllocationInformationMap newai=new AllocationInformationMap(); 57 bdemsky 1.1.2.2 if (old!=null) 58 bdemsky 1.1.2.2 qns.setAllocationInformation(newai); 59 bdemsky 1.1.2.1 Iterator it=hc.getElementsI(); 60 bdemsky 1.1.2.1 while (it.hasNext()) { 61 bdemsky 1.1.2.1 Quad qd=(Quad)it.next(); 62 bdemsky 1.1.2.1 if (startset.contains(qd)) { 63 bdemsky 1.1.2.1 CALL ctoswap=(CALL)quadMap.get(qd); 64 bdemsky 1.1.2.1 CALL newcall=new CALL(ctoswap.getFactory(),ctoswap, 65 bdemsky 1.1.2.1 ctoswap.method().getDeclaringClass().getMethod("run",new HClass[0]), 66 bdemsky 1.1.2.1 ctoswap.params(), ctoswap.retval(), 67 bdemsky 1.1.2.1 ctoswap.retex(), ctoswap.isVirtual(), 68 bdemsky 1.1.2.1 ctoswap.isTailCall(),ctoswap.dst(), 69 bdemsky 1.1.2.1 ctoswap.src()); 70 bdemsky 1.1.2.1 Quad.replace(ctoswap, newcall); 71 bdemsky 1.1.2.1 } else if (joinset.contains(qd)) { 72 bdemsky 1.1.2.1 CALL ctoswap=(CALL)quadMap.get(qd); 73 bdemsky 1.1.2.1 CALL newcall=new CALL(ctoswap.getFactory(),ctoswap, 74 bdemsky 1.1.2.2 ctoswap.method().getDeclaringClass().getMethod("joinreplace",new HClass[0]), 75 bdemsky 1.1.2.1 ctoswap.params(), ctoswap.retval(), 76 bdemsky 1.1.2.1 ctoswap.retex(), ctoswap.isVirtual(), 77 bdemsky 1.1.2.1 ctoswap.isTailCall(),ctoswap.dst(), 78 bdemsky 1.1.2.1 ctoswap.src()); 79 bdemsky 1.1.2.1 Quad.replace(ctoswap, newcall); 80 bdemsky 1.1.2.2 } else if ((old!=null)&&((qd instanceof NEW)||(qd instanceof ANEW))&&old.query(qd)!=null) { 81 bdemsky 1.1.2.2 newai.transfer((Quad)quadMap.get(qd),qd,tempMap, 82 bdemsky 1.1.2.2 old); 83 bdemsky 1.1.2.1 } 84 bdemsky 1.1.2.1 } 85 bdemsky 1.1.2.1 return qns; 86 bdemsky 1.1.2.1 } 87 cananian 1.2 }