Merge "Towards a single accessor of attached type lattice in Value."
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/type/TypeAnalysis.java b/src/main/java/com/android/tools/r8/ir/analysis/type/TypeAnalysis.java
index ab77424..6a0b9bc 100644
--- a/src/main/java/com/android/tools/r8/ir/analysis/type/TypeAnalysis.java
+++ b/src/main/java/com/android/tools/r8/ir/analysis/type/TypeAnalysis.java
@@ -110,7 +110,7 @@
   private void updateTypeOfValue(Value value, TypeLatticeElement type) {
     assert mode != Mode.UNSET;
 
-    TypeLatticeElement current = value.getTypeLatticeRaw();
+    TypeLatticeElement current = value.getTypeLattice();
     if (current.equals(type)) {
       return;
     }
@@ -143,7 +143,7 @@
   private TypeLatticeElement computePhiType(Phi phi) {
     // Type of phi(v1, v2, ..., vn) is the least upper bound of all those n operands.
     return TypeLatticeElement.join(
-        appInfo, phi.getOperands().stream().map(Value::getTypeLatticeRaw));
+        appInfo, phi.getOperands().stream().map(Value::getTypeLattice));
   }
 
   public static DexType getRefinedReceiverType(
diff --git a/src/main/java/com/android/tools/r8/ir/code/Argument.java b/src/main/java/com/android/tools/r8/ir/code/Argument.java
index b5fea0b..cf52e26 100644
--- a/src/main/java/com/android/tools/r8/ir/code/Argument.java
+++ b/src/main/java/com/android/tools/r8/ir/code/Argument.java
@@ -94,7 +94,7 @@
 
   @Override
   public TypeLatticeElement evaluate(AppInfo appInfo) {
-    return outValue.getTypeLatticeRaw();
+    return outValue.getTypeLattice();
   }
 
   @Override
diff --git a/src/main/java/com/android/tools/r8/ir/code/ArrayGet.java b/src/main/java/com/android/tools/r8/ir/code/ArrayGet.java
index 14e1cc3..4254eef 100644
--- a/src/main/java/com/android/tools/r8/ir/code/ArrayGet.java
+++ b/src/main/java/com/android/tools/r8/ir/code/ArrayGet.java
@@ -167,7 +167,7 @@
 
   @Override
   public TypeLatticeElement evaluate(AppInfo appInfo) {
-    return array().getTypeLatticeRaw().arrayGet(appInfo);
+    return array().getTypeLattice().arrayGet(appInfo);
   }
 
   @Override
diff --git a/src/main/java/com/android/tools/r8/ir/code/Binop.java b/src/main/java/com/android/tools/r8/ir/code/Binop.java
index 94e18dd..0c14e1b 100644
--- a/src/main/java/com/android/tools/r8/ir/code/Binop.java
+++ b/src/main/java/com/android/tools/r8/ir/code/Binop.java
@@ -137,7 +137,7 @@
   @Override
   public TypeLatticeElement evaluate(AppInfo appInfo) {
     return PrimitiveTypeLatticeElement.meet(
-        leftValue().getTypeLatticeRaw(), rightValue().getTypeLatticeRaw());
+        leftValue().getTypeLattice(), rightValue().getTypeLattice());
   }
 
   @Override
diff --git a/src/main/java/com/android/tools/r8/ir/code/CheckCast.java b/src/main/java/com/android/tools/r8/ir/code/CheckCast.java
index b1d16b9..4c1824b 100644
--- a/src/main/java/com/android/tools/r8/ir/code/CheckCast.java
+++ b/src/main/java/com/android/tools/r8/ir/code/CheckCast.java
@@ -119,7 +119,7 @@
 
   @Override
   public TypeLatticeElement evaluate(AppInfo appInfo) {
-    return object().getTypeLatticeRaw().checkCast(appInfo, type);
+    return object().getTypeLattice().checkCast(appInfo, type);
   }
 
   @Override
diff --git a/src/main/java/com/android/tools/r8/ir/code/Load.java b/src/main/java/com/android/tools/r8/ir/code/Load.java
index 3d566c3..4a6817f 100644
--- a/src/main/java/com/android/tools/r8/ir/code/Load.java
+++ b/src/main/java/com/android/tools/r8/ir/code/Load.java
@@ -85,7 +85,7 @@
 
   @Override
   public TypeLatticeElement evaluate(AppInfo appInfo) {
-    return src().getTypeLatticeRaw();
+    return src().getTypeLattice();
   }
 
   @Override
diff --git a/src/main/java/com/android/tools/r8/ir/code/Move.java b/src/main/java/com/android/tools/r8/ir/code/Move.java
index c6cda18..7c9dcca 100644
--- a/src/main/java/com/android/tools/r8/ir/code/Move.java
+++ b/src/main/java/com/android/tools/r8/ir/code/Move.java
@@ -106,7 +106,7 @@
 
   @Override
   public TypeLatticeElement evaluate(AppInfo appInfo) {
-    return src().getTypeLatticeRaw();
+    return src().getTypeLattice();
   }
 
   @Override
diff --git a/src/main/java/com/android/tools/r8/ir/code/NonNull.java b/src/main/java/com/android/tools/r8/ir/code/NonNull.java
index b2942d9..17bd113 100644
--- a/src/main/java/com/android/tools/r8/ir/code/NonNull.java
+++ b/src/main/java/com/android/tools/r8/ir/code/NonNull.java
@@ -91,7 +91,7 @@
 
   @Override
   public TypeLatticeElement evaluate(AppInfo appInfo) {
-    return src().getTypeLatticeRaw().asNonNullable();
+    return src().getTypeLattice().asNonNullable();
   }
 
   @Override
diff --git a/src/main/java/com/android/tools/r8/ir/code/Store.java b/src/main/java/com/android/tools/r8/ir/code/Store.java
index a8f97f4..1e71f1e 100644
--- a/src/main/java/com/android/tools/r8/ir/code/Store.java
+++ b/src/main/java/com/android/tools/r8/ir/code/Store.java
@@ -86,7 +86,7 @@
 
   @Override
   public TypeLatticeElement evaluate(AppInfo appInfo) {
-    return src().getTypeLatticeRaw();
+    return src().getTypeLattice();
   }
 
   @Override
diff --git a/src/main/java/com/android/tools/r8/ir/code/Unop.java b/src/main/java/com/android/tools/r8/ir/code/Unop.java
index 15ae845..5ac4668 100644
--- a/src/main/java/com/android/tools/r8/ir/code/Unop.java
+++ b/src/main/java/com/android/tools/r8/ir/code/Unop.java
@@ -59,7 +59,7 @@
 
   @Override
   public TypeLatticeElement evaluate(AppInfo appInfo) {
-    return source().getTypeLatticeRaw();
+    return source().getTypeLattice();
   }
 
   @Override
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 96f765f..48b8f5b 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.DebugLocalInfo;
 import com.android.tools.r8.graph.DexMethod;
 import com.android.tools.r8.ir.analysis.type.BottomTypeLatticeElement;
-import com.android.tools.r8.ir.analysis.type.TopTypeLatticeElement;
 import com.android.tools.r8.ir.analysis.type.TypeLatticeElement;
 import com.android.tools.r8.ir.regalloc.LiveIntervals;
 import com.android.tools.r8.origin.Origin;
@@ -762,14 +761,7 @@
     typeLattice = newType;
   }
 
-  // TODO(b/72693244): At the end, both type analysis and optimizations use the same accessor.
-  public TypeLatticeElement getTypeLatticeRaw() {
-    // Type analysis and update should use this to reflect the type lattice as-is.
-    return typeLattice;
-  }
-
   public TypeLatticeElement getTypeLattice() {
-    // Optimizations should use this to regard an uninitialized type lattice as the Top.
-    return typeLattice.isBottom() ? TopTypeLatticeElement.getInstance() : typeLattice;
+    return typeLattice;
   }
 }
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 4bc7f71..09ec561 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
@@ -1659,7 +1659,8 @@
       }
 
       TypeLatticeElement inTypeLattice = inValue.getTypeLattice();
-      if (!inTypeLattice.isTop()) {
+      // TODO(b/72693244): Soon, there won't be a value with Bottom at this point.
+      if (!inTypeLattice.isBottom()) {
         TypeLatticeElement outTypeLattice = outValue.getTypeLattice();
         TypeLatticeElement castTypeLattice =
             TypeLatticeElement.fromDexType(appInfo, castType, inTypeLattice.isNullable());
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/Devirtualizer.java b/src/main/java/com/android/tools/r8/ir/optimize/Devirtualizer.java
index 6d5aee1..9f57e52 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/Devirtualizer.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/Devirtualizer.java
@@ -114,7 +114,8 @@
           // Avoid adding trivial cast and up-cast.
           // We should not use strictlyLessThan(castType, receiverType), which detects downcast,
           // due to side-casts, e.g., A (unused) < I, B < I, and cast from A to B.
-          if (receiverTypeLattice.isTop()
+          // TODO(b/72693244): Soon, there won't be a value with Bottom at this point.
+          if (receiverTypeLattice.isBottom()
               || !TypeLatticeElement.lessThanOrEqual(
                   appInfo, receiverTypeLattice, castTypeLattice)) {
             Value newReceiver = null;