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