Merge "Move arguments from their original register index"
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 85e0060..6803c75 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
@@ -513,9 +513,12 @@
// Compute the set of registers that is used based on all live intervals.
Set<Integer> usedRegisters = new HashSet<>();
for (LiveIntervals intervals : liveIntervals) {
- addRegisterIfUsed(usedRegisters, intervals);
- for (LiveIntervals childIntervals : intervals.getSplitChildren()) {
- addRegisterIfUsed(usedRegisters, childIntervals);
+ // Argument sentinel values do not occupy any registers.
+ if (!isArgumentSentinelIntervals(intervals)) {
+ addRegisterIfUsed(usedRegisters, intervals);
+ for (LiveIntervals childIntervals : intervals.getSplitChildren()) {
+ addRegisterIfUsed(usedRegisters, childIntervals);
+ }
}
}
// Additionally, we have used temporary registers for parallel move scheduling, those
@@ -535,6 +538,11 @@
unusedRegisters = computed;
}
+ private boolean isArgumentSentinelIntervals(LiveIntervals intervals) {
+ return intervals.isArgumentInterval() &&
+ (intervals.getPreviousConsecutive() == null || intervals.getNextConsecutive() == null);
+ }
+
private void addRegisterIfUsed(Set<Integer> used, LiveIntervals intervals) {
boolean unused = intervals.isSpilledAndRematerializable(this);
if (!unused) {