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());
+  }
 }