at.dms.kjc.sir.lowering
Class LoopIterInfo

java.lang.Object
  extended by at.dms.kjc.sir.lowering.LoopIterInfo
All Implemented Interfaces:
Constants

public class LoopIterInfo
extends Object
implements Constants

Information about loops with fixed number of iterations.

This class was originally part of Unroller but is now used by other classes. It deals with loops that are run for a fixed number of iterations.

For our purposes, so far, we identifu a loop with a fixed number of iterations by looking for a for loop where a local variable is initialized to a constant, that same local variable is added to / subtracted from / multiplied by / divided by a constant, and the termination condition is given by comparison to a constant.

Ths code in this class does not check whether the induction variable is modified in the loop body. That check is left for the user to perform.

Author:
Jasper, minorly munged by Allyn

Field Summary
 
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
 int getFinalVal()
          The one past final value of the induction variable that would cause looping.
 int getIncrVal()
          The increment.
 int getInitVal()
          The initial value of the induction variable.
 boolean getIsDeclaredInInit()
          Whether the induction variable is declared in the initialization statement
static LoopIterInfo getLoopInfo(JStatement init, JExpression cond, JStatement incr, JStatement body, Map<JLocalVariable,JExpression> values, Map<JLocalVariable,JLiteral> constants)
          Get unroll info for this loop.
static int getNumIterations(LoopIterInfo info)
          Returns how many times a for loop with unroll info info will execute.
 int getOper()
          The operation that is being used to change the induction variable.
 JLocalVariable getVar()
          The induction variable in the loop.
static int incrementCounter(int counter, LoopIterInfo info)
          Given the UnrollInfo info and that counter was the old value of the count, returns the new value of the count for one loop iteration.
static boolean inRange(int counter, LoopIterInfo info)
          Determines if integer value counter is within the loop bounds given by info.
static JStatement makeIncrAssignment(LoopIterInfo info, int num)
          Return an assignment statement (ExpressionStatement(AssignmentExpression)) to increment (+,-,*,/) the induction variable by num.
static JExpression makeIncreased(LoopIterInfo info, int num)
          Return a JExpression that corresponds performing the loop increment operation num times on the loop induction variable.
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Method Detail

getVar

public JLocalVariable getVar()
The induction variable in the loop.

Returns:

getInitVal

public int getInitVal()
The initial value of the induction variable.

Returns:

getFinalVal

public int getFinalVal()
The one past final value of the induction variable that would cause looping.

Returns:

getOper

public int getOper()
The operation that is being used to change the induction variable.

Returns:

getIncrVal

public int getIncrVal()
The increment.

Returns:

getIsDeclaredInInit

public boolean getIsDeclaredInInit()
Whether the induction variable is declared in the initialization statement

Returns:

inRange

public static boolean inRange(int counter,
                              LoopIterInfo info)
Determines if integer value counter is within the loop bounds given by info.

Parameters:
counter -
info -
Returns:
true if in range else false.

incrementCounter

public static int incrementCounter(int counter,
                                   LoopIterInfo info)
Given the UnrollInfo info and that counter was the old value of the count, returns the new value of the count for one loop iteration.

Does not check whether new value is in bounds.

Parameters:
counter -
info -
Returns:

makeIncrAssignment

public static JStatement makeIncrAssignment(LoopIterInfo info,
                                            int num)
Return an assignment statement (ExpressionStatement(AssignmentExpression)) to increment (+,-,*,/) the induction variable by num.

Parameters:
info -
num -
Returns:
statement updating the induction variable.

makeIncreased

public static JExpression makeIncreased(LoopIterInfo info,
                                        int num)
Return a JExpression that corresponds performing the loop increment operation num times on the loop induction variable. For some reason the caller had to deal with the stride. Used in unrolling loops.

Parameters:
info - the LoopIterInfo
num -
Returns:
code for inductionVariable + num (or -, *, / num).

getLoopInfo

public static LoopIterInfo getLoopInfo(JStatement init,
                                       JExpression cond,
                                       JStatement incr,
                                       JStatement body,
                                       Map<JLocalVariable,JExpression> values,
                                       Map<JLocalVariable,JLiteral> constants)
Get unroll info for this loop.

Right now, we check that:


1. the initialization is an assignemnt of a constant to a variable or the declaration of a variable with a constant initial value.
2. the condition is a relational less-than test of the var and a const
3. the incr is addition or multiplication or div by a const. (use +=1, not ++)
4. the variable is an integer

We do not check that the induction variable is unmodified in the loop.

This will return null if the loop can not be unrolled.

Parameters:
init - the initialization statement of the for loop
cond - the termination condition expression
incr - the statement updating the induction variable of the loop.
body - the loop body (not currently used)
values - can specify the initial value of the induction variable if it is not set up in the init statement (but setting up in the init statement will override)
constants - can specify the initial value of the induction variable if the init statement assigns to a variable but that variable is not the induction variable (ask Jasper I don't know --- AD)
Returns:
a LoopIterInfo if the loop has a constant trip count, else null.

getNumIterations

public static int getNumIterations(LoopIterInfo info)
Returns how many times a for loop with unroll info info will execute. Returns -1 if the input is null.