From 5057e149ae83b2c564ee2a16ac1cbad5f80083fd Mon Sep 17 00:00:00 2001 From: Mads Ager Date: Fri, 23 Jun 2017 12:28:01 +0200 Subject: Pin this register in debug mode. Bug: 62895996 R=zerny@google.com Change-Id: Ia0b1b39f34acd3d99bfe995bb7b67567bbb0f034 --- .../com/android/tools/r8/ir/conversion/IRConverter.java | 2 +- .../tools/r8/ir/regalloc/LinearScanRegisterAllocator.java | 13 ++++++++++++- 2 files changed, 13 insertions(+), 2 deletions(-) (limited to 'src/main/java/com') 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> 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); -- cgit v1.2.3