1 cananian 1.2.2.2 // InMerge.java, created Sun Sep 13 22:49:21 1998 by cananian 2 cananian 1.2 // Copyright (C) 1998 C. Scott Ananian <cananian@alumni.princeton.edu> 3 cananian 1.2 // Licensed under the terms of the GNU GPL; see COPYING for details. 4 cananian 1.1 package harpoon.IR.Bytecode; 5 cananian 1.1 6 cananian 1.1 import harpoon.Util.Util; 7 cananian 1.1 /** 8 cananian 1.1 * <code>InMerge</code> is used to represent a node where 9 cananian 1.1 * multiple control flows merge. These are typically branch targets. 10 cananian 1.1 * An <code>InMerge</code> will have exactly one successor, and 11 cananian 1.1 * multiple predecessors. 12 cananian 1.1 * 13 cananian 1.2.2.3 * @author C. Scott Ananian <cananian@alumni.princeton.edu> 14 cananian 1.6 * @version $Id: InMerge.java,v 1.6 2002/04/10 03:04:37 cananian Exp $ 15 cananian 1.1 * @see Instr 16 cananian 1.1 */ 17 cananian 1.1 public class InMerge extends Instr { 18 cananian 1.1 int arity; 19 cananian 1.1 20 cananian 1.1 /** Creates a new <code>InMerge</code>. 21 cananian 1.1 * @param arity the number of predecessors this node will have. 22 cananian 1.1 */ 23 cananian 1.1 public InMerge(String sourcefile, int linenumber, int arity) { 24 cananian 1.1 super(sourcefile, linenumber); 25 cananian 1.1 this.arity = arity; 26 cananian 1.1 } 27 cananian 1.1 28 cananian 1.1 // Provide run-time checks on arity. 29 cananian 1.1 /** @see Instr#addPrev */ 30 cananian 1.1 void addPrev(Instr prev) { 31 cananian 1.1 if (this.prev.size()>=arity) throw new Error("Exceeding arity of MERGE."); 32 cananian 1.1 super.addPrev(prev); 33 cananian 1.1 } 34 cananian 1.1 /** @see Instr#addNext */ 35 cananian 1.1 void addNext(Instr next) { 36 cananian 1.1 if (this.next.size()>=1) 37 cananian 1.1 throw new Error("MERGE should have only one successor."); 38 cananian 1.1 super.addNext(next); 39 cananian 1.1 } 40 cananian 1.1 41 cananian 1.1 /** Return the number of predecessors of this node. 42 cananian 1.1 * Exactly equivalent to <code>prev().length</code> but slightly 43 cananian 1.1 * more efficient. 44 cananian 1.1 */ 45 cananian 1.3 public int arity() { 46 cananian 1.3 /* arity may be larger than this.prev.size() because of inputs 47 cananian 1.3 * from try handlers. */ 48 cananian 1.5.2.1 //assert arity==this.prev.size(); 49 cananian 1.3 return arity; 50 cananian 1.3 } 51 cananian 1.1 52 cananian 1.1 /** Return the java bytecode of this instruction. 53 cananian 1.1 * This function is required by the superclass, but not relevant 54 cananian 1.1 * to this function. It returns <code>Op.NOP</code>. 55 cananian 1.1 */ 56 cananian 1.1 public byte getOpcode() { return Op.NOP; } 57 cananian 1.1 58 cananian 1.1 59 cananian 1.1 /** Return human-readable representation. */ 60 cananian 1.1 public String toString() { return "MERGE/"+arity; } 61 cananian 1.1 }