Version 0.1.12.
Merge: Ensure non-shared instruction after debug positions before shared suffix blocks.
CL: https://r8-review.googlesource.com/c/r8/+/5400
Change-Id: Id843d5bd4efc944d354b391f480dfa5ac2ff5d57
diff --git a/src/main/java/com/android/tools/r8/D8.java b/src/main/java/com/android/tools/r8/D8.java
index e7a1d6e..b692225 100644
--- a/src/main/java/com/android/tools/r8/D8.java
+++ b/src/main/java/com/android/tools/r8/D8.java
@@ -55,7 +55,7 @@
*/
public final class D8 {
- private static final String VERSION = "v0.1.11";
+ private static final String VERSION = "v0.1.12";
private static final int STATUS_ERROR = 1;
private D8() {}
diff --git a/src/main/java/com/android/tools/r8/R8.java b/src/main/java/com/android/tools/r8/R8.java
index 6e7e36d..deb4987 100644
--- a/src/main/java/com/android/tools/r8/R8.java
+++ b/src/main/java/com/android/tools/r8/R8.java
@@ -71,7 +71,7 @@
public class R8 {
- private static final String VERSION = "v0.1.11";
+ private static final String VERSION = "v0.1.12";
private final Timing timing = new Timing("R8");
private final InternalOptions options;
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/PeepholeOptimizer.java b/src/main/java/com/android/tools/r8/ir/optimize/PeepholeOptimizer.java
index a7d6e8d..35cadf2 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/PeepholeOptimizer.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/PeepholeOptimizer.java
@@ -84,7 +84,9 @@
commonSuffixSize = Math.min(
commonSuffixSize, sharedSuffixSizeExcludingExit(firstPred, pred, allocator));
}
- assert commonSuffixSize >= 1;
+ if (commonSuffixSize == 0) {
+ continue;
+ }
int blockNumber = startNumberOfNewBlock + newBlocks.size();
BasicBlock newBlock = createAndInsertBlockForSuffix(
blockNumber, commonSuffixSize, predsWithSameLastInstruction, block);
@@ -160,7 +162,9 @@
Instruction i0 = it0.previous();
Instruction i1 = it1.previous();
if (!i0.identicalAfterRegisterAllocation(i1, allocator)) {
- return suffixSize;
+ // If the shared suffix follows a debug position at least one instruction must remain
+ // unshared to ensure the debug position is at a different pc than the shared suffix.
+ return i0.isDebugPosition() || i1.isDebugPosition() ? suffixSize - 1 : suffixSize;
}
suffixSize++;
}
diff --git a/src/test/debugTestResources/Locals.java b/src/test/debugTestResources/Locals.java
index 65969bd..bee7c57 100644
--- a/src/test/debugTestResources/Locals.java
+++ b/src/test/debugTestResources/Locals.java
@@ -252,6 +252,16 @@
return "OK";
}
+ public static void regression65066975(boolean bit) {
+ nop();
+ if (bit) {
+ nop();
+ } else {
+ nop();
+ }
+ nop();
+ }
+
public static void main(String[] args) {
noLocals();
unusedLocals();
@@ -268,5 +278,6 @@
tempInCase(42);
localSwap(1, 2);
regression65039701(true);
+ regression65066975(false);
}
}
diff --git a/src/test/java/com/android/tools/r8/debug/LocalsTest.java b/src/test/java/com/android/tools/r8/debug/LocalsTest.java
index caf6849..c517a45 100644
--- a/src/test/java/com/android/tools/r8/debug/LocalsTest.java
+++ b/src/test/java/com/android/tools/r8/debug/LocalsTest.java
@@ -488,4 +488,23 @@
checkLine(SOURCE_FILE, 252),
run());
}
+
+ @Test
+ public void regression65066975() throws Throwable {
+ runDebugTest(
+ "Locals",
+ breakpoint("Locals", "regression65066975"),
+ run(),
+ checkLine(SOURCE_FILE, 256),
+ checkLocal("bit", Value.createBoolean(false)),
+ stepOver(),
+ checkLine(SOURCE_FILE, 257),
+ stepOver(),
+ checkLine(SOURCE_FILE, 260),
+ stepOver(),
+ checkLine(SOURCE_FILE, 262),
+ stepOver(),
+ checkLine(SOURCE_FILE, 263),
+ run());
+ }
}