|
|||||||||||
| PREV CLASS NEXT CLASS | FRAMES NO FRAMES | ||||||||||
| SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD | ||||||||||
java.lang.Objectorg.jikesrvm.compilers.opt.ir.IRTools
org.jikesrvm.compilers.opt.ExpressionFolding
public class ExpressionFolding
This class simplifies expressions globally, if in SSA form, or locally within a basic block if not.
| Field Summary | |
|---|---|
private static boolean |
FOLD_2CONVERSION
Fold xxx_2xxx where the precision is increased then decreased achieving a nop effect |
private static boolean |
FOLD_ADDS
Fold binary ADD operations |
private static boolean |
FOLD_ANDS
Fold binary AND operations |
private static boolean |
FOLD_CHECKS
Fold ZeroCheck where we're testing whether a value is 0 or not |
private static boolean |
FOLD_CMPS
Fold binary CMP operations |
private static boolean |
FOLD_CONDMOVES
Fold COND_MOVE operations |
private static boolean |
FOLD_CONSTANTS_TO_LHS
Fold operations that create a constant on the LHS? |
private static boolean |
FOLD_DIVS
Fold binary divide operations |
private static boolean |
FOLD_DOUBLES
Fold operations on doubles |
private static boolean |
FOLD_FLOATS
Fold operations on floats |
private static boolean |
FOLD_IFCMPS
Fold IFCMP operations |
private static boolean |
FOLD_INTS
Fold operations on ints |
private static boolean |
FOLD_LONGS
Fold operations on longs |
private static boolean |
FOLD_MULTS
Fold binary multiply operations |
private static boolean |
FOLD_NEGS
Fold unary NEG operations |
private static boolean |
FOLD_NOTS
Fold unary NOT operations |
private static boolean |
FOLD_ORS
Fold binary OR operations |
private static boolean |
FOLD_OVER_UNINTERRUPTIBLE
Fold across uninterruptible regions |
private static boolean |
FOLD_REFS
Fold operations on word like things |
private static boolean |
FOLD_SHIFTLS
Fold binary shift left operations |
private static boolean |
FOLD_SHIFTRS
Fold binary shift right operations |
private static boolean |
FOLD_SUBS
Fold binary SUB operations |
private static boolean |
FOLD_XORS
Fold binary XOR operations |
private static boolean |
RESTRICT_TO_DEAD_EXPRESSIONS
Only fold operations when the result of the 1st operation becomes dead after folding TODO: doesn't apply to local folding |
private static boolean |
VERBOSE
Print out debug information |
| Constructor Summary | |
|---|---|
ExpressionFolding()
|
|
| Method Summary | |
|---|---|
private static Address |
getAddressValue(Operand op)
|
private static RegisterOperand |
getDefFromCandidate(Instruction s,
boolean first)
Get the register that's defined by the candidate instruction |
private static double |
getDoubleValue(Operand op)
|
private static float |
getFloatValue(Operand op)
|
private static int |
getIntValue(Operand op)
|
private static long |
getLongValue(Operand op)
|
private static RegisterOperand |
getUseFromCandidate(Instruction s)
Get the register that's used by the candidate instruction |
private static Register |
isCandidateExpression(Instruction s,
boolean ssa)
Does instruction s compute a register r = candidate expression? |
static void |
perform(IR ir)
Perform the transformation. |
static boolean |
performLocal(IR ir)
Perform expression folding on individual basic blocks |
private static void |
pruneCandidates(HashSet<Register> candidates)
Prune the candidate set; restrict candidates to only allow transformations that result in dead code to be eliminated |
private static Instruction |
transform(Instruction s,
Instruction def)
Perform the transformation on the instruction |
| Methods inherited from class org.jikesrvm.compilers.opt.ir.IRTools |
|---|
A, AC, AC, CPOS, CR, D, DC, defDoublesAsUse, definedIn, F, FC, getCondMoveOp, getDefaultOperand, getLoadOp, getLoadOp, getMoveOp, getStoreOp, getStoreOp, I, IC, insertInstructionsAfter, L, LC, makeBlockOnEdge, mayBeVolatileFieldLoad, moveInstruction, moveIntoRegister, moveIntoRegister, nonPEIGC, TG, usedIn, useDoublesAsDef |
| Methods inherited from class java.lang.Object |
|---|
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait |
| Field Detail |
|---|
private static final boolean RESTRICT_TO_DEAD_EXPRESSIONS
private static final boolean FOLD_OVER_UNINTERRUPTIBLE
private static final boolean FOLD_INTS
private static final boolean FOLD_REFS
private static final boolean FOLD_LONGS
private static final boolean FOLD_FLOATS
private static final boolean FOLD_DOUBLES
private static final boolean FOLD_SUBS
private static final boolean FOLD_ADDS
private static final boolean FOLD_MULTS
private static final boolean FOLD_DIVS
private static final boolean FOLD_SHIFTLS
private static final boolean FOLD_SHIFTRS
private static final boolean FOLD_CMPS
private static final boolean FOLD_XORS
private static final boolean FOLD_ORS
private static final boolean FOLD_ANDS
private static final boolean FOLD_NEGS
private static final boolean FOLD_NOTS
private static final boolean FOLD_CONSTANTS_TO_LHS
private static final boolean FOLD_IFCMPS
private static final boolean FOLD_CONDMOVES
private static final boolean FOLD_2CONVERSION
private static final boolean FOLD_CHECKS
private static final boolean VERBOSE
| Constructor Detail |
|---|
public ExpressionFolding()
| Method Detail |
|---|
public static boolean performLocal(IR ir)
private static RegisterOperand getUseFromCandidate(Instruction s)
s - the instruction
null if this isn't a candidate
private static RegisterOperand getDefFromCandidate(Instruction s,
boolean first)
first - is this the first instruction?s - the instruction
null if this isn't a candidatepublic static void perform(IR ir)
x = a op1 c1
y = x op2 c2
where c1 and c2 are constants, replace the def of y by
y = a op1 (c1 op3 c2)Where op1, op2 and op3 are add, subtract, multiply, and, or, xor and compare. Repeatedly apply transformation until all expressions are folded.
PRECONDITIONS: SSA form, register lists computed
ir - the governing IRprivate static void pruneCandidates(HashSet<Register> candidates)
private static Instruction transform(Instruction s,
Instruction def)
s - the instruction to transform of the form y = x op c1def - the definition of x, the defining instruction is of the form x = a
op c2
private static Register isCandidateExpression(Instruction s,
boolean ssa)
s - the instructionssa - are we in SSA form?
nullprivate static int getIntValue(Operand op)
private static long getLongValue(Operand op)
private static float getFloatValue(Operand op)
private static double getDoubleValue(Operand op)
private static Address getAddressValue(Operand op)
|
|||||||||||
| PREV CLASS NEXT CLASS | FRAMES NO FRAMES | ||||||||||
| SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD | ||||||||||