at.dms.kjc.sir.linear
Class LinearRedundancyReplacer

java.lang.Object
  extended by at.dms.kjc.sir.EmptyStreamVisitor
      extended by at.dms.kjc.sir.linear.LinearReplacer
          extended by at.dms.kjc.sir.linear.LinearRedundancyReplacer
All Implemented Interfaces:
Constants, StreamVisitor

public class LinearRedundancyReplacer
extends LinearReplacer
implements Constants

Generates replacement filter code using the information within a LinearRedundancyAnalyzer to generate filters with less computational requirements. Refer to the documentation in LinearRedundancy for more information.
$Id: LinearRedundancyReplacer.java,v 1.17 2006/09/25 13:54:42 dimock Exp $


Field Summary
static String INDEX_POSTFIX
          The postfix to use for the index variable.
static int INITWORK
          The constant to signify that we are making the init work function (and not work).
static String STATE_FIELD_PREFIX
          The prefix to use to name fields.
static int WORK
          The constant to signify that we are making a work function (and not init work).
 
Fields inherited from interface at.dms.kjc.Constants
CMP_VERSION, JAV_CLASS, JAV_CLONE, JAV_CLONEABLE, JAV_CONSTRUCTOR, JAV_ERROR, JAV_EXCEPTION, JAV_INIT, JAV_LENGTH, JAV_NAME_SEPARATOR, JAV_OBJECT, JAV_OUTER_THIS, JAV_RUNTIME, JAV_RUNTIME_EXCEPTION, JAV_STATIC_INIT, JAV_STRING, JAV_STRINGBUFFER, JAV_THIS, JAV_THROWABLE, OPE_BAND, OPE_BNOT, OPE_BOR, OPE_BSR, OPE_BXOR, OPE_EQ, OPE_GE, OPE_GT, OPE_LE, OPE_LNOT, OPE_LT, OPE_MINUS, OPE_NE, OPE_PERCENT, OPE_PLUS, OPE_POSTDEC, OPE_POSTINC, OPE_PREDEC, OPE_PREINC, OPE_SIMPLE, OPE_SL, OPE_SLASH, OPE_SR, OPE_STAR, TID_ARRAY, TID_BIT, TID_BOOLEAN, TID_BYTE, TID_CHAR, TID_CLASS, TID_DOUBLE, TID_FLOAT, TID_INT, TID_LONG, TID_SHORT, TID_VECTOR, TID_VOID, VECTOR_EMPTY
 
Fields inherited from interface at.dms.classfile.Constants
ACC_ABSTRACT, ACC_FINAL, ACC_INLINE, ACC_INTERFACE, ACC_NATIVE, ACC_PRIVATE, ACC_PROTECTED, ACC_PUBLIC, ACC_STATIC, ACC_STRICT, ACC_SUPER, ACC_SYNCHRONIZED, ACC_TRANSIENT, ACC_VOLATILE, ATT_CODE, ATT_CONSTANTVALUE, ATT_DEPRECATED, ATT_EXCEPTIONS, ATT_GENERIC, ATT_INNERCLASSES, ATT_LINENUMBERTABLE, ATT_LOCALVARIABLETABLE, ATT_SOURCEFILE, ATT_SYNTHETIC, CST_CLASS, CST_DOUBLE, CST_FIELD, CST_FLOAT, CST_INTEGER, CST_INTERFACEMETHOD, CST_LONG, CST_METHOD, CST_NAMEANDTYPE, CST_STRING, CST_UTF8, ENV_DEBUG_MODE, ENV_USE_CACHE, JAVA_MAGIC, JAVA_MAJOR, JAVA_MINOR, MAX_CODE_PER_METHOD, opc_aaload, opc_aastore, opc_aconst_null, opc_aload, opc_aload_0, opc_aload_1, opc_aload_2, opc_aload_3, opc_anewarray, opc_areturn, opc_arraylength, opc_astore, opc_astore_0, opc_astore_1, opc_astore_2, opc_astore_3, opc_athrow, opc_baload, opc_bastore, opc_bipush, opc_caload, opc_castore, opc_checkcast, opc_d2f, opc_d2i, opc_d2l, opc_dadd, opc_daload, opc_dastore, opc_dcmpg, opc_dcmpl, opc_dconst_0, opc_dconst_1, opc_ddiv, opc_dload, opc_dload_0, opc_dload_1, opc_dload_2, opc_dload_3, opc_dmul, opc_dneg, opc_drem, opc_dreturn, opc_dstore, opc_dstore_0, opc_dstore_1, opc_dstore_2, opc_dstore_3, opc_dsub, opc_dup, opc_dup_x1, opc_dup_x2, opc_dup2, opc_dup2_x1, opc_dup2_x2, opc_f2d, opc_f2i, opc_f2l, opc_fadd, opc_faload, opc_fastore, opc_fcmpg, opc_fcmpl, opc_fconst_0, opc_fconst_1, opc_fconst_2, opc_fdiv, opc_fload, opc_fload_0, opc_fload_1, opc_fload_2, opc_fload_3, opc_fmul, opc_fneg, opc_frem, opc_freturn, opc_fstore, opc_fstore_0, opc_fstore_1, opc_fstore_2, opc_fstore_3, opc_fsub, opc_getfield, opc_getstatic, opc_goto, opc_goto_w, opc_i2b, opc_i2c, opc_i2d, opc_i2f, opc_i2l, opc_i2s, opc_iadd, opc_iaload, opc_iand, opc_iastore, opc_iconst_0, opc_iconst_1, opc_iconst_2, opc_iconst_3, opc_iconst_4, opc_iconst_5, opc_iconst_m1, opc_idiv, opc_if_acmpeq, opc_if_acmpne, opc_if_icmpeq, opc_if_icmpge, opc_if_icmpgt, opc_if_icmple, opc_if_icmplt, opc_if_icmpne, opc_ifeq, opc_ifge, opc_ifgt, opc_ifle, opc_iflt, opc_ifne, opc_ifnonnull, opc_ifnull, opc_iinc, opc_iload, opc_iload_0, opc_iload_1, opc_iload_2, opc_iload_3, opc_imul, opc_ineg, opc_instanceof, opc_invokeinterface, opc_invokespecial, opc_invokestatic, opc_invokevirtual, opc_ior, opc_irem, opc_ireturn, opc_ishl, opc_ishr, opc_istore, opc_istore_0, opc_istore_1, opc_istore_2, opc_istore_3, opc_isub, opc_iushr, opc_ixor, opc_jsr, opc_jsr_w, opc_l2d, opc_l2f, opc_l2i, opc_ladd, opc_laload, opc_land, opc_lastore, opc_lcmp, opc_lconst_0, opc_lconst_1, opc_ldc, opc_ldc_w, opc_ldc2_w, opc_ldiv, opc_lload, opc_lload_0, opc_lload_1, opc_lload_2, opc_lload_3, opc_lmul, opc_lneg, opc_lookupswitch, opc_lor, opc_lrem, opc_lreturn, opc_lshl, opc_lshr, opc_lstore, opc_lstore_0, opc_lstore_1, opc_lstore_2, opc_lstore_3, opc_lsub, opc_lushr, opc_lxor, opc_monitorenter, opc_monitorexit, opc_multianewarray, opc_new, opc_newarray, opc_nop, opc_pop, opc_pop2, opc_putfield, opc_putstatic, opc_ret, opc_return, opc_saload, opc_sastore, opc_sipush, opc_swap, opc_tableswitch, opc_wide, opc_xxxunusedxxx, POO_ASCII_CONSTANT, POO_CLASS_CONSTANT, POO_DOUBLE_CONSTANT, POO_FLOAT_CONSTANT, POO_INTEGER_CONSTANT, POO_LONG_CONSTANT, POO_NAT_CONSTANT, POO_REF_CONSTANT, POO_STRING_CONSTANT, TYP_ADDRESS, TYP_DOUBLE, TYP_FLOAT, TYP_INT, TYP_LONG, TYP_REFERENCE, TYP_VOID
 
Method Summary
static void doReplace(LinearAnalyzer lfa, LinearRedundancyAnalyzer lra, SIRStream str)
          start the process of replacement on str using the Linearity information in lfa.
 JFieldDeclaration[] makeFields(at.dms.kjc.sir.linear.LinearRedundancyReplacer.RedundancyReplacerData tupleData)
          Makes the state and index fields for each of the tuple.
 void makeIndexUpdateStatement(JBlock body, LinearComputationTuple t, at.dms.kjc.sir.linear.LinearRedundancyReplacer.RedundancyReplacerData tupleData)
          Creates an index increment of the form:
 boolean makeReplacement(SIRStream self)
          Visit a pipeline, splitjoin or filter, replacing them with a new filter that directly implements the linear representation.
 JExpression makeTupleAccess(LinearComputationTuple t, at.dms.kjc.sir.linear.LinearRedundancyReplacer.RedundancyReplacerData tupleData)
          Creats a tuple access to a tuple state field for the specified tuple.
 JExpression makeTupleComputation(LinearComputationTuple tuple)
          Generate a JExpression that computes the value specified by a computation tuple.
 JMethodDeclaration makeWork(int type, LinearFilterRepresentation linearRep, at.dms.kjc.sir.linear.LinearRedundancyReplacer.RedundancyReplacerData tupleData)
          Make either the work or the init work function.
 
Methods inherited from class at.dms.kjc.sir.linear.LinearReplacer
appendFieldDeclaration, appendFieldDeclarations, getArrayType, makeArrayFieldAccessExpr, makeArrayFieldAccessExpr, makeArrayFieldAccessExpr, makeAssignmentStatement, makeComment, makeFieldAccessExpression, makeFieldInitialization, makeIncrementStatement, makeLessThanExpression, makeLocalVarExpression, preVisitFeedbackLoop, preVisitPipeline, preVisitSplitJoin, visitFilter
 
Methods inherited from class at.dms.kjc.sir.EmptyStreamVisitor
postVisitFeedbackLoop, postVisitPipeline, postVisitSplitJoin, postVisitStream, preVisitStream, visitPhasedFilter
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Field Detail

STATE_FIELD_PREFIX

public static final String STATE_FIELD_PREFIX
The prefix to use to name fields.

See Also:
Constant Field Values

INDEX_POSTFIX

public static final String INDEX_POSTFIX
The postfix to use for the index variable.

See Also:
Constant Field Values

WORK

public static final int WORK
The constant to signify that we are making a work function (and not init work).

See Also:
Constant Field Values

INITWORK

public static final int INITWORK
The constant to signify that we are making the init work function (and not work).

See Also:
Constant Field Values
Method Detail

doReplace

public static void doReplace(LinearAnalyzer lfa,
                             LinearRedundancyAnalyzer lra,
                             SIRStream str)
start the process of replacement on str using the Linearity information in lfa.


makeReplacement

public boolean makeReplacement(SIRStream self)
Visit a pipeline, splitjoin or filter, replacing them with a new filter that directly implements the linear representation. This only occurs if the replace calculator says that this stream should be replaced.

Specified by:
makeReplacement in class LinearReplacer

makeFields

public JFieldDeclaration[] makeFields(at.dms.kjc.sir.linear.LinearRedundancyReplacer.RedundancyReplacerData tupleData)
Makes the state and index fields for each of the tuple.


makeWork

public JMethodDeclaration makeWork(int type,
                                   LinearFilterRepresentation linearRep,
                                   at.dms.kjc.sir.linear.LinearRedundancyReplacer.RedundancyReplacerData tupleData)
Make either the work or the init work function. If type is WORK, then work is made, if type is INITWORK, then not surprisingly initWork gets made. Both have peek and pop that are equal to the original filter.


makeTupleComputation

public JExpression makeTupleComputation(LinearComputationTuple tuple)
Generate a JExpression that computes the value specified by a computation tuple. Specifically, given (index,coefficient) computes peek(index)*coefficient.


makeTupleAccess

public JExpression makeTupleAccess(LinearComputationTuple t,
                                   at.dms.kjc.sir.linear.LinearRedundancyReplacer.RedundancyReplacerData tupleData)
Creats a tuple access to a tuple state field for the specified tuple. The expression is of the form: tuple_field[(tuple_index + use) % maxUse(tuple) where tuple is in the mapping from t->(use,tuple) in compMap.


makeIndexUpdateStatement

public void makeIndexUpdateStatement(JBlock body,
                                     LinearComputationTuple t,
                                     at.dms.kjc.sir.linear.LinearRedundancyReplacer.RedundancyReplacerData tupleData)
Creates an index increment of the form:
 tuple_index = tuple_index - 1;
 if (tuple_index < 0) {
  tuple_inded = maxUse(tuple);
 }