Merge "Delete field nextUnusedRegisterNumber"
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..89f9352 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;
@@ -2388,7 +2385,6 @@
}
}
freeRegisters.addAll(unused);
- maxRegisterNumber = Math.max(maxRegisterNumber, first + numberOfRegister - 1);
return first;
}
@@ -2396,7 +2392,8 @@
if (freeRegisters.size() > 0) {
return freeRegisters.pollFirst();
}
- return nextUnusedRegisterNumber++;
+ maxRegisterNumber = getNextUnusedRegisterNumber();
+ return maxRegisterNumber;
}
private void excludeRegistersForInterval(LiveIntervals intervals, Set<Integer> excluded) {