diff options
author | Mads Ager <ager@google.com> | 2017-06-23 12:28:01 +0200 |
---|---|---|
committer | Mads Ager <ager@google.com> | 2017-06-23 12:28:01 +0200 |
commit | 5057e149ae83b2c564ee2a16ac1cbad5f80083fd (patch) | |
tree | 9158130dc3f3fb4dfedbdb1d2327f0dd046d3502 | |
parent | bc735a7711c6daf7bec1879d7bc40f6ff65f9e93 (diff) | |
download | r8-5057e149ae83b2c564ee2a16ac1cbad5f80083fd.tar.gz |
Pin this register in debug mode.
Bug: 62895996
R=zerny@google.com
Change-Id: Ia0b1b39f34acd3d99bfe995bb7b67567bbb0f034
3 files changed, 14 insertions, 3 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); diff --git a/src/test/java/com/android/tools/r8/maindexlist/MainDexListTests.java b/src/test/java/com/android/tools/r8/maindexlist/MainDexListTests.java index 4eb85454e..c49b66dd3 100644 --- a/src/test/java/com/android/tools/r8/maindexlist/MainDexListTests.java +++ b/src/test/java/com/android/tools/r8/maindexlist/MainDexListTests.java @@ -419,7 +419,7 @@ public class MainDexListTests extends TestBase { DexAnnotationSetRefList.empty(), code); IRCode ir = code.buildIR(method, options); - RegisterAllocator allocator = new LinearScanRegisterAllocator(ir); + RegisterAllocator allocator = new LinearScanRegisterAllocator(ir, options); method.setCode(ir, allocator, factory); directMethods[i] = method; } |