Merge "Unset ACC_ANNOTATION flag for companion class"
diff --git a/src/main/java/com/android/tools/r8/Version.java b/src/main/java/com/android/tools/r8/Version.java
index 3639d9e..210a632 100644
--- a/src/main/java/com/android/tools/r8/Version.java
+++ b/src/main/java/com/android/tools/r8/Version.java
@@ -11,7 +11,7 @@
// This field is accessed from release scripts using simple pattern matching.
// Therefore, changing this field could break our release scripts.
- public static final String LABEL = "v1.2.8-dev";
+ public static final String LABEL = "v1.2.9-dev";
private Version() {
}
diff --git a/src/main/java/com/android/tools/r8/ir/regalloc/LinearScanRegisterAllocator.java b/src/main/java/com/android/tools/r8/ir/regalloc/LinearScanRegisterAllocator.java
index 31eb337..87a5f83 100644
--- a/src/main/java/com/android/tools/r8/ir/regalloc/LinearScanRegisterAllocator.java
+++ b/src/main/java/com/android/tools/r8/ir/regalloc/LinearScanRegisterAllocator.java
@@ -131,9 +131,7 @@
// The set of registers that are free for allocation.
private TreeSet<Integer> freeRegisters = new TreeSet<>();
// The max register number used.
- private int maxRegisterNumber = 0;
- // The next available register number not yet included in the set of used registers.
- private int nextUnusedRegisterNumber = 0;
+ private int maxRegisterNumber = -1;
// List of all top-level live intervals for all SSA values.
private List<LiveIntervals> liveIntervals = new ArrayList<>();
@@ -164,6 +162,10 @@
RESERVED_MOVE_EXCEPTION_REGISTER;
}
+ private int getNextUnusedRegisterNumber() {
+ return maxRegisterNumber + 1;
+ }
+
public LinearScanRegisterAllocator(IRCode code, InternalOptions options) {
this.code = code;
this.options = options;
@@ -677,8 +679,7 @@
private void clearRegisterAssignments() {
freeRegisters.clear();
- maxRegisterNumber = 0;
- nextUnusedRegisterNumber = 0;
+ maxRegisterNumber = -1;
active.clear();
inactive.clear();
unhandled.clear();
@@ -928,7 +929,7 @@
if (destIntervals.getRegister() == NO_REGISTER) {
// Save the current register allocation state so we can restore it at the end.
TreeSet<Integer> savedFreeRegisters = new TreeSet<>(freeRegisters);
- int savedUnusedRegisterNumber = nextUnusedRegisterNumber;
+ int savedUnusedRegisterNumber = getNextUnusedRegisterNumber();
List<LiveIntervals> savedActive = new LinkedList<>(active);
List<LiveIntervals> savedInactive = new LinkedList<>(inactive);
@@ -956,7 +957,7 @@
allocateLinkedIntervals(destIntervals);
// Restore the register allocation state.
freeRegisters = savedFreeRegisters;
- for (int i = savedUnusedRegisterNumber; i < nextUnusedRegisterNumber; i++) {
+ for (int i = savedUnusedRegisterNumber, j = getNextUnusedRegisterNumber(); i < j; i++) {
freeRegisters.add(i);
}
active = savedActive;
@@ -1033,17 +1034,13 @@
// Update the information about used registers when |register| has been selected for use.
private void updateRegisterState(int register, boolean needsRegisterPair) {
int maxRegister = register + (needsRegisterPair ? 1 : 0);
- if (maxRegister >= nextUnusedRegisterNumber) {
- nextUnusedRegisterNumber = maxRegister + 1;
- }
maxRegisterNumber = Math.max(maxRegisterNumber, maxRegister);
}
private int getSpillRegister(LiveIntervals intervals) {
- int registerNumber = nextUnusedRegisterNumber++;
+ int registerNumber = getNextUnusedRegisterNumber();
maxRegisterNumber = registerNumber;
if (intervals.getType().isWide()) {
- nextUnusedRegisterNumber++;
maxRegisterNumber++;
}
return registerNumber;
@@ -2176,22 +2173,7 @@
if (options.isGeneratingDex()) {
int inConstraint = instruction.maxInValueRegister();
LiveIntervals useIntervals = use.getLiveIntervals();
- // Arguments are always kept in their original, incoming register. For every
- // unconstrained use of an argument we therefore use its incoming register.
- // As a result, we do not need to record that the argument is being used at the
- // current instruction.
- //
- // For ranged invoke instructions that use a subset of the arguments in the current
- // order, registering a use for the arguments at the invoke can cause us to run out of
- // registers. That is because all arguments are forced back into a chosen register at
- // all uses. Therefore, if we register a use of an argument where we can actually use
- // it in the argument register, the register allocator would use two registers for the
- // argument but in reality only use one.
- boolean isUnconstrainedArgumentUse =
- use.isArgument() && inConstraint == Constants.U16BIT_MAX;
- if (!isUnconstrainedArgumentUse) {
- useIntervals.addUse(new LiveIntervalsUse(instruction.getNumber(), inConstraint));
- }
+ useIntervals.addUse(new LiveIntervalsUse(instruction.getNumber(), inConstraint));
}
}
}
@@ -2388,7 +2370,6 @@
}
}
freeRegisters.addAll(unused);
- maxRegisterNumber = Math.max(maxRegisterNumber, first + numberOfRegister - 1);
return first;
}
@@ -2396,7 +2377,8 @@
if (freeRegisters.size() > 0) {
return freeRegisters.pollFirst();
}
- return nextUnusedRegisterNumber++;
+ maxRegisterNumber = getNextUnusedRegisterNumber();
+ return maxRegisterNumber;
}
private void excludeRegistersForInterval(LiveIntervals intervals, Set<Integer> excluded) {
diff --git a/src/test/java/com/android/tools/r8/ir/regalloc/B77240639.java b/src/test/java/com/android/tools/r8/ir/regalloc/B77240639.java
index 28a6fa3..440f4f3 100644
--- a/src/test/java/com/android/tools/r8/ir/regalloc/B77240639.java
+++ b/src/test/java/com/android/tools/r8/ir/regalloc/B77240639.java
@@ -16,6 +16,7 @@
import org.junit.Test;
public class B77240639 extends TestBase {
+ @Ignore("b/77240639")
@Test
public void test() throws Exception {
AndroidApp app = compileWithD8(readClasses(TestClass.class));