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