Version 2.0.22

Conservatively look at all code for identifier name string instructions
when minifying.

Also fix a concrete case which was discovered after the merge in 2.0.21.

This is not merged from master as the code has diverged there.

Bug: 148021799
Change-Id: I8f2a78dc1c0017074fabff82943ea47ee80b7018
diff --git a/src/main/java/com/android/tools/r8/Version.java b/src/main/java/com/android/tools/r8/Version.java
index 40eaf83..62988d6 100644
--- a/src/main/java/com/android/tools/r8/Version.java
+++ b/src/main/java/com/android/tools/r8/Version.java
@@ -11,7 +11,7 @@
 
   // This field is accessed from release scripts using simple pattern matching.
   // Therefore, changing this field could break our release scripts.
-  public static final String LABEL = "2.0.21";
+  public static final String LABEL = "2.0.22";
 
   private Version() {
   }
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 1971ae0..7b6df447 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
@@ -400,10 +400,11 @@
     }
   }
 
-  private void synthesizeLambdaClasses(Builder<?> builder, ExecutorService executorService)
+  private void synthesizeLambdaClasses(
+      Builder<?> builder, OptimizationFeedback feedback, ExecutorService executorService)
       throws ExecutionException {
     if (lambdaRewriter != null) {
-      lambdaRewriter.adjustAccessibility(this);
+      lambdaRewriter.adjustAccessibility(this, feedback);
       lambdaRewriter.synthesizeLambdaClasses(builder);
       lambdaRewriter.optimizeSynthesizedClasses(this, executorService);
     }
@@ -467,7 +468,7 @@
     builder.setHighestSortingString(highestSortingString);
 
     desugarNestBasedAccess(builder, executor);
-    synthesizeLambdaClasses(builder, executor);
+    synthesizeLambdaClasses(builder, simpleOptimizationFeedback, executor);
     desugarInterfaceMethods(builder, simpleOptimizationFeedback, ExcludeDexResources, executor);
     synthesizeTwrCloseResourceUtilityClass(builder, executor);
     synthesizeJava8UtilityClass(builder, executor);
@@ -714,7 +715,7 @@
     builder.setHighestSortingString(highestSortingString);
 
     printPhase("Lambda class synthesis");
-    synthesizeLambdaClasses(builder, executorService);
+    synthesizeLambdaClasses(builder, feedback, executorService);
 
     printPhase("Interface method desugaring");
     desugarInterfaceMethods(builder, feedback, IncludeAllResources, executorService);
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/LambdaClass.java b/src/main/java/com/android/tools/r8/ir/desugar/LambdaClass.java
index 18edf5f..4254d23 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/LambdaClass.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/LambdaClass.java
@@ -28,6 +28,7 @@
 import com.android.tools.r8.ir.code.Invoke;
 import com.android.tools.r8.ir.code.Invoke.Type;
 import com.android.tools.r8.ir.conversion.IRConverter;
+import com.android.tools.r8.ir.optimize.info.OptimizationFeedback;
 import com.android.tools.r8.ir.synthetic.SynthesizedCode;
 import com.android.tools.r8.origin.SynthesizedOrigin;
 import com.android.tools.r8.utils.InternalOptions;
@@ -510,7 +511,7 @@
     }
 
     // Ensure access of the referenced symbol(s).
-    abstract void ensureAccessibility(IRConverter converter);
+    abstract void ensureAccessibility(IRConverter converter, OptimizationFeedback feedback);
 
     DexClass definitionFor(DexType type) {
       return rewriter.getAppInfo().app().definitionFor(type);
@@ -553,7 +554,7 @@
     }
 
     @Override
-    void ensureAccessibility(IRConverter converter) {}
+    void ensureAccessibility(IRConverter converter, OptimizationFeedback feedback) {}
   }
 
   // Used for static private lambda$ methods. Only needs access relaxation.
@@ -564,7 +565,7 @@
     }
 
     @Override
-    void ensureAccessibility(IRConverter converter) {
+    void ensureAccessibility(IRConverter converter, OptimizationFeedback feedback) {
       // We already found the static method to be called, just relax its accessibility.
       assert descriptor.getAccessibility() != null;
       descriptor.getAccessibility().unsetPrivate();
@@ -584,7 +585,7 @@
     }
 
     @Override
-    void ensureAccessibility(IRConverter converter) {
+    void ensureAccessibility(IRConverter converter, OptimizationFeedback feedback) {
       // For all instantiation points for which the compiler creates lambda$
       // methods, it creates these methods in the same class/interface.
       DexMethod implMethod = descriptor.implHandle.asMethod();
@@ -610,7 +611,7 @@
                   encodedMethod.parameterAnnotationsList,
                   encodedMethod.getCode(),
                   true);
-          newMethod.copyMetadata(encodedMethod);
+          newMethod.copyMetadata(encodedMethod, feedback);
           rewriter.methodMapping.put(encodedMethod.method, callTarget);
 
           DexEncodedMethod.setDebugInfoWithFakeThisParameter(
@@ -632,7 +633,7 @@
     }
 
     @Override
-    void ensureAccessibility(IRConverter converter) {
+    void ensureAccessibility(IRConverter converter, OptimizationFeedback feedback) {
       // For all instantiation points for which the compiler creates lambda$
       // methods, it creates these methods in the same class/interface.
       DexMethod implMethod = descriptor.implHandle.asMethod();
@@ -655,7 +656,7 @@
                   encodedMethod.parameterAnnotationsList,
                   encodedMethod.getCode(),
                   true);
-          newMethod.copyMetadata(encodedMethod);
+          newMethod.copyMetadata(encodedMethod, feedback);
           rewriter.methodMapping.put(encodedMethod.method, callTarget);
           // Move the method from the direct methods to the virtual methods set.
           implMethodHolder.removeDirectMethod(i);
@@ -675,7 +676,7 @@
     }
 
     @Override
-    void ensureAccessibility(IRConverter converter) {
+    void ensureAccessibility(IRConverter converter, OptimizationFeedback feedback) {
       // Create a static accessor with proper accessibility.
       DexProgramClass accessorClass = programDefinitionFor(callTarget.holder);
       assert accessorClass != null;
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/LambdaRewriter.java b/src/main/java/com/android/tools/r8/ir/desugar/LambdaRewriter.java
index 92d04f0..7a2a30f 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/LambdaRewriter.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/LambdaRewriter.java
@@ -33,6 +33,7 @@
 import com.android.tools.r8.ir.code.Value;
 import com.android.tools.r8.ir.conversion.IRConverter;
 import com.android.tools.r8.ir.conversion.LensCodeRewriter;
+import com.android.tools.r8.ir.optimize.info.OptimizationFeedback;
 import com.android.tools.r8.ir.optimize.info.OptimizationFeedbackDelayed;
 import com.android.tools.r8.shaking.AppInfoWithLiveness;
 import com.android.tools.r8.utils.DescriptorUtils;
@@ -250,13 +251,13 @@
   }
 
   /** Adjust accessibility of referenced application symbols or creates necessary accessors. */
-  public void adjustAccessibility(IRConverter converter) {
+  public void adjustAccessibility(IRConverter converter, OptimizationFeedback feedback) {
     // For each lambda class perform necessary adjustment of the
     // referenced symbols to make them accessible. This can result in
     // method access relaxation or creation of accessor method.
     for (LambdaClass lambdaClass : knownLambdaClasses.values()) {
       // This call may cause methodMapping to be updated.
-      lambdaClass.target.ensureAccessibility(converter);
+      lambdaClass.target.ensureAccessibility(converter, feedback);
     }
     if (getAppView().enableWholeProgramOptimizations() && !methodMapping.isEmpty()) {
       getAppView()
diff --git a/src/main/java/com/android/tools/r8/naming/IdentifierMinifier.java b/src/main/java/com/android/tools/r8/naming/IdentifierMinifier.java
index 481a46c..dad4c94 100644
--- a/src/main/java/com/android/tools/r8/naming/IdentifierMinifier.java
+++ b/src/main/java/com/android/tools/r8/naming/IdentifierMinifier.java
@@ -157,7 +157,13 @@
           || (encodedMethod.getCode().isCfCode()
               && encodedMethod.getCode().asCfCode().instructions.stream()
                   .noneMatch(CfInstruction::isDexItemBasedConstString));
-      return;
+      // This return statement is commented out on the 2.0 branch. The change merged to fix
+      // b/147718617 (version 2.0.21) revealed that there could be other places where the
+      // identifier name string marker is not propagated. Due to changes to desugaring on the 2.1
+      // version line coverage of the propagation of this flag is unknown. Conservatively looking
+      // at all code for identifier name string instructions is safer.
+      //
+      // return;
     }
     Code code = encodedMethod.getCode();
     assert code != null;