Merge "Field value propagation for DexItemBasedDexValues"
diff --git a/src/main/java/com/android/tools/r8/ir/conversion/CallGraph.java b/src/main/java/com/android/tools/r8/ir/conversion/CallGraph.java
index 5df591c..f8702db 100644
--- a/src/main/java/com/android/tools/r8/ir/conversion/CallGraph.java
+++ b/src/main/java/com/android/tools/r8/ir/conversion/CallGraph.java
@@ -8,6 +8,7 @@
 import com.android.tools.r8.graph.AppView;
 import com.android.tools.r8.graph.DexApplication;
 import com.android.tools.r8.graph.DexClass;
+import com.android.tools.r8.graph.DexEncodedField;
 import com.android.tools.r8.graph.DexEncodedMethod;
 import com.android.tools.r8.graph.DexField;
 import com.android.tools.r8.graph.DexMethod;
@@ -497,14 +498,14 @@
 
     private void addClassInitializerTarget(DexClass clazz) {
       assert clazz != null;
-      if (clazz.hasClassInitializer() && !clazz.isLibraryClass()) {
-        DexEncodedMethod possibleTarget = clazz.getClassInitializer();
-        addTarget(possibleTarget);
+      if (clazz.hasClassInitializer() && clazz.isProgramClass()) {
+        addTarget(clazz.getClassInitializer());
       }
     }
 
     private void addClassInitializerTarget(DexType type) {
-      DexClass clazz = appInfo.definitionFor(type.toBaseType(appInfo.dexItemFactory));
+      assert type.isClassType();
+      DexClass clazz = appInfo.definitionFor(type);
       if (clazz != null) {
         addClassInitializerTarget(clazz);
       }
@@ -540,15 +541,19 @@
       DexEncodedMethod definition = appInfo.lookup(type, method, source.method.holder);
       if (definition != null) {
         assert !source.accessFlags.isBridge() || definition != caller.method;
-        DexClass definitionHolder = appInfo.definitionFor(definition.method.getHolder());
-        assert definitionHolder != null;
-        if (!definitionHolder.isLibraryClass()) {
-          addClassInitializerTarget(definitionHolder);
+        DexClass clazz = appInfo.definitionFor(definition.method.getHolder());
+        assert clazz != null;
+        if (clazz.isProgramClass()) {
+          // For static invokes, the class could be initialized.
+          if (type == Type.STATIC) {
+            addClassInitializerTarget(clazz);
+          }
+
           addTarget(definition);
           // For virtual and interface calls add all potential targets that could be called.
           if (type == Type.VIRTUAL || type == Type.INTERFACE) {
             Set<DexEncodedMethod> possibleTargets;
-            if (definitionHolder.isInterface()) {
+            if (clazz.isInterface()) {
               possibleTargets = appInfo.lookupInterfaceTargets(definition.method);
             } else {
               possibleTargets = appInfo.lookupVirtualTargets(definition.method);
@@ -561,7 +566,12 @@
 
     private void processFieldAccess(DexField field) {
       // Any field access implicitly calls the class initializer.
-      addClassInitializerTarget(field.getHolder());
+      if (field.clazz.isClassType()) {
+        DexEncodedField encodedField = appInfo.resolveFieldOn(field.clazz, field);
+        if (encodedField != null && encodedField.isStatic()) {
+          addClassInitializerTarget(field.getHolder());
+        }
+      }
     }
 
     @Override
@@ -608,7 +618,9 @@
 
     @Override
     public boolean registerNewInstance(DexType type) {
-      addClassInitializerTarget(type);
+      if (type.isClassType()) {
+        addClassInitializerTarget(type);
+      }
       return false;
     }