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);