|
|||||||||||
| PREV CLASS NEXT CLASS | FRAMES NO FRAMES | ||||||||||
| SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD | ||||||||||
java.lang.Objectorg.jikesrvm.compilers.opt.driver.CompilerPhase
org.jikesrvm.compilers.opt.ssa.LoopVersioning
public final class LoopVersioning
This optimisation works from the outer most loop inward, optimising
loops that conform to being regular AnnotatedLSTNodes. The optimisations performs the following
operations:
1) Determine the bound and null checks to be eliminated. These are
the ones that operate on the loop iterator. If no bound checks can
be eliminated, stop optimising this loop.
2) Determine the registers defined in the loop.
3) Generate phi nodes that define the original register defined by
the loop and use two newly created registers.
4) Create a version of the original loop that uses the first of the
newly created registers instead of the original registers.
5) Create a second version, this time with the result of the
eliminated checks set to true.
6) Work out what the maximum value for all the bounds checks are
and create branches to optimal or suboptimal loops
7) Fix up the phi node predecessors
8) Remove the unoptimized loop if its redundant
9) Replace register definitions in the original loop with phi
instructions
10) Compact node numbering so that CFG number of nodes reflects
that some basic blocks may have been deleted
Example:
| Field Summary | |
|---|---|
private static Constructor<CompilerPhase> |
constructor
Constructor for this compiler phase |
private static boolean |
DEBUG
Flag to optionally print verbose debugging messages |
private SSAOptions |
desiredSSAOptions
SSA options |
private CompilerPhase |
domPhase
Compiler phases called from this one |
private CompilerPhase |
enterSSA
Compiler phases called from this one |
private static boolean |
inSSAphase
Run inside SSA sub-phase |
private IR |
ir
IR for optimisation |
private CompilerPhase |
leaveSSA
Compiler phases called from this one |
private HashSet<Register> |
loopRegisterSet
Set used to store the loop related register |
private static int |
OPTIMIZED_LOOP_OPERAND
The phi instruction operand holding the optimized loop variable |
private static int |
UNOPTIMIZED_LOOP_OPERAND
The phi instruction operand holding the unoptimized loop variable |
private static boolean |
VERIFY
Flag to verify computed IR |
| Fields inherited from class org.jikesrvm.compilers.opt.driver.CompilerPhase |
|---|
container |
| Constructor Summary | |
|---|---|
LoopVersioning()
Constructor |
|
| Method Summary | |
|---|---|
private boolean |
createBranchBlocks(AnnotatedLSTNode loop,
BasicBlock block,
ArrayList<Instruction> checksToEliminate,
BasicBlock unoptimizedLoopEntry,
BasicBlock optimizedLoopEntry,
HashMap<Register,Register> optimalRegMap)
Create the block containing explict branches to either the optimized or unoptimized loops |
private HashMap<BasicBlock,BasicBlock> |
createCloneLoop(AnnotatedLSTNode loop,
HashMap<Register,Register> regMap,
HashMap<Register,BasicBlock> regToBlockMap)
Create a clone of the loop replacing definitions in the cloned loop with those found in the register map |
private HashMap<BasicBlock,BasicBlock> |
createOptimizedLoop(AnnotatedLSTNode loop,
HashMap<Register,Register> regMap,
ArrayList<Instruction> instrToEliminate,
HashMap<Register,BasicBlock> regToBlockMap)
Create a clone of the loop replacing definitions in the cloned loop with those found in the register map and eliminate unnecessary bound checks |
private boolean |
findLoopToOptimise(AnnotatedLSTNode loop)
Find an outermost loop to optimise and optimise it. |
private void |
fixUpPhiPredecessors(ArrayList<Instruction> phiInstructions,
BasicBlock unoptimizedLoopExit,
BasicBlock optimizedLoopExit)
When phi nodes were generated the basic blocks weren't known for the predecessors, fix this up now. |
private BasicBlock |
generateExplicitBoundCheck(Instruction boundCheckInstr,
Operand minIndexValue,
Operand maxIndexValue,
HashMap<Register,Register> optimalRegMap,
BasicBlock block,
BasicBlock unoptimizedLoopEntry)
Generate bound check branch blocks |
private BasicBlock |
generateNullCheckBranchBlocks(AnnotatedLSTNode loop,
ArrayList<Instruction> checksToEliminate,
HashMap<Register,Register> optimalRegMap,
BasicBlock block,
BasicBlock unoptimizedLoopEntry)
Generate null check branch blocks |
private void |
generatePhiNodes(AnnotatedLSTNode loop,
ArrayList<Register> registers,
ArrayList<TypeReference> types,
ArrayList<Instruction> phiInstructions,
HashMap<Register,Register> subOptimalRegMap,
HashMap<Register,Register> optimalRegMap)
Generate into a new block phi nodes that define the original register defined by the loop and use two newly created registers. |
Constructor<CompilerPhase> |
getClassConstructor()
Get a constructor object for this compiler phase |
private int |
getConstantAdjustedArrayLengthDistance(Operand op)
Get the distance from an array length by addding up instructions that adjust the array length result by a constant amount |
private Operand |
getConstantAdjustedArrayLengthRef(Operand op)
Get the array length reference ignoring instructions that adjust its result by a fixed amount |
private void |
getListOfChecksToEliminate(AnnotatedLSTNode loop,
ArrayList<Instruction> instrToEliminate)
Create a list of instructions to be eliminated |
String |
getName()
Return a string name for this phase. |
private void |
getRegistersDefinedInLoop(AnnotatedLSTNode loop,
ArrayList<Register> registers,
ArrayList<TypeReference> types,
ArrayList<Instruction> definingInstructions)
Get registers defined in the given loop. |
private boolean |
isOptimizedLoop(Register reg)
Check whether the loop that contain such iterator register had been optimized |
private void |
modifyOriginalLoop(AnnotatedLSTNode loop,
ArrayList<Instruction> phiInstructions,
ArrayList<Instruction> definingInstrInOriginalLoop,
HashMap<Register,Register> subOptimalRegMap,
HashMap<Register,Register> optimalRegMap)
Remove loop and replace register definitions in the original loop with phi instructions |
private RegisterOperand |
nullCheckPerformedInLoopPredecessors(BasicBlock header,
Instruction instr)
Can we eliminate a null check as it has lready been performed? |
void |
perform(IR _ir)
The main entry point |
private void |
removeUnoptimizedLoop(AnnotatedLSTNode loop,
HashMap<BasicBlock,BasicBlock> unoptimizedLoopMap)
Remove unreachable unoptimized loop |
private void |
renameOptimizedLoops(HashMap<Register,Register> subOptimalRegMap,
HashMap<Register,Register> optimalRegMap)
Rename the iterators for optimized loops so we can tell they are still optimized |
private static void |
report(String s)
Human readable report of what goes on |
private void |
setOptimizedLoop(Register reg)
Put the optimized loop's iterator register into the hash set |
boolean |
shouldPerform(OptOptions options)
Should the optimisation be performed |
| Methods inherited from class org.jikesrvm.compilers.opt.driver.CompilerPhase |
|---|
dumpIR, dumpIR, getCompilerPhaseConstructor, getCompilerPhaseConstructor, newExecution, performPhase, printingEnabled, reportAdditionalStats, setContainer, verify |
| Methods inherited from class java.lang.Object |
|---|
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait |
| Field Detail |
|---|
private static final boolean DEBUG
private static final boolean VERIFY
private static final int OPTIMIZED_LOOP_OPERAND
private static final int UNOPTIMIZED_LOOP_OPERAND
private IR ir
private HashSet<Register> loopRegisterSet
private SSAOptions desiredSSAOptions
private CompilerPhase enterSSA
private CompilerPhase leaveSSA
private CompilerPhase domPhase
private static final boolean inSSAphase
private static final Constructor<CompilerPhase> constructor
| Constructor Detail |
|---|
public LoopVersioning()
| Method Detail |
|---|
private static void report(String s)
s - String to printpublic String getName()
getName in class CompilerPhasepublic Constructor<CompilerPhase> getClassConstructor()
getClassConstructor in class CompilerPhasepublic boolean shouldPerform(OptOptions options)
shouldPerform in class CompilerPhaseoptions - the compiler options for the compilation
public void perform(IR _ir)
perform in class CompilerPhase_ir - the IR to processprivate boolean findLoopToOptimise(AnnotatedLSTNode loop)
loop - Loop to search
private void getListOfChecksToEliminate(AnnotatedLSTNode loop,
ArrayList<Instruction> instrToEliminate)
loop - the loop to examineinstrToEliminate - the instructions to remove
private void getRegistersDefinedInLoop(AnnotatedLSTNode loop,
ArrayList<Register> registers,
ArrayList<TypeReference> types,
ArrayList<Instruction> definingInstructions)
loop - - the loop to examineregisters - - vector to which defined registers are added
private void generatePhiNodes(AnnotatedLSTNode loop,
ArrayList<Register> registers,
ArrayList<TypeReference> types,
ArrayList<Instruction> phiInstructions,
HashMap<Register,Register> subOptimalRegMap,
HashMap<Register,Register> optimalRegMap)
registers - - vector to which defined registers need to be
created registers.x used in creating phi nodestypes - - vector of corresponding types of registers.phiInstructions - - created phi instructionssubOptimalRegMap - - mapping of orignal destination to the
newly created destination for the unoptimized loopoptimalRegMap - - mapping of orignal destination to the
newly created destination for the optimized loop
private HashMap<BasicBlock,BasicBlock> createCloneLoop(AnnotatedLSTNode loop,
HashMap<Register,Register> regMap,
HashMap<Register,BasicBlock> regToBlockMap)
loop - - loop to cloneregMap - - mapping of original definition to new
definition
private HashMap<BasicBlock,BasicBlock> createOptimizedLoop(AnnotatedLSTNode loop,
HashMap<Register,Register> regMap,
ArrayList<Instruction> instrToEliminate,
HashMap<Register,BasicBlock> regToBlockMap)
loop - - loop to cloneregMap - - mapping of original definition to new
definitioninstrToEliminate - - instructions to eliminateregToBlockMap - - mapping of a register to its defining BB
private void fixUpPhiPredecessors(ArrayList<Instruction> phiInstructions,
BasicBlock unoptimizedLoopExit,
BasicBlock optimizedLoopExit)
private boolean createBranchBlocks(AnnotatedLSTNode loop,
BasicBlock block,
ArrayList<Instruction> checksToEliminate,
BasicBlock unoptimizedLoopEntry,
BasicBlock optimizedLoopEntry,
HashMap<Register,Register> optimalRegMap)
optimalRegMap - - mapping used to map eliminated bound and
null check guards to
private BasicBlock generateNullCheckBranchBlocks(AnnotatedLSTNode loop,
ArrayList<Instruction> checksToEliminate,
HashMap<Register,Register> optimalRegMap,
BasicBlock block,
BasicBlock unoptimizedLoopEntry)
loop - the current loop where checks are being eliminatedchecksToEliminate - all of the checks that are being eliminated in the passoptimalRegMap - a map from original register to the register used in the optimal loopblock - the block to generate code intounoptimizedLoopEntry - entry to the unoptimized loop for if the check fails
private BasicBlock generateExplicitBoundCheck(Instruction boundCheckInstr,
Operand minIndexValue,
Operand maxIndexValue,
HashMap<Register,Register> optimalRegMap,
BasicBlock block,
BasicBlock unoptimizedLoopEntry)
boundCheckInstr - the bound check instruction in questionminIndexValue - the min value for an iterator a loop will generatemaxIndexValue - the max value for an iterator a loop will generateoptimalRegMap - a map from original register to the register used in the optimal loopblock - the block to generate code intounoptimizedLoopEntry - entry to the unoptimized loop for if the check fails
private RegisterOperand nullCheckPerformedInLoopPredecessors(BasicBlock header,
Instruction instr)
instr - null check instructionprivate Operand getConstantAdjustedArrayLengthRef(Operand op)
op - operand to chase arraylength opcode to
constant value from an array lengthprivate int getConstantAdjustedArrayLengthDistance(Operand op)
op - operand to chase arraylength opcode to
private void modifyOriginalLoop(AnnotatedLSTNode loop,
ArrayList<Instruction> phiInstructions,
ArrayList<Instruction> definingInstrInOriginalLoop,
HashMap<Register,Register> subOptimalRegMap,
HashMap<Register,Register> optimalRegMap)
private void removeUnoptimizedLoop(AnnotatedLSTNode loop,
HashMap<BasicBlock,BasicBlock> unoptimizedLoopMap)
private void setOptimizedLoop(Register reg)
reg - registerprivate boolean isOptimizedLoop(Register reg)
reg - register
private void renameOptimizedLoops(HashMap<Register,Register> subOptimalRegMap,
HashMap<Register,Register> optimalRegMap)
|
|||||||||||
| PREV CLASS NEXT CLASS | FRAMES NO FRAMES | ||||||||||
| SUMMARY: NESTED | FIELD | CONSTR | METHOD | DETAIL: FIELD | CONSTR | METHOD | ||||||||||