/** * Updates the liveness resulting from mapping the given old variable on * the given new variable. */ private void updateLiveness(int oldVariableIndex, int newVariableIndex, int codeLength) { // Loop over all instructions. for (int offset = 0; offset < codeLength; offset++) { // Update the liveness before the instruction. if (livenessAnalyzer.isAliveBefore(offset, oldVariableIndex)) { livenessAnalyzer.setAliveBefore(offset, oldVariableIndex, false); livenessAnalyzer.setAliveBefore(offset, newVariableIndex, true); } // Update the liveness after the instruction. if (livenessAnalyzer.isAliveAfter(offset, oldVariableIndex)) { livenessAnalyzer.setAliveAfter(offset, oldVariableIndex, false); livenessAnalyzer.setAliveAfter(offset, newVariableIndex, true); } } } }
/** * Returns whether the given variables are never alive at the same time. */ private boolean areNonOverlapping(int variableIndex1, int variableIndex2, int codeLength) { // Loop over all instructions. for (int offset = 0; offset < codeLength; offset++) { if ((livenessAnalyzer.isAliveBefore(offset, variableIndex1) && livenessAnalyzer.isAliveBefore(offset, variableIndex2)) || (livenessAnalyzer.isAliveAfter(offset, variableIndex1) && livenessAnalyzer.isAliveAfter(offset, variableIndex2)) || // For now, exclude Category 2 variables. livenessAnalyzer.isCategory2(offset, variableIndex1)) { return false; } } return true; }
/** * Returns the first instruction offset between the given offsets at which * the given variable goes alive. */ private int firstLiveness(int startOffset, int endOffset, int variableIndex) { for (int offset = startOffset; offset < endOffset; offset++) { if (livenessAnalyzer.isTraced(offset) && livenessAnalyzer.isAliveBefore(offset, variableIndex)) { return offset; } } return endOffset; }
alive = combinedLiveness(branchTargets); if (isAliveBefore(offset, variableIndex)) setCategory2(offset, variableIndex, true); setAliveBefore(offset, variableIndex + 1, true); setCategory2( offset, variableIndex + 1, true); if (isAliveAfter(offset, variableIndex)) setCategory2(offset, variableIndex, true); setAliveAfter(offset, variableIndex + 1, true); setCategory2( offset, variableIndex + 1, true);
initializeArrays(codeAttribute); alive = combinedLiveness(branchTargets); checkAgain |= offset < maxOffset(partialEvaluator.branchOrigins(offset)); if (isAliveBefore(offset, variableIndex)) setCategory2(offset, variableIndex, true); setAliveBefore(offset, variableIndex + 1, true); setCategory2( offset, variableIndex + 1, true); if (isAliveAfter(offset, variableIndex)) setCategory2(offset, variableIndex, true); setAliveAfter(offset, variableIndex + 1, true); setCategory2( offset, variableIndex + 1, true);
livenessAnalyzer.visitCodeAttribute(clazz, method, codeAttribute);
livenessAnalyzer.isAliveBefore(offset, index))) livenessAnalyzer.isAliveBefore(offset, index)))
alive = combinedLiveness(branchTargets); if (isAliveBefore(offset, variableIndex)) setCategory2(offset, variableIndex, true); setAliveBefore(offset, variableIndex + 1, true); setCategory2( offset, variableIndex + 1, true); if (isAliveAfter(offset, variableIndex)) setCategory2(offset, variableIndex, true); setAliveAfter(offset, variableIndex + 1, true); setCategory2( offset, variableIndex + 1, true);
livenessAnalyzer.visitCodeAttribute(clazz, method, codeAttribute);
livenessAnalyzer.isAliveBefore(offset, index)) livenessAnalyzer.isAliveBefore(offset, index)))
alive = combinedLiveness(branchTargets); if (isAliveBefore(offset, variableIndex)) setCategory2(offset, variableIndex, true); setAliveBefore(offset, variableIndex + 1, true); setCategory2( offset, variableIndex + 1, true); if (isAliveAfter(offset, variableIndex)) setCategory2(offset, variableIndex, true); setAliveAfter(offset, variableIndex + 1, true); setCategory2( offset, variableIndex + 1, true);
/** * Updates the liveness resulting from mapping the given old variable on * the given new variable. */ private void updateLiveness(int oldVariableIndex, int newVariableIndex, int codeLength) { // Loop over all instructions. for (int offset = 0; offset < codeLength; offset++) { // Update the liveness before the instruction. if (livenessAnalyzer.isAliveBefore(offset, oldVariableIndex)) { livenessAnalyzer.setAliveBefore(offset, oldVariableIndex, false); livenessAnalyzer.setAliveBefore(offset, newVariableIndex, true); } // Update the liveness after the instruction. if (livenessAnalyzer.isAliveAfter(offset, oldVariableIndex)) { livenessAnalyzer.setAliveAfter(offset, oldVariableIndex, false); livenessAnalyzer.setAliveAfter(offset, newVariableIndex, true); } } }
/** * Returns whether the given variables are never alive at the same time. */ private boolean areNonOverlapping(int variableIndex1, int variableIndex2, int codeLength) { // Loop over all instructions. for (int offset = 0; offset < codeLength; offset++) { if ((livenessAnalyzer.isAliveBefore(offset, variableIndex1) && livenessAnalyzer.isAliveBefore(offset, variableIndex2)) || (livenessAnalyzer.isAliveAfter(offset, variableIndex1) && livenessAnalyzer.isAliveAfter(offset, variableIndex2)) || // For now, exclude Category 2 variables. livenessAnalyzer.isCategory2(offset, variableIndex1)) { return false; } } return true; }
/** * Returns the first instruction offset between the given offsets at which * the given variable goes alive. */ private int firstLiveness(int startOffset, int endOffset, int variableIndex) { for (int offset = startOffset; offset < endOffset; offset++) { if (livenessAnalyzer.isTraced(offset) && livenessAnalyzer.isAliveBefore(offset, variableIndex)) { return offset; } } return endOffset; }
livenessAnalyzer.visitCodeAttribute(clazz, method, codeAttribute);
livenessAnalyzer.isAliveBefore(offset, index)) livenessAnalyzer.isAliveBefore(offset, index)))
/** * Updates the liveness resulting from mapping the given old variable on * the given new variable. */ private void updateLiveness(int oldVariableIndex, int newVariableIndex, int codeLength) { // Loop over all instructions. for (int offset = 0; offset < codeLength; offset++) { // Update the liveness before the instruction. if (livenessAnalyzer.isAliveBefore(offset, oldVariableIndex)) { livenessAnalyzer.setAliveBefore(offset, oldVariableIndex, false); livenessAnalyzer.setAliveBefore(offset, newVariableIndex, true); } // Update the liveness after the instruction. if (livenessAnalyzer.isAliveAfter(offset, oldVariableIndex)) { livenessAnalyzer.setAliveAfter(offset, oldVariableIndex, false); livenessAnalyzer.setAliveAfter(offset, newVariableIndex, true); } } }
/** * Returns whether the given variables are never alive at the same time. */ private boolean areNonOverlapping(int variableIndex1, int variableIndex2, int codeLength) { // Loop over all instructions. for (int offset = 0; offset < codeLength; offset++) { if ((livenessAnalyzer.isAliveBefore(offset, variableIndex1) && livenessAnalyzer.isAliveBefore(offset, variableIndex2)) || (livenessAnalyzer.isAliveAfter(offset, variableIndex1) && livenessAnalyzer.isAliveAfter(offset, variableIndex2)) || // For now, exclude Category 2 variables. livenessAnalyzer.isCategory2(offset, variableIndex1)) { return false; } } return true; }
/** * Returns the first instruction offset between the given offsets at which * the given variable goes alive. */ private int firstLiveness(int startOffset, int endOffset, int variableIndex) { for (int offset = startOffset; offset < endOffset; offset++) { if (livenessAnalyzer.isTraced(offset) && livenessAnalyzer.isAliveBefore(offset, variableIndex)) { return offset; } } return endOffset; }
livenessAnalyzer.visitCodeAttribute(clazz, method, codeAttribute);