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(