Cleanup register allocator using helper methods
Change-Id: I9728db53a025e7c4f1d577b2e12534937c16d58a
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 2e2dd39..f60eb2e 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
@@ -1076,7 +1076,7 @@
int unadjustedRealRegisterFromAllocated(int allocated) {
assert allocated != NO_REGISTER;
assert allocated >= 0;
- if (allocated < numberOfArgumentRegisters) {
+ if (isArgumentRegister(allocated)) {
// For the |numberOfArguments| first registers map to the correct argument register.
return maxRegisterNumber - (numberOfArgumentRegisters - allocated - 1);
} else if (hasDedicatedMoveExceptionRegister()
@@ -1130,7 +1130,7 @@
// invoke/range. This looks forward and propagate hints backwards to avoid many moves in
// connection with ranged invokes.
allocateRegistersForInvokeRangeSplits(unhandledInterval);
- if (unhandledInterval.getRegister() != NO_REGISTER) {
+ if (unhandledInterval.hasRegister()) {
// The value itself is in the chain that has now gotten registers allocated.
continue;
}
@@ -1282,7 +1282,7 @@
}
} else if (!activeIntervals.overlapsPosition(start)) {
activeIterator.remove();
- assert activeIntervals.getRegister() != NO_REGISTER;
+ assert activeIntervals.hasRegister();
inactive.add(activeIntervals);
freeOccupiedRegistersForIntervals(activeIntervals);
}
@@ -1302,7 +1302,7 @@
}
} else if (inactiveIntervals.overlapsPosition(start)) {
inactiveIterator.remove();
- assert inactiveIntervals.getRegister() != NO_REGISTER;
+ assert inactiveIntervals.hasRegister();
active.add(inactiveIntervals);
takeFreeRegistersForIntervals(inactiveIntervals);
}
@@ -1367,7 +1367,7 @@
}
private boolean verifyRegisterAssignmentNotConflictingWithArgument(LiveIntervals interval) {
- assert interval.getRegister() != NO_REGISTER;
+ assert interval.hasRegister();
for (Value argumentValue = firstArgumentValue;
argumentValue != null;
argumentValue = argumentValue.getNextConsecutive()) {
@@ -1629,7 +1629,7 @@
}
private int getSpillRegister(LiveIntervals intervals, IntList excludedRegisters) {
- if (intervals.isArgumentInterval()) {
+ if (isPinnedArgumentRegister(intervals)) {
// Arguments are always in the argument registers, so for arguments just use that register
// for the unconstrained prefix. For everything else, get a spill register.
return intervals.getSplitParent().getRegister();
@@ -1690,7 +1690,7 @@
//
// Note that this is *not* guaranteed when overlapsInactiveIntervals is null, because it is
// possible that some live ranges of the argument are still in the unhandled set.
- if (register < numberOfArgumentRegisters) {
+ if (isArgumentRegister(register)) {
// Find the first argument value that uses the given register.
LiveIntervals argumentLiveIntervals = firstArgumentValue.getLiveIntervals();
while (!argumentLiveIntervals.usesRegister(register, intervals.getType().isWide())) {
@@ -2139,7 +2139,7 @@
i += requiredRegisters;
}
}
- for (; i < numberOfArgumentRegisters && i <= registerConstraint; i++) {
+ for (; isArgumentRegister(i) && i <= registerConstraint; i++) {
freePositions.setBlocked(i);
}
}
@@ -2644,7 +2644,7 @@
// Disallow the reuse of argument registers by always treating them as being used
// at instruction number 0.
- for (int i = 0; i < numberOfArgumentRegisters; i++) {
+ for (int i = 0; isArgumentRegister(i); i++) {
usePositions.setBlocked(i);
}
@@ -2811,7 +2811,7 @@
private void spillOverlappingActiveIntervals(
LiveIntervals unhandledInterval, int candidate, boolean candidateIsWide) {
- assert unhandledInterval.getRegister() == NO_REGISTER;
+ assert !unhandledInterval.hasRegister();
assert atLeastOneOfRegistersAreTaken(candidate, candidateIsWide);
// Registers that we cannot choose for spilling.
IntList excludedRegisters = new IntArrayList(candidateIsWide ? 2 : 1);
@@ -2842,8 +2842,8 @@
assignRegister(splitChild, registerNumber);
splitChild.setSpilled(true);
takeFreeRegistersForIntervals(splitChild);
- assert splitChild.getRegister() != NO_REGISTER;
- assert intervals.getRegister() != NO_REGISTER;
+ assert splitChild.hasRegister();
+ assert intervals.hasRegister();
newActive.add(splitChild);
// If the constant is split before its first actual use, mark the constant as being
// spilled. That will allows us to remove it afterwards if it is rematerializable.
@@ -2852,7 +2852,7 @@
&& intervals.getUses().size() == 1) {
intervals.setSpilled(true);
}
- if (splitChild.getUses().size() > 0) {
+ if (splitChild.hasUses()) {
if (splitChild.isLinked() && !splitChild.isArgumentInterval()) {
// Spilling a value with a pinned register. We need to move back at the next use.
LiveIntervals splitOfSplit = splitChild.splitBefore(splitChild.getFirstUse());
@@ -2860,7 +2860,7 @@
inactive.add(splitOfSplit);
} else if (intervals.getValue().isConstNumber()) {
// TODO(ager): Do this for all constants. Currently we only rematerialize const
- // number and therefore we only do it for numbers at this point.
+ // number and therefore we only do it for numbers at this point.
splitRangesForSpilledConstant(splitChild, registerNumber);
} else if (intervals.isArgumentInterval()) {
splitRangesForSpilledArgument(splitChild);
@@ -2893,7 +2893,7 @@
assert !spilled.getValue().isConstNumber();
assert !spilled.isLinked() || spilled.isArgumentInterval();
boolean isSpillingToArgumentRegister =
- (spilled.isArgumentInterval() || registerNumber < numberOfArgumentRegisters);
+ spilled.isArgumentInterval() || isArgumentRegister(registerNumber);
if (isSpillingToArgumentRegister) {
if (mode.is8Bit()) {
registerNumber = Constants.U8BIT_MAX;
@@ -3137,7 +3137,7 @@
return false;
}
assert intervals.hasRegister();
- if (intervals.getRegister() >= numberOfArgumentRegisters) {
+ if (!isArgumentRegister(intervals.getRegister())) {
return false;
}
// An argument register could be moved to another argument register.
@@ -3608,8 +3608,8 @@
freeRegistersWithDesiredOrdering =
new IntRBTreeSet(
(Integer x, Integer y) -> {
- boolean xIsArgument = x < numberOfArgumentRegisters;
- boolean yIsArgument = y < numberOfArgumentRegisters;
+ boolean xIsArgument = isArgumentRegister(x);
+ boolean yIsArgument = isArgumentRegister(y);
// If x is an argument and y is not, then prioritize y.
if (xIsArgument && !yIsArgument) {
return 1;
@@ -3646,10 +3646,8 @@
}
// Either all the consecutive registers are from the argument registers, or all are from the
// non-argument registers.
- assert (first < numberOfArgumentRegisters
- && first + numberOfRegisters - 1 < numberOfArgumentRegisters)
- || (first >= numberOfArgumentRegisters
- && first + numberOfRegisters - 1 >= numberOfArgumentRegisters);
+ assert (isArgumentRegister(first) && isArgumentRegister(first + numberOfRegisters - 1))
+ || (!isArgumentRegister(first) && !isArgumentRegister(first + numberOfRegisters - 1));
return first;
}
@@ -3749,7 +3747,7 @@
}
private boolean registersForIntervalsAreTaken(LiveIntervals intervals) {
- assert intervals.getRegister() != NO_REGISTER;
+ assert intervals.hasRegister();
return registersAreTaken(intervals.getRegister(), intervals.getType().isWide());
}
@@ -3785,10 +3783,10 @@
builder.append("\nLive range ascii art: \n");
for (LiveIntervals intervals : liveIntervals) {
Value value = intervals.getValue();
- if (intervals.getRegister() == NO_REGISTER) {
- StringUtils.appendRightPadded(builder, value + " (no reg): ", 20);
- } else {
+ if (intervals.hasRegister()) {
StringUtils.appendRightPadded(builder, value + " r" + intervals.getRegister() + ": ", 20);
+ } else {
+ StringUtils.appendRightPadded(builder, value + " (no reg): ", 20);
}
builder.append("|");
builder.append(intervals.toAscciArtString());