aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/com
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/com')
-rw-r--r--src/main/java/com/android/tools/r8/ir/conversion/IRConverter.java2
-rw-r--r--src/main/java/com/android/tools/r8/ir/regalloc/LinearScanRegisterAllocator.java13
2 files changed, 13 insertions, 2 deletions
diff --git a/src/main/java/com/android/tools/r8/ir/conversion/IRConverter.java b/src/main/java/com/android/tools/r8/ir/conversion/IRConverter.java
index 8b66c4bdf..a7870253c 100644
--- a/src/main/java/com/android/tools/r8/ir/conversion/IRConverter.java
+++ b/src/main/java/com/android/tools/r8/ir/conversion/IRConverter.java
@@ -556,7 +556,7 @@ public class IRConverter {
// Always perform dead code elimination before register allocation. The register allocator
// does not allow dead code (to make sure that we do not waste registers for unneeded values).
DeadCodeRemover.removeDeadCode(code, codeRewriter, options);
- LinearScanRegisterAllocator registerAllocator = new LinearScanRegisterAllocator(code);
+ LinearScanRegisterAllocator registerAllocator = new LinearScanRegisterAllocator(code, options);
registerAllocator.allocateRegisters(options.debug);
printMethod(code, "After register allocation (non-SSA)");
printLiveRanges(registerAllocator, "Final live ranges.");
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 a30f57440..9276f456a 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
@@ -25,6 +25,7 @@ import com.android.tools.r8.ir.code.Value.DebugInfo;
import com.android.tools.r8.ir.code.Xor;
import com.android.tools.r8.logging.Log;
import com.android.tools.r8.utils.CfgPrinter;
+import com.android.tools.r8.utils.InternalOptions;
import com.android.tools.r8.utils.ListUtils;
import com.android.tools.r8.utils.StringUtils;
import com.google.common.collect.HashMultiset;
@@ -109,6 +110,8 @@ public class LinearScanRegisterAllocator implements RegisterAllocator {
private final IRCode code;
// Number of registers used for arguments.
private final int numberOfArgumentRegisters;
+ // Compiler options.
+ private final InternalOptions options;
// Mapping from basic blocks to the set of values live at entry to that basic block.
private Map<BasicBlock, Set<Value>> liveAtEntrySets = new IdentityHashMap<>();
@@ -144,8 +147,9 @@ public class LinearScanRegisterAllocator implements RegisterAllocator {
// register.
private boolean hasDedicatedMoveExceptionRegister = false;
- public LinearScanRegisterAllocator(IRCode code) {
+ public LinearScanRegisterAllocator(IRCode code, InternalOptions options) {
this.code = code;
+ this.options = options;
int argumentRegisters = 0;
for (Instruction instruction : code.blocks.getFirst().getInstructions()) {
if (instruction.isArgument()) {
@@ -919,6 +923,13 @@ public class LinearScanRegisterAllocator implements RegisterAllocator {
if (mode == ArgumentReuseMode.ALLOW_ARGUMENT_REUSE) {
// The sentinel registers cannot be used and we block them.
freePositions.set(0, 0, false);
+ if (options.debug && !code.method.accessFlags.isStatic()) {
+ // If we are generating debug information, we pin the this value register since the
+ // debugger expects to always be able to find it in the input register.
+ assert numberOfArgumentRegisters > 0;
+ assert preArgumentSentinelValue.getNextConsecutive().requiredRegisters() == 1;
+ freePositions.set(1, 0, false);
+ }
int lastSentinelRegister = numberOfArgumentRegisters + NUMBER_OF_SENTINEL_REGISTERS - 1;
if (lastSentinelRegister <= registerConstraint) {
freePositions.set(lastSentinelRegister, 0, false);