Merge commit 'd10fec99f939477edbebfc4fc218a7ff26e89235' into dev-release

Change-Id: I1df9068ecdfb2404dea379eb3fa2997c4e9a5f6a
diff --git a/src/main/java/com/android/tools/r8/R8.java b/src/main/java/com/android/tools/r8/R8.java
index da49f2e..1083cb8 100644
--- a/src/main/java/com/android/tools/r8/R8.java
+++ b/src/main/java/com/android/tools/r8/R8.java
@@ -20,6 +20,7 @@
 import com.android.tools.r8.graph.AppInfoWithClassHierarchy;
 import com.android.tools.r8.graph.AppServices;
 import com.android.tools.r8.graph.AppView;
+import com.android.tools.r8.graph.DexApplicationReadFlags;
 import com.android.tools.r8.graph.DexClass;
 import com.android.tools.r8.graph.DexEncodedMethod;
 import com.android.tools.r8.graph.DexProgramClass;
@@ -678,9 +679,11 @@
       timing.begin("Run postlude");
       performFinalMainDexTracing(appView, executorService);
 
-      if (appView.appInfo().hasLiveness()) {
+      // If there was a reference to java.lang.Record in the input, we rewrite the record values.
+      DexApplicationReadFlags flags = appView.appInfo().app().getFlags();
+      if (flags.hasReadRecordReferenceFromProgramClass()) {
         RecordFieldValuesRewriter recordFieldArrayRemover =
-            RecordFieldValuesRewriter.create(appView.withLiveness());
+            RecordFieldValuesRewriter.create(appView);
         if (recordFieldArrayRemover != null) {
           recordFieldArrayRemover.rewriteRecordFieldValues();
         }
diff --git a/src/main/java/com/android/tools/r8/graph/AppView.java b/src/main/java/com/android/tools/r8/graph/AppView.java
index aaa4dad..b742d92 100644
--- a/src/main/java/com/android/tools/r8/graph/AppView.java
+++ b/src/main/java/com/android/tools/r8/graph/AppView.java
@@ -951,6 +951,11 @@
     return (AppView<AppInfo>) this;
   }
 
+  @SuppressWarnings("unchecked")
+  public AppView<AppInfo> unsafeWithoutClassHierarchy() {
+    return (AppView<AppInfo>) this;
+  }
+
   public boolean hasLiveness() {
     return appInfo().hasLiveness();
   }
diff --git a/src/main/java/com/android/tools/r8/ir/conversion/IRConverter.java b/src/main/java/com/android/tools/r8/ir/conversion/IRConverter.java
index dcc3abf..13b059d 100644
--- a/src/main/java/com/android/tools/r8/ir/conversion/IRConverter.java
+++ b/src/main/java/com/android/tools/r8/ir/conversion/IRConverter.java
@@ -222,8 +222,7 @@
                 && appView.options().canHaveVerifyErrorForUnknownUnusedReturnValue())
             ? new RemoveVerificationErrorForUnknownReturnedValues(appView)
             : null;
-    if (appView.enableWholeProgramOptimizations()) {
-      assert appView.appInfo().hasLiveness();
+    if (appView.enableWholeProgramOptimizations() && appView.appInfo().hasLiveness()) {
       assert appView.rootSet() != null;
       AppView<AppInfoWithLiveness> appViewWithLiveness = appView.withLiveness();
       assumeInserter = new AssumeInserter(appViewWithLiveness);
@@ -254,7 +253,10 @@
           options.enableDevirtualization ? new Devirtualizer(appViewWithLiveness) : null;
       this.typeChecker = new TypeChecker(appViewWithLiveness, VerifyTypesHelper.create(appView));
     } else {
-      AppView<AppInfo> appViewWithoutClassHierarchy = appView.withoutClassHierarchy();
+      AppView<AppInfo> appViewWithoutClassHierarchy =
+          appView.enableWholeProgramOptimizations()
+              ? appView.unsafeWithoutClassHierarchy()
+              : appView.withoutClassHierarchy();
       this.assumeInserter = null;
       this.classInliner = null;
       this.dynamicTypeOptimization = null;
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/CfInstructionDesugaringEventConsumer.java b/src/main/java/com/android/tools/r8/ir/desugar/CfInstructionDesugaringEventConsumer.java
index fb052fb..fcd5428 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/CfInstructionDesugaringEventConsumer.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/CfInstructionDesugaringEventConsumer.java
@@ -6,6 +6,7 @@
 
 import com.android.tools.r8.graph.AppInfoWithClassHierarchy;
 import com.android.tools.r8.graph.AppView;
+import com.android.tools.r8.graph.DexClass;
 import com.android.tools.r8.graph.DexClassAndMethod;
 import com.android.tools.r8.graph.DexClasspathClass;
 import com.android.tools.r8.graph.DexMethod;
@@ -288,7 +289,7 @@
     public void acceptNestConstructorBridge(
         ProgramMethod target,
         ProgramMethod bridge,
-        DexProgramClass argumentClass,
+        DexClass argumentClass,
         DexClassAndMethod context) {
       // Intentionally empty.
     }
@@ -722,7 +723,7 @@
     public void acceptNestConstructorBridge(
         ProgramMethod target,
         ProgramMethod bridge,
-        DexProgramClass argumentClass,
+        DexClass argumentClass,
         DexClassAndMethod context) {
       // Intentionally empty.
     }
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/nest/D8NestBasedAccessDesugaring.java b/src/main/java/com/android/tools/r8/ir/desugar/nest/D8NestBasedAccessDesugaring.java
index a4465a9..93b2f34 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/nest/D8NestBasedAccessDesugaring.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/nest/D8NestBasedAccessDesugaring.java
@@ -13,7 +13,6 @@
 import com.android.tools.r8.graph.DexClasspathClass;
 import com.android.tools.r8.graph.DexField;
 import com.android.tools.r8.graph.DexMethod;
-import com.android.tools.r8.graph.DexProgramClass;
 import com.android.tools.r8.graph.ProgramField;
 import com.android.tools.r8.graph.ProgramMethod;
 import com.android.tools.r8.ir.conversion.D8MethodProcessor;
@@ -109,7 +108,7 @@
               public void acceptNestConstructorBridge(
                   ProgramMethod target,
                   ProgramMethod bridge,
-                  DexProgramClass argumentClass,
+                  DexClass argumentClass,
                   DexClassAndMethod context) {
                 methodProcessor.scheduleDesugaredMethodForProcessing(bridge);
               }
@@ -229,8 +228,7 @@
     private void ensureConstructorBridgeFromClasspathAccess(
         ProgramMethod method, NestBasedAccessDesugaringEventConsumer eventConsumer) {
       assert method.getDefinition().isInstanceInitializer();
-      DexProgramClass constructorArgumentClass =
-          ensureConstructorArgumentClass(method).asProgramClass();
+      DexClass constructorArgumentClass = ensureConstructorArgumentClass(method);
       DexMethod bridgeReference = getConstructorBridgeReference(method, constructorArgumentClass);
       synchronized (method.getHolder().getMethodCollection()) {
         if (method.getHolder().lookupMethod(bridgeReference) == null) {
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/nest/NestBasedAccessDesugaring.java b/src/main/java/com/android/tools/r8/ir/desugar/nest/NestBasedAccessDesugaring.java
index 10f3501..55221e7 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/nest/NestBasedAccessDesugaring.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/nest/NestBasedAccessDesugaring.java
@@ -232,7 +232,7 @@
                     : AccessBridgeFactory.createMethodAccessorBridge(
                         bridgeAndTarget.getBridge(), targetMethod, dexItemFactory));
     if (targetMethod.getDefinition().isInstanceInitializer()) {
-      DexProgramClass argumentClass = getConstructorArgumentClass(targetMethod).asProgramClass();
+      DexClass argumentClass = getConstructorArgumentClass(targetMethod);
       eventConsumer.acceptNestConstructorBridge(targetMethod, bridgeMethod, argumentClass, context);
     } else {
       eventConsumer.acceptNestMethodBridge(targetMethod, bridgeMethod, context);
@@ -441,29 +441,35 @@
   }
 
   private DexClass getConstructorArgumentClass(DexClassAndMethod constructor) {
-    return syntheticNestConstructorTypes.get(constructor.getHolderType());
+    return syntheticNestConstructorTypes.get(constructor.getHolder().getNestHost());
   }
 
   DexClass ensureConstructorArgumentClass(DexClassAndMethod constructor) {
     assert constructor.getDefinition().isInstanceInitializer();
+    assert constructor.isProgramMethod() || constructor.isClasspathMethod();
+    DexType hostType =
+        constructor.isProgramMethod()
+            ? constructor.asProgramMethod().getHolder().getNestHost()
+            : constructor.asClasspathMethod().getHolder().getNestHost();
+    DexClass host = appView.definitionFor(hostType);
     return syntheticNestConstructorTypes.computeIfAbsent(
-        constructor.getHolderType(),
+        hostType,
         holder -> {
-          if (constructor.isProgramMethod()) {
+          if (host.isProgramClass()) {
             return appView
                 .getSyntheticItems()
                 .createFixedClass(
                     kinds -> kinds.INIT_TYPE_ARGUMENT,
-                    constructor.asProgramMethod().getHolder(),
+                    host.asProgramClass(),
                     appView,
                     builder -> {});
           } else {
-            assert constructor.isClasspathMethod();
+            assert host.isClasspathClass();
             return appView
                 .getSyntheticItems()
                 .ensureFixedClasspathClass(
                     kinds -> kinds.INIT_TYPE_ARGUMENT,
-                    constructor.asClasspathMethod().getHolder(),
+                    host.asClasspathClass(),
                     appView,
                     ignored -> {},
                     ignored -> {});
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/nest/NestBasedAccessDesugaringEventConsumer.java b/src/main/java/com/android/tools/r8/ir/desugar/nest/NestBasedAccessDesugaringEventConsumer.java
index afbeedc..8ec49e2 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/nest/NestBasedAccessDesugaringEventConsumer.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/nest/NestBasedAccessDesugaringEventConsumer.java
@@ -4,8 +4,8 @@
 
 package com.android.tools.r8.ir.desugar.nest;
 
+import com.android.tools.r8.graph.DexClass;
 import com.android.tools.r8.graph.DexClassAndMethod;
-import com.android.tools.r8.graph.DexProgramClass;
 import com.android.tools.r8.graph.ProgramField;
 import com.android.tools.r8.graph.ProgramMethod;
 
@@ -14,7 +14,7 @@
   void acceptNestConstructorBridge(
       ProgramMethod target,
       ProgramMethod bridge,
-      DexProgramClass argumentClass,
+      DexClass argumentClass,
       DexClassAndMethod context);
 
   void acceptNestFieldGetBridge(
@@ -46,7 +46,7 @@
     public void acceptNestConstructorBridge(
         ProgramMethod target,
         ProgramMethod bridge,
-        DexProgramClass argumentClass,
+        DexClass argumentClass,
         DexClassAndMethod context) {
       // Intentionally empty.
     }
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/records/RecordFieldValuesRewriter.java b/src/main/java/com/android/tools/r8/ir/desugar/records/RecordFieldValuesRewriter.java
index 71e0780..839fc6a 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/records/RecordFieldValuesRewriter.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/records/RecordFieldValuesRewriter.java
@@ -7,6 +7,7 @@
 import com.android.tools.r8.graph.DexClass;
 import com.android.tools.r8.graph.DexField;
 import com.android.tools.r8.graph.DexMethod;
+import com.android.tools.r8.graph.DexProgramClass;
 import com.android.tools.r8.graph.FieldResolutionResult;
 import com.android.tools.r8.graph.ProgramMethod;
 import com.android.tools.r8.ir.code.ArrayPut;
@@ -23,7 +24,6 @@
 import com.android.tools.r8.ir.conversion.IRConverter;
 import com.android.tools.r8.ir.conversion.MethodConversionOptions;
 import com.android.tools.r8.ir.optimize.info.OptimizationFeedbackIgnore;
-import com.android.tools.r8.shaking.AppInfoWithLiveness;
 import com.android.tools.r8.utils.Timing;
 import java.util.ArrayList;
 import java.util.List;
@@ -32,17 +32,17 @@
 /** Used to shrink record field arrays in dex compilations */
 public class RecordFieldValuesRewriter {
 
-  private final AppView<AppInfoWithLiveness> appView;
+  private final AppView<?> appView;
   private final IRConverter irConverter;
 
-  public static RecordFieldValuesRewriter create(AppView<AppInfoWithLiveness> appView) {
+  public static RecordFieldValuesRewriter create(AppView<?> appView) {
     if (appView.enableWholeProgramOptimizations() && appView.options().isGeneratingDex()) {
       return new RecordFieldValuesRewriter(appView);
     }
     return null;
   }
 
-  private RecordFieldValuesRewriter(AppView<AppInfoWithLiveness> appView) {
+  private RecordFieldValuesRewriter(AppView<?> appView) {
     this.appView = appView;
     irConverter = new IRConverter(appView);
   }
@@ -50,18 +50,32 @@
   // Called after final tree shaking, prune and minify field names and field values.
   // At least one instruction is a newRecordFieldArray.
   public void rewriteRecordFieldValues() {
-    for (DexMethod recordFieldValuesReference : appView.appInfo().recordFieldValuesReferences) {
-      DexClass dexClass =
-          appView.contextIndependentDefinitionFor(recordFieldValuesReference.getHolderType());
-      assert dexClass.isProgramClass();
-      ProgramMethod programMethod =
-          dexClass.asProgramClass().lookupProgramMethod(recordFieldValuesReference);
-      assert programMethod != null;
-      rewriteRecordFieldValues(programMethod);
+    if (appView.hasLiveness()) {
+      for (DexMethod recordFieldValuesReference :
+          appView.appInfo().withLiveness().recordFieldValuesReferences) {
+        DexClass dexClass =
+            appView.contextIndependentDefinitionFor(recordFieldValuesReference.getHolderType());
+        assert dexClass.isProgramClass();
+        ProgramMethod programMethod =
+            dexClass.asProgramClass().lookupProgramMethod(recordFieldValuesReference);
+        assert programMethod != null;
+        rewriteRecordFieldValues(programMethod, false);
+      }
+    } else {
+      // Without liveness, i.e., R8 called with -dontshrink, we take a slow path and exhaustively
+      // process all methods.
+      for (DexProgramClass clazz : appView.appInfo().classes()) {
+        clazz.forEachProgramMethod(
+            method -> {
+              if (method.getDefinition().hasCode()) {
+                rewriteRecordFieldValues(method, true);
+              }
+            });
+      }
     }
   }
 
-  public void rewriteRecordFieldValues(ProgramMethod programMethod) {
+  public void rewriteRecordFieldValues(ProgramMethod programMethod, boolean wide) {
     IRCode irCode =
         programMethod
             .getDefinition()
@@ -84,7 +98,7 @@
         }
       }
     }
-    assert done;
+    assert wide || done;
     irConverter.removeDeadCodeAndFinalizeIR(
         irCode, OptimizationFeedbackIgnore.getInstance(), Timing.empty());
   }
diff --git a/src/main/java/com/android/tools/r8/profile/rewriting/ProfileRewritingCfInstructionDesugaringEventConsumer.java b/src/main/java/com/android/tools/r8/profile/rewriting/ProfileRewritingCfInstructionDesugaringEventConsumer.java
index b556923..3af5dc4 100644
--- a/src/main/java/com/android/tools/r8/profile/rewriting/ProfileRewritingCfInstructionDesugaringEventConsumer.java
+++ b/src/main/java/com/android/tools/r8/profile/rewriting/ProfileRewritingCfInstructionDesugaringEventConsumer.java
@@ -7,6 +7,7 @@
 import static com.android.tools.r8.profile.rewriting.ProfileRewritingVarHandleDesugaringEventConsumerUtils.handleVarHandleDesugaringClassContext;
 
 import com.android.tools.r8.graph.AppView;
+import com.android.tools.r8.graph.DexClass;
 import com.android.tools.r8.graph.DexClassAndMethod;
 import com.android.tools.r8.graph.DexClasspathClass;
 import com.android.tools.r8.graph.DexMethod;
@@ -292,7 +293,7 @@
   public void acceptNestConstructorBridge(
       ProgramMethod target,
       ProgramMethod bridge,
-      DexProgramClass argumentClass,
+      DexClass argumentClass,
       DexClassAndMethod context) {
     nestBasedAccessDesugaringEventConsumer.acceptNestConstructorBridge(
         target, bridge, argumentClass, context);
diff --git a/src/main/java/com/android/tools/r8/profile/rewriting/ProfileRewritingNestBasedAccessDesugaringEventConsumer.java b/src/main/java/com/android/tools/r8/profile/rewriting/ProfileRewritingNestBasedAccessDesugaringEventConsumer.java
index 7d731fb..c44706f 100644
--- a/src/main/java/com/android/tools/r8/profile/rewriting/ProfileRewritingNestBasedAccessDesugaringEventConsumer.java
+++ b/src/main/java/com/android/tools/r8/profile/rewriting/ProfileRewritingNestBasedAccessDesugaringEventConsumer.java
@@ -4,8 +4,8 @@
 
 package com.android.tools.r8.profile.rewriting;
 
+import com.android.tools.r8.graph.DexClass;
 import com.android.tools.r8.graph.DexClassAndMethod;
-import com.android.tools.r8.graph.DexProgramClass;
 import com.android.tools.r8.graph.ProgramField;
 import com.android.tools.r8.graph.ProgramMethod;
 import com.android.tools.r8.ir.desugar.nest.NestBasedAccessDesugaringEventConsumer;
@@ -38,12 +38,13 @@
   public void acceptNestConstructorBridge(
       ProgramMethod target,
       ProgramMethod bridge,
-      DexProgramClass argumentClass,
+      DexClass argumentClass,
       DexClassAndMethod context) {
     if (context.isProgramMethod()) {
       additionsCollection.applyIfContextIsInProfile(
           context.asProgramMethod(),
-          additionsBuilder -> additionsBuilder.addRule(argumentClass).addRule(bridge));
+          additionsBuilder ->
+              additionsBuilder.addRule(argumentClass.getReference()).addRule(bridge));
     } else {
       additionsCollection.accept(
           additions ->
diff --git a/src/test/examplesJava11/nesthostexample/NestInitArgumentContextClass.java b/src/test/examplesJava11/nesthostexample/NestInitArgumentContextClass.java
new file mode 100644
index 0000000..cc8b8f3
--- /dev/null
+++ b/src/test/examplesJava11/nesthostexample/NestInitArgumentContextClass.java
@@ -0,0 +1,32 @@
+// Copyright (c) 2024, the R8 project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+package nesthostexample;
+
+class NestInitArgumentContextClass {
+  public class Inner1 {
+    private Inner1() {
+      new NestInitArgumentContextClass();
+    }
+  }
+
+  public class Inner2 {
+    private Inner2() {}
+  }
+
+  public class Inner3 {
+    private Inner3() {}
+  }
+
+  public class Inner4 {
+    private Inner4() {}
+  }
+
+  private NestInitArgumentContextClass() {
+    new Inner1();
+    new Inner2();
+    new Inner3();
+    new Inner4();
+  }
+}
diff --git a/src/test/examplesJava11/nesthostexample/NestInitArgumentContextTest.java b/src/test/examplesJava11/nesthostexample/NestInitArgumentContextTest.java
new file mode 100644
index 0000000..5e18f9c
--- /dev/null
+++ b/src/test/examplesJava11/nesthostexample/NestInitArgumentContextTest.java
@@ -0,0 +1,115 @@
+// Copyright (c) 2024, the R8 project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+package nesthostexample;
+
+import static org.junit.Assert.assertEquals;
+
+import com.android.tools.r8.TestBase;
+import com.android.tools.r8.TestParameters;
+import com.android.tools.r8.utils.BooleanUtils;
+import com.android.tools.r8.utils.codeinspector.ClassSubject;
+import com.google.common.collect.ImmutableList;
+import java.nio.file.Path;
+import java.util.ArrayList;
+import java.util.List;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+import org.junit.runners.Parameterized.Parameter;
+import org.junit.runners.Parameterized.Parameters;
+
+@RunWith(Parameterized.class)
+public class NestInitArgumentContextTest extends TestBase {
+
+  @Parameter(0)
+  public TestParameters parameters;
+
+  @Parameter(1)
+  public boolean intermediate;
+
+  @Parameters(name = "{0}, intermediate = {1}")
+  public static List<Object[]> data() {
+    return buildParameters(
+        getTestParameters().withDexRuntimesAndAllApiLevels().build(), BooleanUtils.values());
+  }
+
+  @Test
+  public void testD8SingleCompilationUnit() throws Exception {
+    testForD8(parameters.getBackend())
+        .addProgramClassesAndInnerClasses(NestInitArgumentContextClass.class)
+        .setMinApi(parameters)
+        .setIntermediate(intermediate)
+        .compile()
+        .inspect(
+            inspector ->
+                assertEquals(
+                    1,
+                    inspector.allClasses().stream()
+                        .map(ClassSubject::getFinalName)
+                        .filter(name -> name.endsWith("-IA"))
+                        .count()));
+  }
+
+  @Test
+  public void testD8SeparateCompilationUnits() throws Exception {
+    List<Class<?>> innerClasses =
+        ImmutableList.of(
+            NestInitArgumentContextClass.Inner1.class,
+            NestInitArgumentContextClass.Inner2.class,
+            NestInitArgumentContextClass.Inner3.class,
+            NestInitArgumentContextClass.Inner4.class);
+    List<Path> innerClassesCompiled = new ArrayList<>();
+    for (int i = 0; i < 4; i++) {
+      innerClassesCompiled.add(
+          testForD8(parameters.getBackend())
+              .addProgramClasses(innerClasses.get(i))
+              .addClasspathClasses(NestInitArgumentContextClass.class)
+              .addClasspathClasses(innerClasses)
+              .setMinApi(parameters)
+              .setIntermediate(intermediate)
+              .compile()
+              .inspect(
+                  inspector ->
+                      assertEquals(
+                          0,
+                          inspector.allClasses().stream()
+                              .map(ClassSubject::getFinalName)
+                              .filter(name -> name.endsWith("-IA"))
+                              .count()))
+              .writeToZip());
+    }
+
+    Path outerClassCompiled =
+        testForD8(parameters.getBackend())
+            .addProgramClasses(NestInitArgumentContextClass.class)
+            .addClasspathClasses(innerClasses)
+            .setMinApi(parameters)
+            .setIntermediate(intermediate)
+            .compile()
+            .inspect(
+                inspector ->
+                    assertEquals(
+                        1,
+                        inspector.allClasses().stream()
+                            .map(ClassSubject::getFinalName)
+                            .filter(name -> name.endsWith("-IA"))
+                            .count()))
+            .writeToZip();
+
+    testForD8(parameters.getBackend())
+        .addProgramFiles(innerClassesCompiled)
+        .addProgramFiles(outerClassCompiled)
+        .setMinApi(parameters)
+        .compile()
+        .inspect(
+            inspector ->
+                assertEquals(
+                    1,
+                    inspector.allClasses().stream()
+                        .map(ClassSubject::getFinalName)
+                        .filter(name -> name.endsWith("-IA"))
+                        .count()));
+  }
+}
diff --git a/src/test/examplesJava11/nesthostexample/NestOnProgramOnClassPathTest.java b/src/test/examplesJava11/nesthostexample/NestOnProgramOnClassPathTest.java
index d2e3d0c..974683a 100644
--- a/src/test/examplesJava11/nesthostexample/NestOnProgramOnClassPathTest.java
+++ b/src/test/examplesJava11/nesthostexample/NestOnProgramOnClassPathTest.java
@@ -64,13 +64,13 @@
     inner.inspect(
         inspector -> {
           assertThisNumberOfBridges(inspector, 3);
-          assertNestConstructor(inspector);
+          assertNoNestConstructor(inspector);
         });
     D8TestCompileResult host = compileClassesWithD8ProgramClasses(nestHost, nestHost);
     host.inspect(
         inspector -> {
           assertThisNumberOfBridges(inspector, 1);
-          assertNestConstructor(inspector);
+          assertInitArgumentClass(inspector);
         });
   }
 
@@ -100,10 +100,14 @@
         .compile();
   }
 
-  private static void assertNestConstructor(CodeInspector inspector) {
+  private static void assertInitArgumentClass(CodeInspector inspector) {
     assertTrue(inspector.allClasses().stream().anyMatch(FoundClassSubject::isSynthetic));
   }
 
+  private static void assertNoNestConstructor(CodeInspector inspector) {
+    assertTrue(inspector.allClasses().stream().noneMatch(FoundClassSubject::isSynthetic));
+  }
+
   private static void assertThisNumberOfBridges(CodeInspector inspector, int numBridges) {
     for (FoundClassSubject clazz : inspector.allClasses()) {
       if (!clazz.isSynthetic()) {
diff --git a/src/test/examplesJava17/records/RecordHashCodeTest.java b/src/test/examplesJava17/records/RecordHashCodeTest.java
index 2f2609d..b0b0b0e 100644
--- a/src/test/examplesJava17/records/RecordHashCodeTest.java
+++ b/src/test/examplesJava17/records/RecordHashCodeTest.java
@@ -83,6 +83,28 @@
     builder.run(parameters.getRuntime(), TestClass.class).assertSuccessWithOutput(EXPECTED_RESULT);
   }
 
+  @Test
+  public void testR8DontShrinkDontObfuscate() throws Exception {
+    parameters.assumeR8TestParameters();
+    assumeTrue(parameters.isDexRuntime() || isCfRuntimeWithNativeRecordSupport());
+    R8FullTestBuilder builder =
+        testForR8(parameters.getBackend())
+            .addInnerClassesAndStrippedOuter(getClass())
+            .setMinApi(parameters)
+            .addDontShrink()
+            .addDontObfuscate()
+            .addInliningAnnotations()
+            .addKeepMainRule(TestClass.class);
+    if (parameters.isCfRuntime()) {
+      builder
+          .addLibraryProvider(JdkClassFileProvider.fromSystemJdk())
+          .run(parameters.getRuntime(), TestClass.class)
+          .assertSuccessWithOutput(EXPECTED_RESULT);
+      return;
+    }
+    builder.run(parameters.getRuntime(), TestClass.class).assertSuccessWithOutput(EXPECTED_RESULT);
+  }
+
   public static class TestClass {
 
     record Person(String name, int age) {}
diff --git a/src/test/java/com/android/tools/r8/desugar/nestaccesscontrol/MethodParametersTest.java b/src/test/java/com/android/tools/r8/desugar/nestaccesscontrol/MethodParametersTest.java
index 3c7248a..b2ea090 100644
--- a/src/test/java/com/android/tools/r8/desugar/nestaccesscontrol/MethodParametersTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/nestaccesscontrol/MethodParametersTest.java
@@ -91,9 +91,9 @@
             parameters.isCfRuntime(),
             result ->
                 result.assertSuccessWithOutputLines(
-                    "Outer$Inner-IA, 1",
-                    "int, Outer$Inner-IA, 2",
-                    "int, int, Outer$Inner-IA, 3",
+                    "Outer-IA, 1",
+                    "int, Outer-IA, 2",
+                    "int, int, Outer-IA, 3",
                     "int, int, 2",
                     "int, 1",
                     "0"),
@@ -102,9 +102,9 @@
                     "0",
                     "int, 1",
                     "int, int, 2",
-                    "int, int, Outer$Inner-IA, 3",
-                    "int, Outer$Inner-IA, 2",
-                    "Outer$Inner-IA, 1"));
+                    "int, int, Outer-IA, 3",
+                    "int, Outer-IA, 2",
+                    "Outer-IA, 1"));
   }
 
   @Test
diff --git a/src/test/java/com/android/tools/r8/profile/art/completeness/NestBasedAccessBridgesProfileRewritingTest.java b/src/test/java/com/android/tools/r8/profile/art/completeness/NestBasedAccessBridgesProfileRewritingTest.java
index 5756f2e..2b2d2f0 100644
--- a/src/test/java/com/android/tools/r8/profile/art/completeness/NestBasedAccessBridgesProfileRewritingTest.java
+++ b/src/test/java/com/android/tools/r8/profile/art/completeness/NestBasedAccessBridgesProfileRewritingTest.java
@@ -107,7 +107,6 @@
     inspect(
         profileInspector,
         inspector,
-        false,
         parameters.canUseNestBasedAccessesWhenDesugaring(),
         false);
   }
@@ -117,7 +116,6 @@
     inspect(
         profileInspector,
         inspector,
-        parameters.canHaveNonReboundConstructorInvoke(),
         parameters.canUseNestBasedAccesses(),
         true);
   }
@@ -125,7 +123,6 @@
   private void inspect(
       ArtProfileInspector profileInspector,
       CodeInspector inspector,
-      boolean canHaveNonReboundConstructorInvoke,
       boolean canUseNestBasedAccesses,
       boolean isR8)
       throws Exception {
@@ -135,7 +132,7 @@
     ClassSubject syntheticConstructorArgumentClassSubject =
         inspector.clazz(
             SyntheticItemsTestUtils.syntheticNestConstructorArgumentClass(
-                Reference.classFromClass(NestMember.class)));
+                Reference.classFromClass(Main.class)));
     assertThat(
         syntheticConstructorArgumentClassSubject, notIf(isPresent(), canUseNestBasedAccesses));
 
diff --git a/third_party/openjdk/desugar_jdk_libs_11.tar.gz.sha1 b/third_party/openjdk/desugar_jdk_libs_11.tar.gz.sha1
index c5ef954..8779e19 100644
--- a/third_party/openjdk/desugar_jdk_libs_11.tar.gz.sha1
+++ b/third_party/openjdk/desugar_jdk_libs_11.tar.gz.sha1
@@ -1 +1 @@
-d50abf6c508c1332eb80f35f5631e99e2e8329b5
\ No newline at end of file
+5b02bd53b6df482392dbd41b04c137b0b3c99388
\ No newline at end of file
diff --git a/tools/desugar_jdk_libs_update.py b/tools/desugar_jdk_libs_update.py
index 3514cf8..d5282c7 100755
--- a/tools/desugar_jdk_libs_update.py
+++ b/tools/desugar_jdk_libs_update.py
@@ -52,13 +52,10 @@
         print("Building desugared library")
         bazel = os.path.join(utils.BAZEL_TOOL, 'lib', 'bazel', 'bin', 'bazel')
         with utils.ChangedWorkingDirectory(checkout_dir):
-            for target in [
-                    ':desugar_jdk_libs_jdk11', '//jdk11/src:java_base_chm_only'
-            ]:
-                subprocess.check_call([
-                    bazel, '--bazelrc=/dev/null', 'build',
-                    '--spawn_strategy=local', '--verbose_failures', target
-                ])
+            subprocess.check_call([
+                bazel, '--bazelrc=/dev/null', 'build',
+                '--spawn_strategy=local', '--verbose_failures', ':desugar_jdk_libs_jdk11'
+            ])
 
         openjdk_dir = join('third_party', 'openjdk')
         openjdk_subdir = 'desugar_jdk_libs_11'
@@ -72,11 +69,9 @@
         os.remove(join(openjdk_dir, openjdk_subdir + '.tar.gz'))
         os.remove(join(openjdk_dir, openjdk_subdir + '.tar.gz.sha1'))
         os.mkdir(dest_dir)
-        for s in [(join(src_dir, 'd8_java_base_selected_with_addon.jar'),
-                   join(dest_dir, 'desugar_jdk_libs.jar')),
-                  (join(src_dir, 'java_base_chm_only.jar'),
-                   join(dest_dir, 'desugar_jdk_libs_chm_only.jar'))]:
-            shutil.copyfile(s[0], s[1])
+        shutil.copyfile(
+            join(src_dir, 'd8_java_base_selected_with_addon.jar'),
+            join(dest_dir, 'desugar_jdk_libs.jar'))
         for f in metadata_files:
             shutil.copyfile(join(tmp_dir, f), join(dest_dir, f))
         desugar_jdk_libs_hash = os.path.join(dest_dir, 'desugar_jdk_libs_hash')