Ensure DEX monitor instructions in R8 partial

Fixes: b/414598986
Change-Id: I9c2d2b27ee376ed6ff4ea659277334217179ea5e
Bug: b/b/414965524
diff --git a/src/main/java/com/android/tools/r8/ir/conversion/LirConverter.java b/src/main/java/com/android/tools/r8/ir/conversion/LirConverter.java
index 39fee28..59640a5 100644
--- a/src/main/java/com/android/tools/r8/ir/conversion/LirConverter.java
+++ b/src/main/java/com/android/tools/r8/ir/conversion/LirConverter.java
@@ -70,6 +70,13 @@
               method -> method.hasCode() && !appView.isCfByteCodePassThrough(method),
               method -> {
                 assert !method.getDefinition().getCode().hasExplicitCodeLens();
+                // TODO(b/414965524): Remove the need for checking processed and move the handling
+                // synchronized methods in DEX to a "CodeRewriterPass" as IR rewriting.
+                if (method.getDefinition().isProcessed()) {
+                  assert appView.options().partialSubCompilationConfiguration != null
+                      && appView.options().partialSubCompilationConfiguration.isR8();
+                  method.getDefinition().markNotProcessed();
+                }
                 IRCode code = method.buildIR(appView, MethodConversionOptions.forLirPhase(appView));
                 codeRewriterPassCollection.run(
                     code, null, null, Timing.empty(), null, appView.options());
diff --git a/src/test/java/com/android/tools/r8/partial/PartialCompilationSynchronizedMethodTest.java b/src/test/java/com/android/tools/r8/partial/PartialCompilationSynchronizedMethodExcludedTest.java
similarity index 83%
copy from src/test/java/com/android/tools/r8/partial/PartialCompilationSynchronizedMethodTest.java
copy to src/test/java/com/android/tools/r8/partial/PartialCompilationSynchronizedMethodExcludedTest.java
index 6b263be..ebbd0f0 100644
--- a/src/test/java/com/android/tools/r8/partial/PartialCompilationSynchronizedMethodTest.java
+++ b/src/test/java/com/android/tools/r8/partial/PartialCompilationSynchronizedMethodExcludedTest.java
@@ -17,7 +17,7 @@
 import org.junit.runners.Parameterized.Parameters;
 
 @RunWith(Parameterized.class)
-public class PartialCompilationSynchronizedMethodTest extends TestBase {
+public class PartialCompilationSynchronizedMethodExcludedTest extends TestBase {
 
   @Parameter(0)
   public TestParameters parameters;
@@ -55,10 +55,6 @@
     checkMonitorEnterAndExit(inspector, 3);
   }
 
-  private void unexpectedMonitorEnterAndExit(CodeInspector inspector) {
-    checkMonitorEnterAndExit(inspector, 0);
-  }
-
   @Test
   public void testD8() throws Exception {
     parameters.assumeDexRuntime();
@@ -75,15 +71,14 @@
   public void testR8Partial() throws Exception {
     parameters.assumeCanUseR8Partial();
     testForR8Partial(parameters.getBackend())
-        .addR8IncludedClasses(ClassWithSynchronizedMethod.class)
-        .addR8ExcludedClasses(TestClass.class)
-        .addKeepClassAndMembersRules(ClassWithSynchronizedMethod.class)
+        .addR8IncludedClasses(TestClass.class)
+        .addR8ExcludedClasses(ClassWithSynchronizedMethod.class)
+        .addKeepMainRule(TestClass.class)
         .setMinApi(parameters)
         .compile()
-        // TODO(b/414598986): Should not happen.
-        .inspect(this::unexpectedMonitorEnterAndExit)
+        .inspect(this::expectedMonitorEnterAndExit)
         .run(parameters.getRuntime(), TestClass.class)
-        .assertFailureWithErrorThatThrows(IllegalMonitorStateException.class);
+        .assertSuccessWithOutput(EXPECTED_OUTPUT);
   }
 
   static class ClassWithSynchronizedMethod {
diff --git a/src/test/java/com/android/tools/r8/partial/PartialCompilationSynchronizedMethodTest.java b/src/test/java/com/android/tools/r8/partial/PartialCompilationSynchronizedMethodIncludedTest.java
similarity index 88%
rename from src/test/java/com/android/tools/r8/partial/PartialCompilationSynchronizedMethodTest.java
rename to src/test/java/com/android/tools/r8/partial/PartialCompilationSynchronizedMethodIncludedTest.java
index 6b263be..e3404b7 100644
--- a/src/test/java/com/android/tools/r8/partial/PartialCompilationSynchronizedMethodTest.java
+++ b/src/test/java/com/android/tools/r8/partial/PartialCompilationSynchronizedMethodIncludedTest.java
@@ -17,7 +17,7 @@
 import org.junit.runners.Parameterized.Parameters;
 
 @RunWith(Parameterized.class)
-public class PartialCompilationSynchronizedMethodTest extends TestBase {
+public class PartialCompilationSynchronizedMethodIncludedTest extends TestBase {
 
   @Parameter(0)
   public TestParameters parameters;
@@ -55,10 +55,6 @@
     checkMonitorEnterAndExit(inspector, 3);
   }
 
-  private void unexpectedMonitorEnterAndExit(CodeInspector inspector) {
-    checkMonitorEnterAndExit(inspector, 0);
-  }
-
   @Test
   public void testD8() throws Exception {
     parameters.assumeDexRuntime();
@@ -80,10 +76,9 @@
         .addKeepClassAndMembersRules(ClassWithSynchronizedMethod.class)
         .setMinApi(parameters)
         .compile()
-        // TODO(b/414598986): Should not happen.
-        .inspect(this::unexpectedMonitorEnterAndExit)
+        .inspect(this::expectedMonitorEnterAndExit)
         .run(parameters.getRuntime(), TestClass.class)
-        .assertFailureWithErrorThatThrows(IllegalMonitorStateException.class);
+        .assertSuccessWithOutput(EXPECTED_OUTPUT);
   }
 
   static class ClassWithSynchronizedMethod {