Merge "Field value propagation for DexItemBasedDexValues"
diff --git a/src/main/java/com/android/tools/r8/graph/DexEncodedMethod.java b/src/main/java/com/android/tools/r8/graph/DexEncodedMethod.java
index 3116ae9..f0c2669 100644
--- a/src/main/java/com/android/tools/r8/graph/DexEncodedMethod.java
+++ b/src/main/java/com/android/tools/r8/graph/DexEncodedMethod.java
@@ -689,8 +689,10 @@
assert !accessFlags.isStatic();
Builder builder =
builder(this).promoteToStatic().unsetOptimizationInfo().withoutThisParameter();
+ DexEncodedMethod method = builder.build();
+ method.copyMetadata(this);
setObsolete();
- return builder.build();
+ return method;
}
/**
diff --git a/src/main/java/com/android/tools/r8/graph/DexValue.java b/src/main/java/com/android/tools/r8/graph/DexValue.java
index af18b70..c582d0f 100644
--- a/src/main/java/com/android/tools/r8/graph/DexValue.java
+++ b/src/main/java/com/android/tools/r8/graph/DexValue.java
@@ -11,6 +11,7 @@
import com.android.tools.r8.ir.code.BasicBlock.ThrowingInfo;
import com.android.tools.r8.ir.code.ConstNumber;
import com.android.tools.r8.ir.code.ConstString;
+import com.android.tools.r8.ir.code.DexItemBasedConstString;
import com.android.tools.r8.ir.code.Instruction;
import com.android.tools.r8.ir.code.Value;
import com.android.tools.r8.ir.optimize.ReflectionOptimizer.ClassNameComputationInfo;
@@ -782,6 +783,17 @@
}
@Override
+ public Instruction asConstInstruction(
+ boolean hasClassInitializer, Value dest, InternalOptions options) {
+ DexItemBasedConstString instruction =
+ new DexItemBasedConstString(
+ dest, value, ThrowingInfo.defaultForConstString(options), classNameComputationInfo);
+ // DexItemBasedConstString cannot throw.
+ assert !instruction.instructionInstanceCanThrow();
+ return instruction;
+ }
+
+ @Override
public void writeTo(DexOutputBuffer dest, ObjectToOffsetMapping mapping) {
throw new Unreachable(
"DexItemBasedValueString values should always be rewritten into DexValueString");
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/MemberValuePropagation.java b/src/main/java/com/android/tools/r8/ir/optimize/MemberValuePropagation.java
index a3d879b..5d33d52 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/MemberValuePropagation.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/MemberValuePropagation.java
@@ -100,6 +100,9 @@
Value value = code.createValue(typeLattice, instruction.getLocalInfo());
replacement =
staticField.getStaticValue().asConstInstruction(false, value, appView.options());
+ if (replacement.isDexItemBasedConstString()) {
+ code.method.getMutableOptimizationInfo().markUseIdentifierNameString();
+ }
} else {
throw new CompilationError(field.clazz.toSourceString() + "." + field.name.toString()
+ " used in assumevalues rule does not exist.");
@@ -268,6 +271,9 @@
if (replacement != null) {
affectedValues.add(replacement.outValue());
iterator.replaceCurrentInstruction(replacement);
+ if (replacement.isDexItemBasedConstString()) {
+ code.method.getMutableOptimizationInfo().markUseIdentifierNameString();
+ }
return;
}
ProguardMemberRuleLookup lookup = lookupMemberRule(target);