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