Dx fit to prevent method arguments from being overwritten by temps.
This change keeps code debuggable by preventing method arguments from
being reused to hold temporary values. This was a problem especially for
static methods.
Change-Id: I999013858501e7de3df27f82199d377fb1d034ea
diff --git a/dx/src/com/android/dx/ssa/back/FirstFitLocalCombiningAllocator.java b/dx/src/com/android/dx/ssa/back/FirstFitLocalCombiningAllocator.java
index 0cffcfa..e44c555 100644
--- a/dx/src/com/android/dx/ssa/back/FirstFitLocalCombiningAllocator.java
+++ b/dx/src/com/android/dx/ssa/back/FirstFitLocalCombiningAllocator.java
@@ -232,7 +232,7 @@
*/
private void handleLocalAssociatedOther() {
for (ArrayList<RegisterSpec> specs : localVariables.values()) {
- int ropReg = 0;
+ int ropReg = paramRangeEnd;
boolean done;
do {
@@ -361,13 +361,7 @@
* @return {@code >= 0;} start of available register range.
*/
private int findNextUnreservedRopReg(int startReg, int width) {
- if (minimizeRegisters && !isThisPointerReg(startReg)) {
- return startReg;
- }
-
- int reg;
-
- reg = reservedRopRegs.nextClearBit(startReg);
+ int reg = reservedRopRegs.nextClearBit(startReg);
while (true) {
int i = 1;
@@ -394,13 +388,7 @@
* @return {@code >= 0;} start of available register range.
*/
private int findRopRegForLocal(int startReg, int width) {
- if (minimizeRegisters && !isThisPointerReg(startReg)) {
- return startReg;
- }
-
- int reg;
-
- reg = usedRopRegs.nextClearBit(startReg);
+ int reg = usedRopRegs.nextClearBit(startReg);
while (true) {
int i = 1;
@@ -480,7 +468,7 @@
int checkReg = checkRegSpec.getReg();
// Assume none of the register is mapped yet
- int ropReg = 0;
+ int ropReg = paramRangeEnd;
/**
* See if either register is already mapped. Most likely the move
@@ -522,7 +510,7 @@
int category = ssaSpec.getCategory();
// Find a rop reg that does not interfere
- int ropReg = findNextUnreservedRopReg(0, category);
+ int ropReg = findNextUnreservedRopReg(paramRangeEnd, category);
while (!canMapReg(ssaSpec, ropReg)) {
ropReg = findNextUnreservedRopReg(ropReg + 1, category);
}
@@ -830,7 +818,7 @@
*/
private int findAnyFittingRange(NormalSsaInsn insn, int rangeLength,
int[] categoriesForIndex, BitSet outMovesRequired) {
- int rangeStart = 0;
+ int rangeStart = paramRangeEnd;
while (true) {
rangeStart = findNextUnreservedRopReg(rangeStart, rangeLength);
int fitWidth