Ensure non-shared instruction after debug positions before shared suffix blocks.
R=ager
Bug: 65066975
Change-Id: I683aee5d86a6d552811906e10ba6ff748c75f3f7
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 56613b3..5afcabb 100644
--- a/src/test/debugTestResources/Locals.java
+++ b/src/test/debugTestResources/Locals.java
@@ -308,6 +308,16 @@
return "OK";
}
+ public static void regression65066975(boolean bit) {
+ nop();
+ if (bit) {
+ nop();
+ } else {
+ nop();
+ }
+ nop();
+ }
+
public static void main(String[] args) {
noLocals();
unusedLocals();
@@ -327,5 +337,6 @@
switchRewriteToIfs(1);
switchRewriteToSwitches(1);
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 926e84a..12fd23d 100644
--- a/src/test/java/com/android/tools/r8/debug/LocalsTest.java
+++ b/src/test/java/com/android/tools/r8/debug/LocalsTest.java
@@ -546,4 +546,23 @@
checkLine(SOURCE_FILE, 308),
run());
}
+
+ @Test
+ public void regression65066975() throws Throwable {
+ runDebugTest(
+ "Locals",
+ breakpoint("Locals", "regression65066975"),
+ run(),
+ checkLine(SOURCE_FILE, 312),
+ checkLocal("bit", Value.createBoolean(false)),
+ stepOver(),
+ checkLine(SOURCE_FILE, 313),
+ stepOver(),
+ checkLine(SOURCE_FILE, 316),
+ stepOver(),
+ checkLine(SOURCE_FILE, 318),
+ stepOver(),
+ checkLine(SOURCE_FILE, 319),
+ run());
+ }
}