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