Account for unconstrained live intervals in allocateSingleInterval
Bug: b/389508413
Change-Id: If8929733b90c03083cb8ef3475429dfcb1922b0c
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 50b95a7..c48a408 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
@@ -1878,11 +1878,18 @@
// of finding another candidate to spill via allocateBlockedRegister.
assert unhandledInterval.hasUses();
if (!unhandledInterval.getUses().first().hasConstraint()) {
- int nextConstrainedPosition = unhandledInterval.firstUseWithConstraint(mode).getPosition();
- int register = getSpillRegister(unhandledInterval, null);
- LiveIntervals split = unhandledInterval.splitBefore(nextConstrainedPosition);
- assignFreeRegisterToUnhandledInterval(unhandledInterval, register);
- unhandled.add(split);
+ if (mode.hasRegisterConstraint(unhandledInterval)) {
+ int nextConstrainedPosition =
+ unhandledInterval.firstUseWithConstraint(mode).getPosition();
+ int register = getSpillRegister(unhandledInterval, null);
+ LiveIntervals split = unhandledInterval.splitBefore(nextConstrainedPosition);
+ assignFreeRegisterToUnhandledInterval(unhandledInterval, register);
+ unhandled.add(split);
+ } else {
+ assert unhandledInterval.firstUseWithConstraint(mode) == null;
+ int register = getSpillRegister(unhandledInterval, null);
+ assignFreeRegisterToUnhandledInterval(unhandledInterval, register);
+ }
} else {
allocateBlockedRegister(unhandledInterval);
}