Soft pin default initializers in compat mode in presence of type refs

This avoids that the argument propagation optimization will consider instance initializers that are only retained due to compat rules to never be called.

Bug: 229951611
Change-Id: Ifabb12698011a3a11149739b149e12c97d91919c
diff --git a/src/main/java/com/android/tools/r8/shaking/Enqueuer.java b/src/main/java/com/android/tools/r8/shaking/Enqueuer.java
index 588c24b..ec394ab 100644
--- a/src/main/java/com/android/tools/r8/shaking/Enqueuer.java
+++ b/src/main/java/com/android/tools/r8/shaking/Enqueuer.java
@@ -4626,6 +4626,8 @@
             defaultInitializer.getReference(),
             defaultInitializer,
             graphReporter.reportCompatKeepDefaultInitializer(defaultInitializer));
+        applyMinimumKeepInfoWhenLiveOrTargeted(
+            defaultInitializer, KeepMethodInfo.newEmptyJoiner().disallowOptimization());
       }
     }
   }
diff --git a/src/test/java/com/android/tools/r8/classmerging/horizontal/CompatKeepConstructorLiveTest.java b/src/test/java/com/android/tools/r8/classmerging/horizontal/CompatKeepConstructorLiveTest.java
index ccec2d8..ac4e8d8 100644
--- a/src/test/java/com/android/tools/r8/classmerging/horizontal/CompatKeepConstructorLiveTest.java
+++ b/src/test/java/com/android/tools/r8/classmerging/horizontal/CompatKeepConstructorLiveTest.java
@@ -4,11 +4,11 @@
 
 package com.android.tools.r8.classmerging.horizontal;
 
-import static com.android.tools.r8.utils.codeinspector.Matchers.isAbsent;
 import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
 import static org.hamcrest.MatcherAssert.assertThat;
 
 import com.android.tools.r8.NeverClassInline;
+import com.android.tools.r8.NoHorizontalClassMerging;
 import com.android.tools.r8.TestParameters;
 import com.android.tools.r8.utils.codeinspector.ClassSubject;
 import org.junit.Test;
@@ -24,6 +24,7 @@
         .addInnerClasses(getClass())
         .addKeepMainRule(Main.class)
         .enableNeverClassInliningAnnotations()
+        .enableNoHorizontalClassMergingAnnotations()
         .setMinApi(parameters.getApiLevel())
         .run(parameters.getRuntime(), Main.class)
         .assertSuccessWithOutputLines("b: main", "true")
@@ -31,18 +32,20 @@
             codeInspector -> {
               ClassSubject aClassSubject = codeInspector.clazz(A.class);
               assertThat(aClassSubject, isPresent());
-
               assertThat(aClassSubject.init(), isPresent());
 
-              assertThat(codeInspector.clazz(A.class), isPresent());
-              assertThat(codeInspector.clazz(B.class), isAbsent());
+              ClassSubject bClassSubject = codeInspector.clazz(B.class);
+              assertThat(bClassSubject, isPresent());
+              assertThat(bClassSubject.init(), isPresent());
             });
   }
 
   @NeverClassInline
+  @NoHorizontalClassMerging
   public static class A {}
 
   @NeverClassInline
+  @NoHorizontalClassMerging
   public static class B {
     public B(String v) {
       System.out.println("b: " + v);
@@ -50,7 +53,7 @@
   }
 
   public static class Main {
-    public static void main(String[] args) throws Exception {
+    public static void main(String[] args) {
       new B("main");
       System.out.println(A.class.toString().length() > 0);
     }
diff --git a/src/test/java/com/android/tools/r8/shaking/SoftPinDefaultInitializerWithConstClassInCompatModeTest.java b/src/test/java/com/android/tools/r8/shaking/SoftPinDefaultInitializerWithConstClassInCompatModeTest.java
index 0e1bd45..d553900 100644
--- a/src/test/java/com/android/tools/r8/shaking/SoftPinDefaultInitializerWithConstClassInCompatModeTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/SoftPinDefaultInitializerWithConstClassInCompatModeTest.java
@@ -32,8 +32,7 @@
         .setMinApi(parameters.getApiLevel())
         .compile()
         .run(parameters.getRuntime(), Main.class)
-        // TODO(b/229951611): Should succeed with "A".
-        .assertFailureWithErrorThatThrows(NullPointerException.class);
+        .assertSuccessWithOutputLines("A");
   }
 
   static class Main {