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