Introduce isMaterializableInAllContexts on SingleValue
Change-Id: Ie16c5984476029f1ca1394fba8515aca06b5d8e0
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/value/SingleConstClassValue.java b/src/main/java/com/android/tools/r8/ir/analysis/value/SingleConstClassValue.java
index 6261b05..897b31e 100644
--- a/src/main/java/com/android/tools/r8/ir/analysis/value/SingleConstClassValue.java
+++ b/src/main/java/com/android/tools/r8/ir/analysis/value/SingleConstClassValue.java
@@ -22,7 +22,7 @@
import com.android.tools.r8.ir.code.Value;
import com.android.tools.r8.shaking.AppInfoWithLiveness;
-public class SingleConstClassValue extends SingleValue {
+public class SingleConstClassValue extends SingleConstValue {
private final DexType type;
@@ -92,6 +92,17 @@
}
@Override
+ public boolean isMaterializableInAllContexts(AppView<?> appView) {
+ DexType baseType = type.toBaseType(appView.dexItemFactory());
+ if (baseType.isClassType()) {
+ DexClass clazz = appView.definitionFor(type);
+ return clazz != null && clazz.isPublic() && clazz.isResolvable(appView);
+ }
+ assert baseType.isPrimitiveType();
+ return true;
+ }
+
+ @Override
public SingleValue rewrittenWithLens(AppView<AppInfoWithLiveness> appView, GraphLense lens) {
assert lens.lookupType(type) == type;
return this;
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/value/SingleFieldValue.java b/src/main/java/com/android/tools/r8/ir/analysis/value/SingleFieldValue.java
index ef88fd3..8e48aad 100644
--- a/src/main/java/com/android/tools/r8/ir/analysis/value/SingleFieldValue.java
+++ b/src/main/java/com/android/tools/r8/ir/analysis/value/SingleFieldValue.java
@@ -9,6 +9,7 @@
import com.android.tools.r8.graph.AppInfoWithSubtyping;
import com.android.tools.r8.graph.AppView;
+import com.android.tools.r8.graph.DexClass;
import com.android.tools.r8.graph.DexEncodedField;
import com.android.tools.r8.graph.DexField;
import com.android.tools.r8.graph.DexType;
@@ -76,6 +77,24 @@
}
@Override
+ public boolean isMaterializableInAllContexts(AppView<?> appView) {
+ DexEncodedField encodedField = appView.appInfo().resolveField(field);
+ if (encodedField == null) {
+ assert false;
+ return false;
+ }
+ if (!encodedField.isPublic()) {
+ return false;
+ }
+ DexClass holder = appView.definitionFor(encodedField.holder());
+ if (holder == null) {
+ assert false;
+ return false;
+ }
+ return holder.isPublic();
+ }
+
+ @Override
public SingleValue rewrittenWithLens(AppView<AppInfoWithLiveness> appView, GraphLense lens) {
DexField rewrittenField = lens.lookupField(field);
assert !appView.unboxedEnums().containsEnum(field.holder)
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/value/SingleNumberValue.java b/src/main/java/com/android/tools/r8/ir/analysis/value/SingleNumberValue.java
index df49b54..b408c90 100644
--- a/src/main/java/com/android/tools/r8/ir/analysis/value/SingleNumberValue.java
+++ b/src/main/java/com/android/tools/r8/ir/analysis/value/SingleNumberValue.java
@@ -17,7 +17,7 @@
import com.android.tools.r8.ir.code.Value;
import com.android.tools.r8.shaking.AppInfoWithLiveness;
-public class SingleNumberValue extends SingleValue {
+public class SingleNumberValue extends SingleConstValue {
private final long value;
@@ -83,6 +83,11 @@
}
@Override
+ public boolean isMaterializableInAllContexts(AppView<?> appView) {
+ return true;
+ }
+
+ @Override
public SingleValue rewrittenWithLens(AppView<AppInfoWithLiveness> appView, GraphLense lens) {
return this;
}
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/value/SingleStringValue.java b/src/main/java/com/android/tools/r8/ir/analysis/value/SingleStringValue.java
index 9564584..a7439c0 100644
--- a/src/main/java/com/android/tools/r8/ir/analysis/value/SingleStringValue.java
+++ b/src/main/java/com/android/tools/r8/ir/analysis/value/SingleStringValue.java
@@ -22,7 +22,7 @@
import com.android.tools.r8.ir.code.Value;
import com.android.tools.r8.shaking.AppInfoWithLiveness;
-public class SingleStringValue extends SingleValue {
+public class SingleStringValue extends SingleConstValue {
private final DexString string;
@@ -88,6 +88,11 @@
}
@Override
+ public boolean isMaterializableInAllContexts(AppView<?> appView) {
+ return true;
+ }
+
+ @Override
public SingleValue rewrittenWithLens(AppView<AppInfoWithLiveness> appView, GraphLense lens) {
return this;
}
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/value/SingleValue.java b/src/main/java/com/android/tools/r8/ir/analysis/value/SingleValue.java
index 6bb2942..1b3e59a 100644
--- a/src/main/java/com/android/tools/r8/ir/analysis/value/SingleValue.java
+++ b/src/main/java/com/android/tools/r8/ir/analysis/value/SingleValue.java
@@ -40,6 +40,8 @@
public abstract boolean isMaterializableInContext(AppView<?> appView, DexType context);
+ public abstract boolean isMaterializableInAllContexts(AppView<?> appView);
+
@Override
public abstract SingleValue rewrittenWithLens(
AppView<AppInfoWithLiveness> appView, GraphLense lens);