Merge "Minor extension of method usesRegister"
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 87a5f83..c6477f3 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
@@ -1760,9 +1760,8 @@
Iterator<LiveIntervals> inactiveIterator = inactive.iterator();
while (inactiveIterator.hasNext()) {
LiveIntervals intervals = inactiveIterator.next();
- if ((intervals.usesRegister(candidate) ||
- (needsRegisterPair && intervals.usesRegister(candidate + 1))) &&
- intervals.overlaps(unhandledInterval)) {
+ if (intervals.usesRegister(candidate, needsRegisterPair)
+ && intervals.overlaps(unhandledInterval)) {
if (intervals.isLinked() && !intervals.isArgumentInterval()) {
// If the inactive register is linked but not an argument, it needs to get the
// same register again at the next use after the start of the unhandled interval.
@@ -1800,8 +1799,7 @@
Iterator<LiveIntervals> activeIterator = active.iterator();
while (activeIterator.hasNext()) {
LiveIntervals intervals = activeIterator.next();
- if (intervals.usesRegister(candidate) ||
- (needsRegisterPair && intervals.usesRegister(candidate + 1))) {
+ if (intervals.usesRegister(candidate, needsRegisterPair)) {
activeIterator.remove();
freeRegistersForIntervals(intervals);
LiveIntervals splitChild = intervals.splitBefore(unhandledInterval.getStart());
diff --git a/src/main/java/com/android/tools/r8/ir/regalloc/LiveIntervals.java b/src/main/java/com/android/tools/r8/ir/regalloc/LiveIntervals.java
index f353a67..0c711b9 100644
--- a/src/main/java/com/android/tools/r8/ir/regalloc/LiveIntervals.java
+++ b/src/main/java/com/android/tools/r8/ir/regalloc/LiveIntervals.java
@@ -296,18 +296,21 @@
return splitParent.computeMaxNonSpilledRegister();
}
- public boolean usesRegister(int n) {
- if (register == n || (getType().isWide() && register + 1 == n)) {
+ public boolean usesRegister(int n, boolean otherIsWide) {
+ if (register == n) {
+ return true;
+ }
+ if (getType().isWide() && register + 1 == n) {
+ return true;
+ }
+ if (otherIsWide && register == n + 1) {
return true;
}
return false;
}
public boolean hasConflictingRegisters(LiveIntervals other) {
- if (other.usesRegister(register) || (getType().isWide() && other.usesRegister(register + 1))) {
- return true;
- }
- return false;
+ return other.usesRegister(register, getType().isWide());
}
public void clearRegisterAssignment() {