Simplify value-may-depend-on-environment analysis
Bug: 150269949
Change-Id: I33933fe00e9a19bed9b62960ff5e383106b92293
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/ValueMayDependOnEnvironmentAnalysis.java b/src/main/java/com/android/tools/r8/ir/analysis/ValueMayDependOnEnvironmentAnalysis.java
index 05416df..f417d65 100644
--- a/src/main/java/com/android/tools/r8/ir/analysis/ValueMayDependOnEnvironmentAnalysis.java
+++ b/src/main/java/com/android/tools/r8/ir/analysis/ValueMayDependOnEnvironmentAnalysis.java
@@ -20,16 +20,12 @@
import com.android.tools.r8.ir.code.NewArrayEmpty;
import com.android.tools.r8.ir.code.NewArrayFilledData;
import com.android.tools.r8.ir.code.NewInstance;
-import com.android.tools.r8.ir.code.StaticGet;
import com.android.tools.r8.ir.code.StaticPut;
import com.android.tools.r8.ir.code.Value;
import com.android.tools.r8.ir.optimize.info.initializer.InstanceInitializerInfo;
-import com.android.tools.r8.utils.ListUtils;
import com.android.tools.r8.utils.LongInterval;
import com.google.common.collect.ImmutableSet;
import com.google.common.collect.Sets;
-import java.util.ArrayList;
-import java.util.IdentityHashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
@@ -119,9 +115,6 @@
if (isNewInstanceWithoutEnvironmentDependentFields(root, assumedNotToDependOnEnvironment)) {
return false;
}
- if (isAliasOfValueThatIsIndependentOfEnvironment(root, assumedNotToDependOnEnvironment)) {
- return false;
- }
return true;
} finally {
boolean changed = visited.remove(root);
@@ -414,49 +407,4 @@
return false;
}
-
- private boolean isAliasOfValueThatIsIndependentOfEnvironment(
- Value value, Set<Value> assumedNotToDependOnEnvironment) {
- // If we are inside a class initializer, and we are reading a final field of the enclosing
- // class, then check if there is a single write to that field in the class initializer, and that
- // the value being written into that field does not depend on the environment.
- //
- // The reason why we do not currently treat final fields that are written in multiple places is
- // that the value of the field could then be dependent on the environment due to the control
- // flow.
- if (code.method.isClassInitializer()) {
- assert !value.hasAliasedValue();
- if (value.isPhi()) {
- return false;
- }
- Instruction definition = value.definition;
- if (definition.isStaticGet()) {
- StaticGet staticGet = definition.asStaticGet();
- DexEncodedField field = appView.appInfo().resolveField(staticGet.getField());
- if (field != null && field.holder() == context) {
- List<StaticPut> finalFieldPuts = computeFinalFieldPuts().get(field);
- if (finalFieldPuts == null || finalFieldPuts.size() != 1) {
- return false;
- }
- StaticPut staticPut = ListUtils.first(finalFieldPuts);
- return !valueMayDependOnEnvironment(staticPut.value(), assumedNotToDependOnEnvironment);
- }
- }
- }
- return false;
- }
-
- private Map<DexEncodedField, List<StaticPut>> computeFinalFieldPuts() {
- assert code.method.isClassInitializer();
- if (finalFieldPuts == null) {
- finalFieldPuts = new IdentityHashMap<>();
- for (StaticPut staticPut : code.<StaticPut>instructions(Instruction::isStaticPut)) {
- DexEncodedField field = appView.appInfo().resolveField(staticPut.getField());
- if (field != null && field.holder() == context && field.isFinal()) {
- finalFieldPuts.computeIfAbsent(field, ignore -> new ArrayList<>()).add(staticPut);
- }
- }
- }
- return finalFieldPuts;
- }
}