Leverage Instruction.getAbstractValue() from Value.getAbstractValue()
Change-Id: I7cba428eaf454ad63be730ad5796d96a33a68e51
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 d9f4e2d..0605623 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
@@ -109,7 +109,7 @@
if (isConstantArrayThroughoutMethod(root, assumedNotToDependOnEnvironment)) {
return false;
}
- if (root.getAbstractValue(appView).isSingleEnumValue()) {
+ if (root.getAbstractValue(appView, context).isSingleEnumValue()) {
return false;
}
if (isNewInstanceWithoutEnvironmentDependentFields(root, assumedNotToDependOnEnvironment)) {
diff --git a/src/main/java/com/android/tools/r8/ir/code/Value.java b/src/main/java/com/android/tools/r8/ir/code/Value.java
index c7aeff1..f9ca31d 100644
--- a/src/main/java/com/android/tools/r8/ir/code/Value.java
+++ b/src/main/java/com/android/tools/r8/ir/code/Value.java
@@ -9,7 +9,6 @@
import com.android.tools.r8.graph.AppView;
import com.android.tools.r8.graph.DebugLocalInfo;
import com.android.tools.r8.graph.DexClass;
-import com.android.tools.r8.graph.DexEncodedField;
import com.android.tools.r8.graph.DexMethod;
import com.android.tools.r8.graph.DexType;
import com.android.tools.r8.ir.analysis.type.ClassTypeLatticeElement;
@@ -847,7 +846,7 @@
return definition.isOutConstant() && !hasLocalInfo();
}
- public AbstractValue getAbstractValue(AppView<?> appView) {
+ public AbstractValue getAbstractValue(AppView<?> appView, DexType context) {
if (!appView.enableWholeProgramOptimizations()) {
return UnknownValue.getInstance();
}
@@ -857,15 +856,7 @@
return UnknownValue.getInstance();
}
- if (root.definition.isFieldGet()) {
- FieldInstruction fieldGet = root.definition.asFieldInstruction();
- DexEncodedField field = appView.appInfo().resolveField(fieldGet.getField());
- if (field != null) {
- return field.getOptimizationInfo().getAbstractValue();
- }
- }
-
- return UnknownValue.getInstance();
+ return root.definition.getAbstractValue(appView, context);
}
public boolean isPhi() {
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/CodeRewriter.java b/src/main/java/com/android/tools/r8/ir/optimize/CodeRewriter.java
index e1c583d..2c04604 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/CodeRewriter.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/CodeRewriter.java
@@ -2542,9 +2542,10 @@
}
}
} else {
- AbstractValue abstractValue = lhs.getAbstractValue(appView);
+ DexType context = code.method.method.holder;
+ AbstractValue abstractValue = lhs.getAbstractValue(appView, context);
if (abstractValue.isSingleEnumValue()) {
- AbstractValue otherAbstractValue = rhs.getAbstractValue(appView);
+ AbstractValue otherAbstractValue = rhs.getAbstractValue(appView, context);
if (abstractValue == otherAbstractValue) {
simplifyIfWithKnownCondition(code, block, theIf, 0);
} else if (otherAbstractValue.isSingleEnumValue()) {
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/ConstantCanonicalizer.java b/src/main/java/com/android/tools/r8/ir/optimize/ConstantCanonicalizer.java
index f53d6d8..1382317 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/ConstantCanonicalizer.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/ConstantCanonicalizer.java
@@ -131,7 +131,7 @@
}
// Only canonicalize enum values. This is only OK if the instruction cannot have side effects.
if (current.isStaticGet()) {
- if (!current.outValue().getAbstractValue(appView).isSingleEnumValue()) {
+ if (!current.outValue().getAbstractValue(appView, context).isSingleEnumValue()) {
continue;
}
if (current.instructionMayHaveSideEffects(appView, context)) {