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);
   }
