1 cananian 1.1.2.1 // XI.java, created Thu May  6 00:13:40 1999 by cananian
  2 cananian 1.1.2.1 // Copyright (C) 1999 C. Scott Ananian <cananian@alumni.princeton.edu>
  3 cananian 1.1.2.1 // Licensed under the terms of the GNU GPL; see COPYING for details.
  4 cananian 1.1.2.1 package harpoon.IR.Quads;
  5 cananian 1.1.2.1 
  6 cananian 1.1.2.1 import harpoon.ClassFile.HCodeElement;
  7 cananian 1.1.2.1 import harpoon.Temp.Temp;
  8 cananian 1.1.2.1 import harpoon.Temp.TempMap;
  9 cananian 1.1.2.1 import harpoon.Util.Util;
 10 cananian 1.1.2.1 
 11 cananian 1.1.2.1 /**
 12 cananian 1.1.2.1  * <code>XI</code> objects represent phi functions prefixed by a xi
 13 cananian 1.1.2.1  * function.
 14 cananian 1.1.2.1  * 
 15 cananian 1.1.2.1  * @author  C. Scott Ananian <cananian@alumni.princeton.edu>
 16 cananian 1.5      * @version $Id: XI.java,v 1.5 2002/04/11 04:00:35 cananian Exp $
 17 cananian 1.1.2.1  */
 18 cananian 1.1.2.3 class XI extends PHI {
 19 cananian 1.1.2.1     protected Temp invariantDst[];
 20 cananian 1.1.2.1     protected Temp invariantSrc[];
 21 cananian 1.1.2.1     protected Temp backedgeDst[];
 22 cananian 1.1.2.1     protected Temp backedgeSrc[];
 23 cananian 1.1.2.1     
 24 cananian 1.1.2.1     /** Creates a <code>XI</code> object representing a xi function
 25 cananian 1.1.2.1      *  prefixing a block of phi functions.
 26 cananian 1.1.2.1      * @param invariantDst
 27 cananian 1.1.2.1      *        outgoing loop invariants.
 28 cananian 1.1.2.1      * @param invariantSrc
 29 cananian 1.1.2.1      *        incoming loop invariants.
 30 cananian 1.1.2.1      * @param backedgeDst
 31 cananian 1.1.2.1      *        outgoing backedge loop variables.
 32 cananian 1.1.2.1      * @param backedgeSrc
 33 cananian 1.1.2.1      *        incoming backedge loop variables.
 34 cananian 1.1.2.1      * @param phiDst
 35 cananian 1.1.2.1      *        the left hand sides of a phi function assignment block.
 36 cananian 1.1.2.1      * @param phiSrc
 37 cananian 1.1.2.1      *        the phi function parameters in a phi function assignment block.
 38 cananian 1.1.2.1      */
 39 cananian 1.1.2.1     public XI(QuadFactory qf, HCodeElement source,
 40 cananian 1.1.2.1               Temp invariantDst[], Temp invariantSrc[],
 41 cananian 1.1.2.1               Temp backedgeDst[], Temp backedgeSrc[],
 42 cananian 1.1.2.1               Temp phiDst[], Temp phiSrc[][], int arity) {
 43 cananian 1.1.2.1         super(qf, source, phiDst, phiSrc, arity);
 44 cananian 1.1.2.1         this.invariantDst = invariantDst;
 45 cananian 1.1.2.1         this.invariantSrc = invariantSrc;
 46 cananian 1.1.2.1         this.backedgeDst  = backedgeDst;
 47 cananian 1.1.2.1         this.backedgeSrc  = backedgeSrc;
 48 cananian 1.1.2.1         // VERIFY legality of XI function.
 49 cananian 1.3.2.1         assert invariantDst!=null && invariantSrc!=null;
 50 cananian 1.3.2.1         assert backedgeDst !=null && backedgeSrc !=null;
 51 cananian 1.3.2.1         assert invariantDst.length == invariantSrc.length;
 52 cananian 1.3.2.1         assert backedgeDst.length  == backedgeSrc.length;
 53 cananian 1.1.2.1     }
 54 cananian 1.1.2.1     public Temp[] invariantDst()
 55 cananian 1.1.2.1     { return (Temp[]) Util.safeCopy(Temp.arrayFactory, invariantDst); }
 56 cananian 1.1.2.1     public Temp[] invariantSrc()
 57 cananian 1.1.2.1     { return (Temp[]) Util.safeCopy(Temp.arrayFactory, invariantSrc); }
 58 cananian 1.1.2.1     public Temp[] backedgeDst()
 59 cananian 1.1.2.1     { return (Temp[]) Util.safeCopy(Temp.arrayFactory, backedgeDst); }
 60 cananian 1.1.2.1     public Temp[] backedgeSrc()
 61 cananian 1.1.2.1     { return (Temp[]) Util.safeCopy(Temp.arrayFactory, backedgeSrc); }
 62 cananian 1.1.2.1 
 63 cananian 1.1.2.1     public Temp[] use() {
 64 cananian 1.1.2.1         Temp[] phiUse = super.use();
 65 cananian 1.1.2.1         Temp[] u = new Temp[phiUse.length + invariantSrc.length +
 66 cananian 1.1.2.1                            backedgeSrc.length];
 67 cananian 1.1.2.1         int j=0;
 68 cananian 1.1.2.1         for (int i=0; i<phiUse.length; i++)
 69 cananian 1.1.2.1             u[j++] = phiUse[i];
 70 cananian 1.1.2.1         for (int i=0; i<invariantSrc.length; i++)
 71 cananian 1.1.2.1             u[j++] = invariantSrc[i];
 72 cananian 1.1.2.1         for (int i=0; i<backedgeSrc.length; i++)
 73 cananian 1.1.2.1             u[j++] = backedgeSrc[i];
 74 cananian 1.1.2.1         return u;
 75 cananian 1.1.2.1     }
 76 cananian 1.1.2.1     public Temp[] def() {
 77 cananian 1.1.2.1         Temp[] phiDef = super.def();
 78 cananian 1.1.2.1         Temp[] u = new Temp[phiDef.length + invariantDst.length +
 79 cananian 1.1.2.1                            backedgeDst.length];
 80 cananian 1.1.2.1         int j=0;
 81 cananian 1.1.2.1         for (int i=0; i<phiDef.length; i++)
 82 cananian 1.1.2.1             u[j++] = phiDef[i];
 83 cananian 1.1.2.1         for (int i=0; i<invariantDst.length; i++)
 84 cananian 1.1.2.1             u[j++] = invariantDst[i];
 85 cananian 1.1.2.1         for (int i=0; i<backedgeDst.length; i++)
 86 cananian 1.1.2.1             u[j++] = backedgeDst[i];
 87 cananian 1.1.2.1         return u;
 88 cananian 1.1.2.1     }
 89 cananian 1.1.2.1 
 90 cananian 1.1.2.1     public int kind() { return QuadKind.XI; }
 91 cananian 1.1.2.1 
 92 cananian 1.1.2.1     public Quad rename(QuadFactory qqf, TempMap defMap, TempMap useMap) {
 93 cananian 1.1.2.1         return new XI(qqf, this,
 94 cananian 1.1.2.1                       map(defMap,invariantDst), map(useMap,invariantSrc),
 95 cananian 1.1.2.1                       map(defMap,backedgeDst),  map(useMap,backedgeSrc),
 96 cananian 1.1.2.1                       map(defMap,/*phi*/dst),   map(useMap,/*phi*/src),
 97 cananian 1.1.2.1                       arity());
 98 cananian 1.1.2.1     }
 99 cananian 1.3.2.1     void renameUses(TempMap tm) { assert false; }
100 cananian 1.3.2.1     void renameDefs(TempMap tm) { assert false; }
101 cananian 1.1.2.1 
102 cananian 1.1.2.2     public void accept(QuadVisitor v) { v.visit(this); }
103 cananian 1.5         public <T> T accept(QuadValueVisitor<T> v) { return v.visit(this); }
104 cananian 1.1.2.1 
105 cananian 1.1.2.1     public String toString() {
106 cananian 1.1.2.1         StringBuffer sb = new StringBuffer();
107 cananian 1.1.2.1         sb.append("[<");
108 cananian 1.1.2.1         for (int i=0; i<invariantDst.length; i++) {
109 cananian 1.1.2.1             sb.append(invariantDst[i].toString());
110 cananian 1.1.2.1             if (i < invariantDst.length-1) sb.append(",");
111 cananian 1.1.2.1         }
112 cananian 1.1.2.1         sb.append(">, <");
113 cananian 1.1.2.1         for (int i=0; i<backedgeDst.length; i++) {
114 cananian 1.1.2.1             sb.append(backedgeDst[i].toString());
115 cananian 1.1.2.1             if (i < backedgeDst.length-1) sb.append(",");
116 cananian 1.1.2.1         }
117 cananian 1.1.2.1         sb.append(">] = XI([<");
118 cananian 1.1.2.1         for (int i=0; i<invariantSrc.length; i++) {
119 cananian 1.1.2.1             sb.append(invariantSrc[i].toString());
120 cananian 1.1.2.1             if (i < invariantSrc.length-1) sb.append(",");
121 cananian 1.1.2.1         }
122 cananian 1.1.2.1         sb.append(">, <");
123 cananian 1.1.2.1         for (int i=0; i<backedgeSrc.length; i++) {
124 cananian 1.1.2.1             sb.append(backedgeSrc[i].toString());
125 cananian 1.1.2.1             if (i < backedgeSrc.length-1) sb.append(",");
126 cananian 1.1.2.1         }
127 cananian 1.1.2.1         sb.append(">]) / ");
128 cananian 1.1.2.1         sb.append(super.toString());
129 cananian 1.1.2.1         return sb.toString();
130 cananian 1.1.2.1     }
131 cananian 1.2     }