Merge "Various dx fixes to make it preserve locals and debug info." into dalvik-dev
diff --git a/dx/src/com/android/dx/ssa/LiteralOpUpgrader.java b/dx/src/com/android/dx/ssa/LiteralOpUpgrader.java
index e36c6ff..12bfa0d 100644
--- a/dx/src/com/android/dx/ssa/LiteralOpUpgrader.java
+++ b/dx/src/com/android/dx/ssa/LiteralOpUpgrader.java
@@ -146,8 +146,10 @@
     private boolean tryReplacingWithConstant(NormalSsaInsn insn) {
         Insn originalRopInsn = insn.getOriginalRopInsn();
         Rop opcode = originalRopInsn.getOpcode();
+        RegisterSpec result = insn.getResult();
 
-        if (insn.getResult() != null && opcode.getOpcode() != RegOps.CONST) {
+        if (result != null && !ssaMeth.isRegALocal(result) &&
+                opcode.getOpcode() != RegOps.CONST) {
             TypeBearer type = insn.getResult().getTypeBearer();
             if (type.isConstant() && type.getBasicType() == Type.BT_INT) {
                 // Replace the instruction with a constant
diff --git a/dx/src/com/android/dx/ssa/SCCP.java b/dx/src/com/android/dx/ssa/SCCP.java
index 3e101e3..f62d611 100644
--- a/dx/src/com/android/dx/ssa/SCCP.java
+++ b/dx/src/com/android/dx/ssa/SCCP.java
@@ -252,14 +252,18 @@
             Constant cA = null;
             Constant cB = null;
 
-            int regA = sources.get(0).getReg();
-            if (latticeValues[regA] == CONSTANT) {
+            RegisterSpec specA = sources.get(0);
+            int regA = specA.getReg();
+            if (!ssaMeth.isRegALocal(specA) &&
+                    latticeValues[regA] == CONSTANT) {
                 cA = latticeConstants[regA];
             }
 
             if (sources.size() == 2) {
-                int regB = sources.get(1).getReg();
-                if (latticeValues[regB] == CONSTANT) {
+                RegisterSpec specB = sources.get(1);
+                int regB = specB.getReg();
+                if (!ssaMeth.isRegALocal(specB) &&
+                        latticeValues[regB] == CONSTANT) {
                     cB = latticeConstants[regB];
                 }
             }
diff --git a/dx/src/com/android/dx/ssa/back/FirstFitLocalCombiningAllocator.java b/dx/src/com/android/dx/ssa/back/FirstFitLocalCombiningAllocator.java
index 24ebb02..ed82a31 100644
--- a/dx/src/com/android/dx/ssa/back/FirstFitLocalCombiningAllocator.java
+++ b/dx/src/com/android/dx/ssa/back/FirstFitLocalCombiningAllocator.java
@@ -369,10 +369,6 @@
      * @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);
@@ -402,10 +398,6 @@
      * @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);
@@ -507,7 +499,7 @@
 
             // Map any unmapped registers to anything available
             if (!moveMapped || !checkMapped) {
-                int ropReg = paramRangeEnd;
+                int ropReg = findNextUnreservedRopReg(paramRangeEnd, category);
                 ArrayList<RegisterSpec> ssaRegs =
                     new ArrayList<RegisterSpec>(2);
                 ssaRegs.add(moveRegSpec);
@@ -562,7 +554,7 @@
 
             int category = ssaSpec.getCategory();
             // Find a rop reg that does not interfere
-            int ropReg = paramRangeEnd;
+            int ropReg = findNextUnreservedRopReg(paramRangeEnd, category);
             while (!canMapReg(ssaSpec, ropReg)) {
                 ropReg = findNextUnreservedRopReg(ropReg + 1, category);
             }
@@ -890,7 +882,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
@@ -1067,7 +1059,7 @@
         }
 
         // Map any remaining unmapped regs with whatever fits
-        int mapReg = findNextUnreservedRopReg(0, category);
+        int mapReg = findNextUnreservedRopReg(paramRangeEnd, category);
         while (!tryMapRegs(ssaRegs, mapReg, category, false)) {
             mapReg = findNextUnreservedRopReg(mapReg + 1, category);
         }
diff --git a/dx/tests/091-ssa-const-collector/expected.txt b/dx/tests/091-ssa-const-collector/expected.txt
index b1c855a..764c7ee 100644
--- a/dx/tests/091-ssa-const-collector/expected.txt
+++ b/dx/tests/091-ssa-const-collector/expected.txt
@@ -310,11 +310,11 @@
   pred 0093
   Blort.java:43@003b: Rop{invoke-virtual . <- Ljava/io/PrintStream; Ljava/lang/
   String; call throws <any>}(java.io.PrintStream.println:(Ljava/lang/String;)V 
-  catch) . <- v0:Ljava/io/PrintStream; v2:Ljava/lang/String;="foo"
+  catch) . <- v2:Ljava/io/PrintStream; v3:Ljava/lang/String;="foo"
   next 007f
 block 007e
   pred 0094
-  Blort.java:33@0000: move-param-object(0) v3:"this"LBlort; <- .
+  Blort.java:33@0000: move-param-object(0) v4:"this"LBlort; <- .
   Blort.java:33@0000: goto . <- .
   next 0000
 block 007f
@@ -367,12 +367,12 @@
 block 0092
   pred 0035
   Blort.java:43@0036: Rop{move-result-pseudo Ljava/io/PrintStream; <- . flows} 
-  v0:Ljava/io/PrintStream; <- .
+  v2:Ljava/io/PrintStream; <- .
   Blort.java:43@0036: goto . <- .
   next 0039
 block 0093
   pred 0039
-  Blort.java:43@0039: Rop{move-result-pseudo Ljava/lang/String; <- . flows} v2:
+  Blort.java:43@0039: Rop{move-result-pseudo Ljava/lang/String; <- . flows} v3:
   Ljava/lang/String;="foo" <- .
   Blort.java:43@0039: goto . <- .
   next 003b
@@ -407,7 +407,7 @@
   @????: mark-local-int . <- v1:"b"I
   Blort.java:54@0011: const-int(10) v2:I=10 <- .
   @????: mark-local-int . <- v2:"c"I
-  Blort.java:56@0018: const-int(100) v3:I=100 <- .
+  Blort.java:56@0018: mul-const-int(10) v3:I=100 <- v3:I
   @????: mark-local-int . <- v3:"i"I=100
   Blort.java:57@001a: goto . <- .
   next 0003