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     }