Minor cleanups regarding -identifiernamestring

Bug: 133167042
Change-Id: I17500fe7d2d948861828146c17e57f401901186d
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 3926640..d802627 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
@@ -1174,7 +1174,12 @@
     // Note that we place this at the end of IR processing because inlinee can be inlined by
     // Inliner, ClassInliner, or future optimizations that use the inlining machinery.
     if (method.getOptimizationInfo().useIdentifierNameString()) {
-      feedback.markUseIdentifierNameString(method);
+      // If it is optimized, e.g., moved to default values of static fields or even removed by dead
+      // code remover, we can save future computation in IdentifierMinifier.
+      if (Streams.stream(code.instructionIterator())
+          .anyMatch(Instruction::isDexItemBasedConstString)) {
+        feedback.markUseIdentifierNameString(method);
+      }
     } else {
       assert Streams.stream(code.instructionIterator())
           .noneMatch(Instruction::isDexItemBasedConstString);
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 d869977..0295731 100644
--- a/src/main/java/com/android/tools/r8/naming/IdentifierMinifier.java
+++ b/src/main/java/com/android/tools/r8/naming/IdentifierMinifier.java
@@ -25,6 +25,7 @@
 import com.android.tools.r8.graph.DexValue.DexValueString;
 import com.android.tools.r8.shaking.AppInfoWithLiveness;
 import com.android.tools.r8.shaking.ProguardClassFilter;
+import java.util.Arrays;
 import java.util.List;
 import java.util.Map;
 
@@ -122,7 +123,9 @@
       for (DexEncodedField field : clazz.staticFields()) {
         replaceDexItemBasedConstStringInStaticField(field);
       }
-      clazz.forEachMethod(this::replaceDexItemBasedConstStringInMethod);
+      clazz
+          .methods(DexEncodedMethod::hasCode)
+          .forEach(this::replaceDexItemBasedConstStringInMethod);
     }
   }
 
@@ -146,21 +149,21 @@
 
   private void replaceDexItemBasedConstStringInMethod(DexEncodedMethod encodedMethod) {
     if (!encodedMethod.getOptimizationInfo().useIdentifierNameString()) {
-      return;
-    }
-    // Abstract methods do not have code_item.
-    if (encodedMethod.shouldNotHaveCode()) {
+      assert (encodedMethod.getCode().isDexCode()
+              && Arrays.stream(encodedMethod.getCode().asDexCode().instructions)
+                  .noneMatch(Instruction::isDexItemBasedConstString))
+          || (encodedMethod.getCode().isCfCode()
+              && encodedMethod.getCode().asCfCode().instructions.stream()
+                  .noneMatch(CfInstruction::isDexItemBasedConstString));
       return;
     }
     Code code = encodedMethod.getCode();
-    if (code == null) {
-      return;
-    }
+    assert code != null;
     if (code.isDexCode()) {
       Instruction[] instructions = code.asDexCode().instructions;
       for (int i = 0; i < instructions.length; ++i) {
         Instruction instruction = instructions[i];
-        if (instruction instanceof DexItemBasedConstString) {
+        if (instruction.isDexItemBasedConstString()) {
           DexItemBasedConstString cnst = instruction.asDexItemBasedConstString();
           DexString replacement =
               cnst.getClassNameComputationInfo().needsToComputeClassName()
diff --git a/src/main/java/com/android/tools/r8/naming/IdentifierNameStringMarker.java b/src/main/java/com/android/tools/r8/naming/IdentifierNameStringMarker.java
index 1a26ef6..1197a4a 100644
--- a/src/main/java/com/android/tools/r8/naming/IdentifierNameStringMarker.java
+++ b/src/main/java/com/android/tools/r8/naming/IdentifierNameStringMarker.java
@@ -282,10 +282,7 @@
   }
 
   private void warnUndeterminedIdentifierIfNecessary(
-      DexReference member,
-      DexType originHolder,
-      Instruction instruction,
-      DexString original) {
+      DexReference member, DexType originHolder, Instruction instruction, DexString original) {
     assert member.isDexField() || member.isDexMethod();
     // Only issue warnings for -identifiernamestring rules explicitly added by the user.
     boolean matchedByExplicitRule = identifierNameStrings.getBoolean(member);
@@ -298,11 +295,11 @@
       return;
     }
     // Undetermined identifiers matter only if minification is enabled.
-    if (!appView.options().getProguardConfiguration().isObfuscating()) {
+    if (!appView.options().isMinifying()) {
       return;
     }
     Origin origin = appView.appInfo().originFor(originHolder);
-    String kind = member instanceof DexField ? "field" : "method";
+    String kind = member.isDexField() ? "field" : "method";
     String originalMessage = original == null ? "what identifier string flows to "
         : "what '" + original.toString() + "' refers to, which flows to ";
     String message =
@@ -312,8 +309,8 @@
             + " are renamed, which can cause resolution failures at runtime.";
     StringDiagnostic diagnostic =
         instruction.getPosition().line >= 1
-            ? new StringDiagnostic(message, origin,
-            new TextPosition(0L, instruction.getPosition().line, 1))
+            ? new StringDiagnostic(
+                message, origin, new TextPosition(0L, instruction.getPosition().line, 1))
             : new StringDiagnostic(message, origin);
     appView.options().reporter.warning(diagnostic);
   }