Merge "Update unsplitting of arguments"
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 d02caf9..bb27c08 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
@@ -632,13 +632,21 @@
LiveIntervals intervals = current.getLiveIntervals();
assert intervals.getRegisterLimit() == Constants.U16BIT_MAX;
boolean canUseArgumentRegister = true;
+ boolean couldUseArgumentRegister = true;
for (LiveIntervals child : intervals.getSplitChildren()) {
- if (child.getRegisterLimit() < highestUsedRegister()) {
- canUseArgumentRegister = false;
- break;
+ int registerConstraint = child.getRegisterLimit();
+ if (registerConstraint < Constants.U16BIT_MAX) {
+ couldUseArgumentRegister = false;
+
+ if (registerConstraint < highestUsedRegister()) {
+ canUseArgumentRegister = false;
+ break;
+ }
}
}
- if (canUseArgumentRegister) {
+ if (canUseArgumentRegister && !couldUseArgumentRegister) {
+ // Only return true if there is a constrained use where it turns out that we can use the
+ // original argument register. This way we will not unnecessarily redo move insertion.
argumentRegisterUnsplit = true;
for (LiveIntervals child : intervals.getSplitChildren()) {
child.clearRegisterAssignment();