1 cananian 1.1.2.8 // OptimizedTreeCode.java, created Thu Jul 8 2:43:29 1999 by duncan 2 cananian 1.1.2.7 // Copyright (C) 1998 Duncan Bryce <duncan@lcs.mit.edu> 3 cananian 1.1.2.7 // Licensed under the terms of the GNU GPL; see COPYING for details. 4 duncan 1.1.2.1 package harpoon.IR.Tree; 5 duncan 1.1.2.1 6 duncan 1.1.2.1 import harpoon.Backend.Generic.Frame; 7 duncan 1.1.2.1 import harpoon.ClassFile.HClass; 8 duncan 1.1.2.1 import harpoon.ClassFile.HCode; 9 cananian 1.1.2.21 import harpoon.ClassFile.HCodeAndMaps; 10 duncan 1.1.2.1 import harpoon.ClassFile.HCodeElement; 11 duncan 1.1.2.1 import harpoon.ClassFile.HCodeFactory; 12 duncan 1.1.2.1 import harpoon.ClassFile.HMethod; 13 duncan 1.1.2.3 import harpoon.IR.Tree.Stm; 14 duncan 1.1.2.1 import harpoon.Temp.CloningTempMap; 15 duncan 1.1.2.1 import harpoon.Temp.Temp; 16 duncan 1.1.2.1 import harpoon.Util.Util; 17 duncan 1.1.2.1 18 duncan 1.1.2.1 /** 19 duncan 1.1.2.1 * The <code>OptimizedTreeCode</code> codeview is an optimized, 20 duncan 1.1.2.1 * canonical representation of Tree form. It provides a code factory 21 duncan 1.1.2.1 * that will generate tree code optimized with a set of standard passes, 22 duncan 1.1.2.1 * and a code factory that allows for specifying your own set of optimization 23 duncan 1.1.2.1 * passes. 24 duncan 1.1.2.1 * 25 duncan 1.1.2.1 * @author Duncan Bryce <duncan@lcs.mit.edu> 26 cananian 1.4 * @version $Id: OptimizedTreeCode.java,v 1.4 2003/03/11 17:24:56 cananian Exp $ 27 duncan 1.1.2.1 */ 28 duncan 1.1.2.1 public class OptimizedTreeCode extends Code { 29 duncan 1.1.2.10 public static final String codename = CanonicalTreeCode.codename; 30 duncan 1.1.2.1 private static final TreeOptimizer[] standard_opts = { 31 duncan 1.1.2.1 // Add all standard optimization passes here 32 duncan 1.1.2.14 /* new TreeOptimizer() { 33 duncan 1.1.2.3 public CanonicalTreeCode optimize(CanonicalTreeCode code) { 34 duncan 1.1.2.3 code = (CanonicalTreeCode)code.clone 35 duncan 1.1.2.3 (code.getMethod(), code.getFrame()); 36 duncan 1.1.2.3 return (CanonicalTreeCode)new TreeFolding(code).fold(); 37 duncan 1.1.2.3 } 38 duncan 1.1.2.14 }*/ 39 duncan 1.1.2.1 }; 40 cananian 1.1.2.20 private final TreeDerivation treeDerivation; 41 duncan 1.1.2.1 42 duncan 1.1.2.1 /** Create a new <code>OptimizedTreeCode</code> from a 43 duncan 1.1.2.1 * <code>CanonicalTreeCode</code> object, a <code>Frame</code>, 44 duncan 1.1.2.1 * and a set of optimizations to perform. 45 duncan 1.1.2.1 */ 46 cananian 1.2.2.1 OptimizedTreeCode(CanonicalTreeCode code, final Frame frame, 47 duncan 1.1.2.1 final TreeOptimizer[] topts) { 48 duncan 1.1.2.1 super(code.getMethod(), null, frame); 49 duncan 1.1.2.1 50 duncan 1.1.2.3 /* Optimize "code" */ 51 duncan 1.1.2.3 for (int i=0; i<topts.length; i++) { 52 duncan 1.1.2.3 code = topts[i].optimize(code); 53 duncan 1.1.2.3 } 54 duncan 1.1.2.3 final CanonicalTreeCode optimizedCode = code; 55 duncan 1.1.2.3 56 cananian 1.1.2.18 this.treeDerivation = optimizedCode.getTreeDerivation(); 57 duncan 1.1.2.9 this.tree = (Stm)optimizedCode.getRootElement(); 58 duncan 1.1.2.3 59 duncan 1.1.2.1 } 60 duncan 1.1.2.1 61 cananian 1.1.2.20 // copy constructor; should be only called by the clone() method. 62 cananian 1.1.2.20 private OptimizedTreeCode(HMethod newMethod, Tree tree, Frame frame, 63 cananian 1.1.2.20 TreeDerivation treeDerivation) { 64 duncan 1.1.2.1 super(newMethod, tree, frame); 65 cananian 1.1.2.20 this.treeDerivation = treeDerivation; 66 duncan 1.1.2.3 } 67 duncan 1.1.2.3 68 duncan 1.1.2.3 /** 69 duncan 1.1.2.3 * Clone this code representation. The clone has its own 70 duncan 1.1.2.3 * copy of the tree structure. 71 duncan 1.1.2.3 */ 72 cananian 1.4 public HCodeAndMaps<Tree> clone(HMethod newMethod, Frame frame) { 73 cananian 1.1.2.20 DerivationGenerator dg = 74 cananian 1.1.2.20 (getTreeDerivation()==null) ? null : new DerivationGenerator(); 75 cananian 1.1.2.20 OptimizedTreeCode tc = new OptimizedTreeCode(newMethod,null,frame,dg); 76 cananian 1.1.2.21 return cloneHelper(tc, dg); 77 duncan 1.1.2.1 } 78 duncan 1.1.2.1 79 duncan 1.1.2.1 /** 80 duncan 1.1.2.1 * Return the name of this code view. 81 duncan 1.1.2.1 * @return the string <code>"canonical-tree"</code>. 82 duncan 1.1.2.1 */ 83 duncan 1.1.2.1 public String getName() { return codename; } 84 duncan 1.1.2.1 85 duncan 1.1.2.1 /** @return true */ 86 duncan 1.1.2.1 public boolean isCanonical() { return true; } 87 duncan 1.1.2.1 88 duncan 1.1.2.1 89 duncan 1.1.2.1 /** 90 duncan 1.1.2.1 * Return a code factory for <code>OptimizedTreeCode</code>, given a 91 duncan 1.1.2.1 * code factory for <code>CanonicalTreeCode</code>. This code factory 92 duncan 1.1.2.1 * performs a standard set of optimizations on the 93 duncan 1.1.2.1 * <code>CanonicalTreeCode</code>. 94 duncan 1.1.2.1 */ 95 duncan 1.1.2.1 public static HCodeFactory codeFactory(final HCodeFactory hcf, 96 duncan 1.1.2.1 final Frame frame) { 97 duncan 1.1.2.1 return codeFactory(hcf, frame, standard_opts); 98 duncan 1.1.2.1 } 99 duncan 1.1.2.1 100 duncan 1.1.2.1 /** 101 duncan 1.1.2.1 * Return a code factory for <code>OptimizedTreeCode</code>, given a 102 duncan 1.1.2.1 * code factory for <code>CanonicalTreeCode</code>, a <code>Frame</code>, 103 duncan 1.1.2.1 * and a set of optimizations to perform. 104 duncan 1.1.2.1 */ 105 duncan 1.1.2.1 public static HCodeFactory codeFactory(final HCodeFactory hcf, 106 duncan 1.1.2.1 final Frame frame, 107 duncan 1.1.2.1 final TreeOptimizer[] topts) { 108 duncan 1.1.2.1 if (hcf.getCodeName().equals(CanonicalTreeCode.codename)) { 109 duncan 1.1.2.1 return new HCodeFactory() { 110 duncan 1.1.2.1 public HCode convert(HMethod m) { 111 duncan 1.1.2.1 HCode c = hcf.convert(m); 112 duncan 1.1.2.1 return (c==null) ? null : 113 duncan 1.1.2.1 new OptimizedTreeCode 114 duncan 1.1.2.1 ((CanonicalTreeCode)c, frame, topts); 115 duncan 1.1.2.1 } 116 duncan 1.1.2.1 public void clear(HMethod m) { hcf.clear(m); } 117 duncan 1.1.2.1 public String getCodeName() { return codename; } 118 duncan 1.1.2.1 }; 119 duncan 1.1.2.1 } 120 duncan 1.1.2.1 else 121 duncan 1.1.2.1 throw new Error("don't know how to make " + codename + 122 duncan 1.1.2.1 " from " + hcf.getCodeName()); 123 duncan 1.1.2.1 } 124 duncan 1.1.2.1 125 duncan 1.1.2.1 /** 126 duncan 1.1.2.1 * Return a code factory for <code>LowQuadNoSSA</code>, using the default 127 duncan 1.1.2.1 * code factory for <code>LowQuadNoSSA</code> 128 duncan 1.1.2.1 */ 129 duncan 1.1.2.1 public static HCodeFactory codeFactory(final Frame frame) { 130 duncan 1.1.2.1 return codeFactory(CanonicalTreeCode.codeFactory(frame), frame); 131 duncan 1.1.2.1 } 132 duncan 1.1.2.1 133 cananian 1.1.2.18 public TreeDerivation getTreeDerivation() { return treeDerivation; } 134 duncan 1.1.2.1 135 duncan 1.1.2.1 public interface TreeOptimizer { 136 duncan 1.1.2.3 public CanonicalTreeCode optimize(CanonicalTreeCode code); 137 duncan 1.1.2.1 } 138 duncan 1.1.2.1 } 139 duncan 1.1.2.1 140 duncan 1.1.2.1 141 duncan 1.1.2.1 142 duncan 1.1.2.1 143 duncan 1.1.2.1 144 duncan 1.1.2.1 145 duncan 1.1.2.1 146 duncan 1.1.2.1 147 duncan 1.1.2.1 148 cananian 1.2