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 }