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     }