1 cananian 1.1.2.1  // Stm.java, created Wed Jan 13 21:14:57 1999 by cananian
 2 cananian 1.1.2.10 // Copyright (C) 1998 C. Scott Ananian <cananian@alumni.princeton.edu>
 3 cananian 1.1.2.10 // Licensed under the terms of the GNU GPL; see COPYING for details.
 4 cananian 1.1.2.1  package harpoon.IR.Tree;
 5 cananian 1.1.2.1  
 6 cananian 1.1.2.15 import harpoon.ClassFile.HCodeElement;
 7 duncan   1.1.2.4  import harpoon.Temp.CloningTempMap;
 8 duncan   1.1.2.8  import harpoon.Util.Util;
 9 duncan   1.1.2.7  
10 duncan   1.1.2.11 import java.util.ArrayList;
11 cananian 1.1.2.12 import java.util.Collections;
12 duncan   1.1.2.8  import java.util.List;
13 duncan   1.1.2.8  import java.util.ListIterator;
14 duncan   1.1.2.7  import java.util.Set;
15 duncan   1.1.2.11 import java.util.Stack;
16 duncan   1.1.2.4  
17 cananian 1.1.2.1  /**
18 cananian 1.1.2.1   * <code>Stm</code> objects are statements which perform side effects and
19 cananian 1.1.2.1   * control flow.
20 cananian 1.1.2.1   * 
21 cananian 1.1.2.1   * @author  C. Scott Ananian <cananian@alumni.princeton.edu>, based on
22 cananian 1.1.2.1   *          <i>Modern Compiler Implementation in Java</i> by Andrew Appel.
23 cananian 1.3       * @version $Id: Stm.java,v 1.3 2002/04/10 03:05:45 cananian Exp $
24 cananian 1.1.2.1   */
25 cananian 1.1.2.3  abstract public class Stm extends Tree {
26 cananian 1.1.2.15     protected Stm(TreeFactory tf, HCodeElement source, int arity) {
27 cananian 1.1.2.15         super(tf, source, arity);
28 duncan   1.1.2.7      }
29 cananian 1.1.2.3  
30 cananian 1.1.2.1      /** Build an <code>Stm</code> of this type from the given list of
31 cananian 1.1.2.1       *  subexpressions. */
32 cananian 1.1.2.15     public final Stm build(ExpList kids) { return build(this.tf, kids); }
33 duncan   1.1.2.9      abstract public Stm build(TreeFactory tf, ExpList kids);
34 duncan   1.1.2.13     
35 duncan   1.1.2.8      /** Returns a tree-based representation of <code>list</code>.  
36 duncan   1.1.2.8       *
37 duncan   1.1.2.8       * <br><b>Requires:</b> foreach element, <code>l</code>, of 
38 duncan   1.1.2.9       *                      <code>list</code>, 
39 duncan   1.1.2.9       *                      <code>(l != null) && (l instanceof Stm)</code>.
40 duncan   1.1.2.8       * <br><b>Modifies:</b>
41 duncan   1.1.2.8       * <br><b>Effects: </b> returns a tree-based representation of 
42 duncan   1.1.2.8       *                      <code>list</code>.  If <code>list</code> is null,
43 duncan   1.1.2.8       *                      returns null.  
44 duncan   1.1.2.8       */
45 cananian 1.2.2.1      public static Stm toStm(List<Stm> list) { 
46 duncan   1.1.2.8          if (list==null) return null;
47 duncan   1.1.2.8          int size = list.size();
48 duncan   1.1.2.8          if      (size==0) { return null; }
49 cananian 1.2.2.1          else if (size==1) { return list.get(0); } 
50 cananian 1.1.2.19         else { // divide and conquer
51 cananian 1.2.2.1              Stm          hce = list.get(0); 
52 duncan   1.1.2.8              TreeFactory  tf  = hce.getFactory();
53 cananian 1.1.2.19             return new SEQ(tf,hce,
54 cananian 1.1.2.19                            toStm(list.subList(0,size/2)),
55 cananian 1.1.2.19                            toStm(list.subList(size/2,list.size())));
56 duncan   1.1.2.8          }               
57 duncan   1.1.2.11     }
58 duncan   1.1.2.11 
59 duncan   1.1.2.11     /**
60 duncan   1.1.2.11      * Returns a <code>Stm</code> such that all <code>SEQ</code> objects
61 duncan   1.1.2.11      * contained within the <code>Stm</code> object are on the top level.
62 duncan   1.1.2.11      */
63 duncan   1.1.2.11     public static Stm linearize(Stm stm) { 
64 duncan   1.1.2.11         List  l = new ArrayList();
65 duncan   1.1.2.11         Stack s = new Stack();
66 duncan   1.1.2.11         s.push(stm);
67 duncan   1.1.2.11 
68 duncan   1.1.2.11         while (!s.isEmpty()) { 
69 duncan   1.1.2.11             Stm next = (Stm)s.pop();
70 duncan   1.1.2.11             if (next.kind() == TreeKind.SEQ) { 
71 duncan   1.1.2.11                 SEQ seq = (SEQ)next; 
72 duncan   1.1.2.14                 s.push(seq.getRight());
73 duncan   1.1.2.14                 s.push(seq.getLeft());
74 duncan   1.1.2.11             } 
75 duncan   1.1.2.11             else { 
76 duncan   1.1.2.11                 l.add(next);
77 duncan   1.1.2.11             } 
78 duncan   1.1.2.11         }
79 duncan   1.1.2.11         return toStm(l);
80 duncan   1.1.2.11     }
81 duncan   1.1.2.11 
82 duncan   1.1.2.11     /** 
83 duncan   1.1.2.11      * Returns true if <code>stm</code> has no effect. 
84 duncan   1.1.2.11      */
85 duncan   1.1.2.11     public static boolean isNop(Stm stm) { 
86 jwhaley  1.1.2.18         return (stm.kind()==TreeKind.EXPR) && 
87 jwhaley  1.1.2.18             ((((EXPR)stm).getExp()).kind()==TreeKind.CONST);
88 duncan   1.1.2.8      }
89 cananian 1.1.2.1  }
90 cananian 1.2