Split FieldValueAnalysis into InstanceFieldValueAnalysis and StaticFieldValueAnalysis

No functional changes.

Change-Id: I730fce65ed6eccba31f3bdf8fee0253f306670b2
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/fieldvalueanalysis/FieldValueAnalysis.java b/src/main/java/com/android/tools/r8/ir/analysis/fieldvalueanalysis/FieldValueAnalysis.java
index 35bbf2f..29dc41b 100644
--- a/src/main/java/com/android/tools/r8/ir/analysis/fieldvalueanalysis/FieldValueAnalysis.java
+++ b/src/main/java/com/android/tools/r8/ir/analysis/fieldvalueanalysis/FieldValueAnalysis.java
@@ -43,7 +43,7 @@
 import java.util.Map;
 import java.util.Map.Entry;
 
-public class FieldValueAnalysis {
+public abstract class FieldValueAnalysis {
 
   private final AppView<AppInfoWithLiveness> appView;
   private final DexProgramClass clazz;
@@ -53,7 +53,7 @@
 
   private Map<BasicBlock, AbstractFieldSet> fieldsMaybeReadBeforeBlockInclusiveCache;
 
-  private FieldValueAnalysis(
+  FieldValueAnalysis(
       AppView<AppInfoWithLiveness> appView,
       IRCode code,
       OptimizationFeedback feedback,
@@ -68,37 +68,6 @@
     this.method = method;
   }
 
-  public static void run(
-      AppView<?> appView,
-      IRCode code,
-      ClassInitializerDefaultsResult classInitializerDefaultsResult,
-      OptimizationFeedback feedback,
-      DexEncodedMethod method) {
-    if (!appView.enableWholeProgramOptimizations()) {
-      return;
-    }
-    assert appView.appInfo().hasLiveness();
-    if (!method.isInitializer()) {
-      return;
-    }
-    DexProgramClass clazz = appView.definitionFor(method.method.holder).asProgramClass();
-    if (method.isInstanceInitializer()) {
-      if (!appView.options().enableValuePropagationForInstanceFields) {
-        return;
-      }
-      DexEncodedMethod otherInstanceInitializer =
-          clazz.lookupDirectMethod(other -> other.isInstanceInitializer() && other != method);
-      if (otherInstanceInitializer != null) {
-        // Conservatively bail out.
-        // TODO(b/125282093): Handle multiple instance initializers on the same class.
-        return;
-      }
-    }
-
-    new FieldValueAnalysis(appView.withLiveness(), code, feedback, clazz, method)
-        .computeFieldOptimizationInfo(classInitializerDefaultsResult);
-  }
-
   private Map<BasicBlock, AbstractFieldSet> getOrCreateFieldsMaybeReadBeforeBlockInclusive() {
     if (fieldsMaybeReadBeforeBlockInclusiveCache == null) {
       fieldsMaybeReadBeforeBlockInclusiveCache = createFieldsMaybeReadBeforeBlockInclusive();
@@ -107,8 +76,7 @@
   }
 
   /** This method analyzes initializers with the purpose of computing field optimization info. */
-  private void computeFieldOptimizationInfo(
-      ClassInitializerDefaultsResult classInitializerDefaultsResult) {
+  void computeFieldOptimizationInfo(ClassInitializerDefaultsResult classInitializerDefaultsResult) {
     AppInfoWithLiveness appInfo = appView.appInfo();
     DominatorTree dominatorTree = null;
 
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/fieldvalueanalysis/InstanceFieldValueAnalysis.java b/src/main/java/com/android/tools/r8/ir/analysis/fieldvalueanalysis/InstanceFieldValueAnalysis.java
new file mode 100644
index 0000000..d636715
--- /dev/null
+++ b/src/main/java/com/android/tools/r8/ir/analysis/fieldvalueanalysis/InstanceFieldValueAnalysis.java
@@ -0,0 +1,49 @@
+// Copyright (c) 2020, the R8 project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+package com.android.tools.r8.ir.analysis.fieldvalueanalysis;
+
+import com.android.tools.r8.graph.AppView;
+import com.android.tools.r8.graph.DexEncodedMethod;
+import com.android.tools.r8.graph.DexProgramClass;
+import com.android.tools.r8.ir.code.IRCode;
+import com.android.tools.r8.ir.optimize.ClassInitializerDefaultsOptimization.ClassInitializerDefaultsResult;
+import com.android.tools.r8.ir.optimize.info.OptimizationFeedback;
+import com.android.tools.r8.shaking.AppInfoWithLiveness;
+
+public class InstanceFieldValueAnalysis extends FieldValueAnalysis {
+
+  private InstanceFieldValueAnalysis(
+      AppView<AppInfoWithLiveness> appView,
+      IRCode code,
+      OptimizationFeedback feedback,
+      DexProgramClass clazz,
+      DexEncodedMethod method) {
+    super(appView, code, feedback, clazz, method);
+  }
+
+  public static void run(
+      AppView<?> appView,
+      IRCode code,
+      ClassInitializerDefaultsResult classInitializerDefaultsResult,
+      OptimizationFeedback feedback,
+      DexEncodedMethod method) {
+    assert appView.appInfo().hasLiveness();
+    assert appView.enableWholeProgramOptimizations();
+    assert method.isInstanceInitializer();
+    DexProgramClass clazz = appView.definitionFor(method.method.holder).asProgramClass();
+    if (!appView.options().enableValuePropagationForInstanceFields) {
+      return;
+    }
+    DexEncodedMethod otherInstanceInitializer =
+        clazz.lookupDirectMethod(other -> other.isInstanceInitializer() && other != method);
+    if (otherInstanceInitializer != null) {
+      // Conservatively bail out.
+      // TODO(b/125282093): Handle multiple instance initializers on the same class.
+      return;
+    }
+    new InstanceFieldValueAnalysis(appView.withLiveness(), code, feedback, clazz, method)
+        .computeFieldOptimizationInfo(classInitializerDefaultsResult);
+  }
+}
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/fieldvalueanalysis/StaticFieldValueAnalysis.java b/src/main/java/com/android/tools/r8/ir/analysis/fieldvalueanalysis/StaticFieldValueAnalysis.java
new file mode 100644
index 0000000..0c91855
--- /dev/null
+++ b/src/main/java/com/android/tools/r8/ir/analysis/fieldvalueanalysis/StaticFieldValueAnalysis.java
@@ -0,0 +1,39 @@
+// Copyright (c) 2020, the R8 project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+package com.android.tools.r8.ir.analysis.fieldvalueanalysis;
+
+import com.android.tools.r8.graph.AppView;
+import com.android.tools.r8.graph.DexEncodedMethod;
+import com.android.tools.r8.graph.DexProgramClass;
+import com.android.tools.r8.ir.code.IRCode;
+import com.android.tools.r8.ir.optimize.ClassInitializerDefaultsOptimization.ClassInitializerDefaultsResult;
+import com.android.tools.r8.ir.optimize.info.OptimizationFeedback;
+import com.android.tools.r8.shaking.AppInfoWithLiveness;
+
+public class StaticFieldValueAnalysis extends FieldValueAnalysis {
+
+  private StaticFieldValueAnalysis(
+      AppView<AppInfoWithLiveness> appView,
+      IRCode code,
+      OptimizationFeedback feedback,
+      DexProgramClass clazz,
+      DexEncodedMethod method) {
+    super(appView, code, feedback, clazz, method);
+  }
+
+  public static void run(
+      AppView<?> appView,
+      IRCode code,
+      ClassInitializerDefaultsResult classInitializerDefaultsResult,
+      OptimizationFeedback feedback,
+      DexEncodedMethod method) {
+    assert appView.appInfo().hasLiveness();
+    assert appView.enableWholeProgramOptimizations();
+    assert method.isClassInitializer();
+    DexProgramClass clazz = appView.definitionFor(method.method.holder).asProgramClass();
+    new StaticFieldValueAnalysis(appView.withLiveness(), code, feedback, clazz, method)
+        .computeFieldOptimizationInfo(classInitializerDefaultsResult);
+  }
+}
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 4b82f19..94df8fb 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
@@ -27,7 +27,8 @@
 import com.android.tools.r8.ir.analysis.TypeChecker;
 import com.android.tools.r8.ir.analysis.constant.SparseConditionalConstantPropagation;
 import com.android.tools.r8.ir.analysis.fieldaccess.FieldAccessAnalysis;
-import com.android.tools.r8.ir.analysis.fieldvalueanalysis.FieldValueAnalysis;
+import com.android.tools.r8.ir.analysis.fieldvalueanalysis.InstanceFieldValueAnalysis;
+import com.android.tools.r8.ir.analysis.fieldvalueanalysis.StaticFieldValueAnalysis;
 import com.android.tools.r8.ir.analysis.type.TypeLatticeElement;
 import com.android.tools.r8.ir.code.AlwaysMaterializingDefinition;
 import com.android.tools.r8.ir.code.AlwaysMaterializingUser;
@@ -1564,7 +1565,16 @@
 
     methodOptimizationInfoCollector
         .collectMethodOptimizationInfo(code.method, code, feedback, dynamicTypeOptimization);
-    FieldValueAnalysis.run(appView, code, classInitializerDefaultsResult, feedback, code.method);
+
+    if (method.isInitializer()) {
+      if (method.isClassInitializer()) {
+        StaticFieldValueAnalysis.run(
+            appView, code, classInitializerDefaultsResult, feedback, code.method);
+      } else {
+        InstanceFieldValueAnalysis.run(
+            appView, code, classInitializerDefaultsResult, feedback, code.method);
+      }
+    }
   }
 
   public void removeDeadCodeAndFinalizeIR(